我们有一个典型的nginx + nodejs设置,节点为v4.2.2& nginx v1.9.7.2
在express / nodejs上运行的后端服务应用程序使用recluster module以群集模式部署,子进程(等于#cores)分叉侦听同一端口。 nginx用作后端的反向代理。 nginx + nodejs的每个这样的实例/盒子(4核8 gb)在加载时服务大约100 tps,延迟大约120毫秒的90%。
问题是我们在nginx访问日志和相关的错误日志显示中很少见到(每5分钟1-2次)504s
(110: Connection timed out) while connecting to upstream
据我所知,当nginx timedout与nodejs服务器建立连接但是所有矩阵显示nodejs都是健康的时候会发生这种情况。此外,低于此错误的所有请求都有正常的延迟,只有一个关闭请求被卡住。在nodejs服务器上没有相应的日志条目意味着请求永远不会到达节点服务器。
下面的相关nginx配置。
worker_processes auto;
worker_rlimit_nofile 40000;
events {
worker_connections 2000;
use epoll;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
}
upstream node {
server 127.0.0.1:3000;
keepalive 256;
}
server {
listen 80;
server_name abc.com
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_read_timeout 60;
location / {
proxy_pass http://node;
}
}
输出到ss -s是
Total: 747 (kernel 0)
TCP: 7400 (estab 481, closed 6890, orphaned 0, synrecv 0, timewait
6890/0), ports 0
它显示高时间套接字但我们没有看到syslog中的任何错误意味着未达到操作系统的限制。
我试过调整网络和nginx主要是从blog post获取线索而没有运气。 在论坛中需要帮助以获得调试此方法的正确方向。让我知道我可以提供更多信息。