到目前为止,我有一个node.js应用程序.运行socket.io.随着用户数量的增长,它在一天中的大部分时间达到100%CPU,因此我决定将用户分成多个node.js进程.我已经拆分了我的node.js应用程序逻辑
我想使用我的8核机器的至少4个核心,所以我想运行多个node.js进程,每个进程在子域上为app提供服务.为了能够通过端口80访问所有node.js,我决定使用HAProxy.安装程序如下所示:
domain.com -> haproxy -> node on 127.0.0.1:5000 sub1.domain.com -> haproxy -> node on 127.0.0.1:5001 sub2.domain.com -> haproxy -> node on 127.0.0.1:5002 sub3.domain.com -> haproxy -> node on 127.0.0.1:5003
现在一切正常,但是应用程序的一部分(不使用socket.io)非常慢.它是使用Express.js编写的,当我直接打开页面时(即不通过HAProxy)它可以很快地工作.此外,连接到socket.io可以快速使用XHR传输,但对于Websocket传输,它还需要很长时间才能建立连接.一旦建立连接,它就能很好地运行.
我之前从未使用过HAProxy,所以我可能错误地配置了一些东西.这是我的HAProxy配置:
global maxconn 50000 daemon defaults mode http retries 1 contimeout 8000 clitimeout 120000 srvtimeout 120000 frontend http-in bind *:80 acl is_l1 hdr_end(host) -i sub1.domain.com acl is_l2 hdr_end(host) -i sub2.domain.com acl is_l3 hdr_end(host) -i sub3.domain.com acl is_l0 hdr_end(host) -i domain.com use_backend b1 if is_l1 use_backend b2 if is_l2 use_backend b3 if is_l3 use_backend b0 if is_l0 default_backend b0 backend b0 balance source option forwardfor except 127.0.0.1 # stunnel already adds the header server s1 127.0.0.1:5000 backend b1 balance source option forwardfor except 127.0.0.1 # stunnel already adds the header server s2 127.0.0.1:5001 backend b2 balance source option forwardfor except 127.0.0.1 # stunnel already adds the header server s2 127.0.0.1:5002 backend b3 balance source option forwardfor except 127.0.0.1 # stunnel already adds the header server s2 127.0.0.1:5003我想到了.我没能在文档中找到它,但全局maxconn设置不适用于前端.前端默认有2000个并发连接,超出的所有内容都排队等候.由于我有长期的socket.io连接,这就产生了问题.
解决方案是在前端部分显式设置maxconn.