为什么我的 NGINX 到 pm2 upstream 重启的时候很慢?
Why is my NGINX to pm2 upstream slow when restarting?
我 运行 一个带有 nginx 反向代理到节点的家庭服务器。js/PM2 上游。通常它完美无缺。但是,当我想进行更改时,我 运行 pm2 reload pname
或 pm2 restart pname
,这导致 nginx 在找到新的上游之前抛出 502 Bad Gateway
大约 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
指令的配置如下所示:
upstream backend {
server localhost:3010;
}
...
server {
listen 443 ssl;
...
location / {
proxy_pass http://backend;
...
}
}
在这种形式中,很明显您只是依赖 server
指令的默认选项。 server
指令有很多选项,但其中两个在这里很重要:max_fails
和 fail_timeout
。这些选项控制失败状态以及 nginx 应该如何处理它们。默认情况下 max_fails=1
和 fail_timeout=10 seconds
,这意味着在一次尝试与上游 nginx 通信失败后,将等待 10 秒再尝试。
要在您的环境中避免这种情况,您可以通过设置 max_fails=0
:
来禁用此机制
upstream backend {
server localhost:3010 max_fails=0;
}
我 运行 一个带有 nginx 反向代理到节点的家庭服务器。js/PM2 上游。通常它完美无缺。但是,当我想进行更改时,我 运行 pm2 reload pname
或 pm2 restart pname
,这导致 nginx 在找到新的上游之前抛出 502 Bad Gateway
大约 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
指令的配置如下所示:
upstream backend {
server localhost:3010;
}
...
server {
listen 443 ssl;
...
location / {
proxy_pass http://backend;
...
}
}
在这种形式中,很明显您只是依赖 server
指令的默认选项。 server
指令有很多选项,但其中两个在这里很重要:max_fails
和 fail_timeout
。这些选项控制失败状态以及 nginx 应该如何处理它们。默认情况下 max_fails=1
和 fail_timeout=10 seconds
,这意味着在一次尝试与上游 nginx 通信失败后,将等待 10 秒再尝试。
要在您的环境中避免这种情况,您可以通过设置 max_fails=0
:
upstream backend {
server localhost:3010 max_fails=0;
}