Node.js 带有节点JS和套接字IO的Apache反向代理产生了大量httpd_预工作进程
我尝试用APACHE为我的节点JS应用程序设置反向代理,它使用Socket IO(并且用膝关节炎V1.x编写)。 如果我不使用Socket IO,这将非常有效;但是当我使用它的时候,我遇到了一个大问题,Apache产生了大量http_预工作进程——到了这样的程度,它将它们最大化了(我的配置是150),Apache将永远挂起,直到我重新启动它 我的直觉是Socket IO保持进程打开,所以当我的应用程序获得超过150个连接时,它会心烦意乱并挂起——这让我相信我做错了什么 是否有其他人遇到过与我相同的问题,如果是,是可以解决的,还是我只是无限期地增加了最大数量的预工作进程(感觉不对) 我通常会将Ngnix用于反向代理——根据我的经验,它似乎发挥得更好(而且我没有遇到这个问题)——但不幸的是,在我的应用程序运行的服务器上安装它是不可能的 以下是我的apache配置的一部分:Node.js 带有节点JS和套接字IO的Apache反向代理产生了大量httpd_预工作进程,node.js,apache,socket.io,reverse-proxy,Node.js,Apache,Socket.io,Reverse Proxy,我尝试用APACHE为我的节点JS应用程序设置反向代理,它使用Socket IO(并且用膝关节炎V1.x编写)。 如果我不使用Socket IO,这将非常有效;但是当我使用它的时候,我遇到了一个大问题,Apache产生了大量http_预工作进程——到了这样的程度,它将它们最大化了(我的配置是150),Apache将永远挂起,直到我重新启动它 我的直觉是Socket IO保持进程打开,所以当我的应用程序获得超过150个连接时,它会心烦意乱并挂起——这让我相信我做错了什么 是否有其他人遇到过与我相同
ProxyRequests off
ProxyPreserveHost on
RewriteEngine on
RewriteCond %{QUERY_STRING} transport=polling [NC]
RewriteRule /(.*) http://localhost:5000/$1 [P]
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteRule /(.*) ws://localhost:5000/$1 [P]
ProxyPass /my-app/ http://localhost:5000/
ProxyPassReverse /my-app/ http://localhost:5000/
# Redirect to fully-qualified domain name for HTTPS
Redirect permanent /my-app https://[fqdn]/my-app/
这是我的膝关节炎应用程序的两个片段,以及我如何使用Socket IO。
我已经删除了一些部分,以避免过于复杂,但如果需要,可以包括更多
app.js
'use strict';
const app = koa();
const server = http.createServer(app.callback()).listen(process.env.PORT || 5000, => {
console.log('HTTP Server started...');
const io = require('./io')(server);
});
module.exports = (server) => {
const io = require("socket.io")(server);
// Catch errors
io.on("error", (err) => {
console.error(err);
});
// On connection
io.on("connection", (socket) => {
console.log("[SOCKET IO]: A user has connected with ID:", socket.id);
// Join a room event with callback emit of 'room-joined'
socket.on('join-room', (roomName) => {
console.log(`A user is joining a room with the name ${roomName}`);
socket.join(roomName);
socket.emit('room-joined', roomName);
});
});
io.js
'use strict';
const app = koa();
const server = http.createServer(app.callback()).listen(process.env.PORT || 5000, => {
console.log('HTTP Server started...');
const io = require('./io')(server);
});
module.exports = (server) => {
const io = require("socket.io")(server);
// Catch errors
io.on("error", (err) => {
console.error(err);
});
// On connection
io.on("connection", (socket) => {
console.log("[SOCKET IO]: A user has connected with ID:", socket.id);
// Join a room event with callback emit of 'room-joined'
socket.on('join-room', (roomName) => {
console.log(`A user is joining a room with the name ${roomName}`);
socket.join(roomName);
socket.emit('room-joined', roomName);
});
});
socket.io
的首选传输是WebSocket,它保持与服务器的持久连接。在我看来,prefork
MPM不适合处理这个问题,您可能应该查看其他MPM之一。谢谢@robertklep,您能建议我尝试哪种MPM吗,例如Worker?我不是一个apache向导-只是摸索着通过!我看过这篇关于ServerFault的文章,我不确定我能尝试什么。Apache不是我要做的正确选择吗?再次感谢。我自己已经很久没有使用Apache了(我更喜欢nginx),但是看看那篇文章,我认为事件MPM最适合你正在尝试做的事情。请注意,使用事件MPM还有另一个不好的缺点-如果任何socket.io线程仍然“未完成”,那么worker将不会停止存在(停止自身)并挂起,在apache完全重启之前,我现在正试图找到解决这个bug/特性的方法