Node.js 重新启动时,为什么我的NGINX到pm2上游速度慢?

Node.js 重新启动时,为什么我的NGINX到pm2上游速度慢?,node.js,nginx,pm2,Node.js,Nginx,Pm2,我运行一个家庭服务器,nginx反向代理到Node.js/PM2上游。正常情况下,它工作得很好。但是,当我想进行更改时,我会运行pm2 reload pname或pm2 restart pname,这会导致nginx在找到新的上游之前抛出502坏网关约10-20秒 我的Node.js应用程序启动得非常快,我99%确信上游启动并绑定到端口不会花费那么长时间(当我不使用nginx层时,它可以立即访问)。如何消除nginx解决问题所需的额外时间 从nginx/error.log: 2021/01/29

我运行一个家庭服务器,nginx反向代理到Node.js/PM2上游。正常情况下,它工作得很好。但是,当我想进行更改时,我会运行
pm2 reload pname
pm2 restart pname
,这会导致nginx在找到新的上游之前抛出
502坏网关约10-20秒

我的Node.js应用程序启动得非常快,我99%确信上游启动并绑定到端口不会花费那么长时间(当我不使用nginx层时,它可以立即访问)。如何消除nginx解决问题所需的额外时间

从nginx/error.log:

2021/01/29 17:50:35 [error] 18462#0: *85 no live upstreams while connecting to upstream, client: [ip], server: hostname.com, request: "GET /path HTTP/1.1", upstream: "http://localhost/path", host: "www.hostname.com"
从我的nginx域配置:

server {
        listen 80;
        server_name hostname.com www.hostname.com;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        server_name hostname.com www.hostname.com;
        # ...removed ssl stuff...
        gzip_types      text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
        gzip_proxied    no-cache no-store private expired auth;
        gzip_min_length 1000;
        location /  {
                proxy_pass    http://localhost:3010;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_read_timeout 240s;
        }
}

这是由上游的默认行为引起的,这可能并不明显,因为您没有使用
upstream
指令显式声明上游。带有
上游
指令的配置如下所示:

upstream backend {
        server localhost:3010;
}

...

server {
        listen 443 ssl;
        ...
        location /  {
                proxy_pass    http://backend;
                ...
        }
}
在这种形式下,很明显您只是依赖于
服务器
指令的默认选项。
server
指令有许多选项,但其中两个在这里很重要:
max\u fails
fail\u timeout
。这些选项控制故障状态以及nginx应如何处理它们。默认情况下,
max_fails=1
fail_timeout=10秒
,这意味着在一次与上游nginx通信的尝试失败后,nginx将等待10秒,然后再次尝试

要在您的环境中避免这种情况,您可以通过设置
max\u fails=0来禁用这种机制:

upstream backend {
        server localhost:3010 max_fails=0;
}

我观察到我们的nginx/node组合有类似的行为。虽然工作人员在几秒钟内快速重启,但发送到前端的请求却会延迟一分钟左右,直到一切恢复正常。我们已经尝试手动告诉nginx,在重启过程中工作进程已停止,但没有任何帮助。可能对解决方案感兴趣。您是否尝试过在节点工作程序重新启动后立即跳转ngnix服务器?如果您使用的是Ubuntu,则需要
sudo systemctl restart nginx
来执行此操作。请参阅上的
fail\u timeout
选项,它似乎描述了您遇到的行为。