【发布时间】:2017-09-30 08:19:03
【问题描述】:
我们有 2 台服务器(Ubuntu 14.04 - 4vCPU 和 12 GB RAM),运行带有 Apache 2.4.7 的 codeigniter 应用程序。这些服务器也是负载平衡的。我们平均有 300 名用户一次访问该网站,并且该网站在许多领域都具有刷新功能。所以我们引入了 websockets 来减少负载。但即使在引入之后,我们也面临着高负载。节点正在其中一台服务器上运行。启用 mod_status 后,我可以看到没有为 apache 打开新连接。
虚拟主机
<VirtualHost *:443>
ServerName domain.com
ServerAlias www.domain.com
DocumentRoot /var/www/html/domain
SSLEngine on
SSLProxyEngine On
SSLCertificateFile /etc/apache2/ssl/domain-ssl/a.crt
SSLCertificateKeyFile /etc/apache2/ssl/domain-ssl/domain.key
SSLCertificateChainFile /etc/apache2/ssl/domain-ssl/gd_bundle.crt
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/node/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule "^/node/socket.io" "ws://IPADDRESS:8080/socket.io/" [P,L]
ProxyPreserveHost On
ProxyRequests off
</VirtualHost>
<Location /node/>
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
ProxyPass http://IPADDRESS:8080/ connectiontimeout=3 timeout=3 retry=0
ProxyPassReverse http://IPADDRESS:8080/
</Location>
请告诉我您需要对此进行调查的详细信息。谢谢
【问题讨论】:
-
在您的文本中,您描述了 2 个问题。 a)高负载 b)“没有为 apache 打开新连接” 高负载通常是类似于编程的事情,取决于您的应用程序。另一个问题可能是并发连接的限制(apache 和 unix 有这个限制,默认情况下 unix 大约有 128 个连接)
-
由于没有新的插槽,队列中可能有许多挂起的连接,这会导致高负载对吧?我们尝试增加这些值 /etc/sysctl.conf fs.file-max = 1000000 fs.nr_open = 1000000 net.ipv4.netfilter.ip_conntrack_max = 1048576 net.nf_conntrack_max = 1048576
-
实际上恰恰相反。一个不能足够快地处理请求的坏应用程序有时会用完打开的连接槽。如果连接量超过 unix 限制,那么它会立即下降,甚至在它到达 apache 网络服务器之前也不应该造成任何负载,因此您也不会在任何 apache 日志中看到它们。如果你运行“top”,你会在顶部看到什么?我猜是节点?所以你的节点应用程序在某个地方有问题。
标签: node.js apache websocket server-load