我在后端(Rails with Puma)有一个绑定到 unix 套接字的应用程序服务器 这是 nginx 配置的相关部分
location /live/ {
proxy_pass http://app; # match the name of upstream directive which is defined above
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_set_header Connection 'Upgrade';
proxy_http_version 1.1;
chunked_transfer_encoding off;
send_timeout 300;
proxy_send_timeout 300;
keepalive_timeout 7200;
}
SSE 事件通过 /live/ 传入,因此我调整了 ngix 配置来处理对此路由的所有请求。
问题是连接会在 60 秒后关闭。这是我在响应标题中看到的内容
Cache-Control:no-cache
Connection:keep-alive
Content-Type:text/event-stream
Date:Mon, 04 Nov 2013 13:41:52 GMT
Server:nginx
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-Request-Id:7065a7bc-3450-4fe2-b60c-33dfa8d41951
X-Runtime:0.010852
X-UA-Compatible:chrome=1
X-XSS-Protection:1; mode=block
所以看起来 nginx 将初始响应设置为关闭。为什么 keepalive_timeout 在这里不起作用。
在 nginx error.log 中我看到了
2013/11/04 13:42:52 [error] 3689#0: *9 upstream timed out (110: Connection timed out) while reading upstream, client: ......., server: myapp.com, request: "GET /live/events HTTP/1.1", upstream: "http://unix:/home/ubuntu/myapp/shared/sockets/puma.sock:/live/events", host: "myapp.com"
以防万一其他人遇到 Nginx + Puma + Rails 的超时错误,Nginx 中的以下配置应将超时增加到 605 秒(10 分 5 秒):
server {
# ... here goes your proxy configuration
# Avoid 504 HTTP Timeout Errors
proxy_connect_timeout 605;
proxy_send_timeout 605;
proxy_read_timeout 605;
send_timeout 605;
keepalive_timeout 605;
}
我认为您应该检查您的
proxy_connect_timeout
(默认 60 秒;))和 proxy_read_timeout
(默认 60 秒),这可能会导致此错误。您可以在这里找到文档:
https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout