Node.js 带有节点JS和套接字IO的Apache反向代理产生了大量httpd_预工作进程

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个连接时,它会心烦意乱并挂起——这让我相信我做错了什么 是否有其他人遇到过与我相同

我尝试用APACHE为我的节点JS应用程序设置反向代理,它使用Socket IO(并且用膝关节炎V1.x编写)。 如果我不使用Socket IO,这将非常有效;但是当我使用它的时候,我遇到了一个大问题,Apache产生了大量http_预工作进程——到了这样的程度,它将它们最大化了(我的配置是150),Apache将永远挂起,直到我重新启动它

我的直觉是Socket IO保持进程打开,所以当我的应用程序获得超过150个连接时,它会心烦意乱并挂起——这让我相信我做错了什么

是否有其他人遇到过与我相同的问题,如果是,是可以解决的,还是我只是无限期地增加了最大数量的预工作进程(感觉不对)

我通常会将Ngnix用于反向代理——根据我的经验,它似乎发挥得更好(而且我没有遇到这个问题)——但不幸的是,在我的应用程序运行的服务器上安装它是不可能的

以下是我的apache配置的一部分:

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/特性的方法