在 运行 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 错误。

我所做的是:

  1. 从 Nginx 配置文件中删除了所有与乘客相关的配置指令
  2. 独立启动乘客:passenger start --port 4000 -a 127.0.0.1 --user myapp /home/myapp/path #(您可能在此处为您的应用程序设置了一些自定义指令)
  3. 已将 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 启动它,但我猜这超出了这个问题的范围。