在 运行 Nginx + Passenger + RoR 应用程序时优雅地重新加载 Passenger?
Reloading Passenger gracefully when running Nginx + Passenger + RoR application?
当 运行 Ruby 在 Rails 应用程序上使用 Nginx + Passenger 组合时,当我尝试重新加载 Nginx 以更新其配置时出现以下错误。
"nginx -s reload" 和 "kill -HUP NGINX_PID" 都导致相同的错误。
2019/09/04 15:00:32 [error] 5247#0: *53603 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 8.8.8.8, server: example.com, request: "GET /example/ HTTP/1.1", upstream: "passenger:unix:/var/run/passenger-instreg/passenger.hDDqk0o/agents.s/core:", host: "example.com", referrer: "https://example.com/example2"
乘客重新启动时似乎会发生这种情况。尽管它记录了以下消息:
age/Cor/CoreMain.cpp:1216 ]: Received command to shutdown gracefully. Waiting until all clients have disconnected...
看起来它没有等待,当前请求被丢弃,导致 502 错误。
当我仅使用 tmp/restart.txt 重新启动应用程序时,不会发生此问题。只有当我需要重新加载 Nginx 配置时才会发生。
有没有办法在不丢弃当前 Passenger 请求的情况下重新加载 Nginx 配置?
我是 运行 Passenger 5.3.7,Nginx 1.14.0。
我找到的唯一解决方案是 运行 Passenger standalone 并使用 Nginx 作为代理。
它需要一些配置更改,但现在我可以重新加载 Nginx,而不会丢弃任何请求或收到 502 错误。
我所做的是:
- 从 Nginx 配置文件中删除了所有与乘客相关的配置指令
- 独立启动乘客:passenger start --port 4000 -a 127.0.0.1 --user myapp /home/myapp/path #(您可能在此处为您的应用程序设置了一些自定义指令)
- 已将 Nginx 配置为代理请求
示例 Nginx 配置:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:4000;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_buffering off;
}
}
如果您希望 Passenger standalone 也响应 SSL 请求,您将必须使用 --ssl 和 --ssl-port 并且您可能想要设置某种类型或 monitoring/auto 启动它,但我猜这超出了这个问题的范围。
当 运行 Ruby 在 Rails 应用程序上使用 Nginx + Passenger 组合时,当我尝试重新加载 Nginx 以更新其配置时出现以下错误。
"nginx -s reload" 和 "kill -HUP NGINX_PID" 都导致相同的错误。
2019/09/04 15:00:32 [error] 5247#0: *53603 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 8.8.8.8, server: example.com, request: "GET /example/ HTTP/1.1", upstream: "passenger:unix:/var/run/passenger-instreg/passenger.hDDqk0o/agents.s/core:", host: "example.com", referrer: "https://example.com/example2"
乘客重新启动时似乎会发生这种情况。尽管它记录了以下消息:
age/Cor/CoreMain.cpp:1216 ]: Received command to shutdown gracefully. Waiting until all clients have disconnected...
看起来它没有等待,当前请求被丢弃,导致 502 错误。
当我仅使用 tmp/restart.txt 重新启动应用程序时,不会发生此问题。只有当我需要重新加载 Nginx 配置时才会发生。
有没有办法在不丢弃当前 Passenger 请求的情况下重新加载 Nginx 配置?
我是 运行 Passenger 5.3.7,Nginx 1.14.0。
我找到的唯一解决方案是 运行 Passenger standalone 并使用 Nginx 作为代理。
它需要一些配置更改,但现在我可以重新加载 Nginx,而不会丢弃任何请求或收到 502 错误。
我所做的是:
- 从 Nginx 配置文件中删除了所有与乘客相关的配置指令
- 独立启动乘客:passenger start --port 4000 -a 127.0.0.1 --user myapp /home/myapp/path #(您可能在此处为您的应用程序设置了一些自定义指令)
- 已将 Nginx 配置为代理请求
示例 Nginx 配置:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:4000;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_buffering off;
}
}
如果您希望 Passenger standalone 也响应 SSL 请求,您将必须使用 --ssl 和 --ssl-port 并且您可能想要设置某种类型或 monitoring/auto 启动它,但我猜这超出了这个问题的范围。