Nginx proxy_read_timeout与proxy_connect_timeout

Modified on: Sat, 10 Aug 2019 04:20:02 +0800

我已经开始使用Nginx作为提供某种服务的一组服务器的反向代理。

服务有时可能相当慢(它在Java上运行,而JVM有时会陷入“完全垃圾收集”,可能需要几秒钟),因此我将proxy_connect_timeout设置为2秒,这将使Nginx有足够的时间来判断服务是否停留在GC上并且不会及时响应,它应该将请求传递给其他服务器。

我还设置了proxy_read_timeout,以防止反向代理被卡住,如果服务本身花费太多时间来计算响应 - 再次,它应该将请求移动到应该是另一台服务器足够自由地及时回复。

我已经运行了一些基准测试,我可以清楚地看到proxy_connect_timeout正常工作,因为有些请求完全按照为连接超时指定的时间返回,因为服务卡住但不接受传入连接(该服务使用Jetty作为嵌入式servlet容器)。 proxy_read_timeout也可以,因为我可以看到在那里指定的超时后返回的请求。

问题是我希望看到一些请求在proxy_read_timeout + proxy_connect_timeout之后超时,或者几乎是那么长的时间,如果服务被卡住并且在Nginx尝试时不接受连接要访问它,但在Nginx超时之前 - 它会被释放并开始处理,但速度太慢而Nginx会因读取超时而中止。我相信该服务有这样的情况,但在运行了几个基准测试后,总计数百万个请求 - 我没有看到一个请求返回proxy_read_timeout之上的任何内容(这是更大的超时)。 / p>

我很感激对这个问题的任何评论,虽然我认为这可能是由于Nginx中的一个错误(我还没有查看代码,所以这只是一个假设)超时计数器没有被重置连接成功后,如果Nginx没有从上游服务器读取任何内容。

作者:Guss

最佳答案

我实际上无法重现:

2011/08/20 20:08:43 [notice] 8925#0: nginx/0.8.53
2011/08/20 20:08:43 [notice] 8925#0: built by gcc 4.1.2 20080704 (Red Hat 4.1.2-48)
2011/08/20 20:08:43 [notice] 8925#0: OS: Linux 2.6.39.1-x86_64-linode19

我在我的nginx.conf中设置了它:

proxy_connect_timeout   10;
proxy_send_timeout      15;
proxy_read_timeout      20;

然后我设置了两个测试服务器。一个只会在SYN上超时,一个会接受连接但从不响应的那个:

upstream dev_edge {
  server 127.0.0.1:2280 max_fails=0 fail_timeout=0s; # SYN timeout
  server 10.4.1.1:22 max_fails=0 fail_timeout=0s; # accept but never responds
}

然后我发送了一个测试连接:

[m4@ben conf]$ telnet localhost 2480
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
Host: localhost

HTTP/1.1 504 Gateway Time-out
Server: nginx
Date: Sun, 21 Aug 2011 03:12:03 GMT
Content-Type: text/html
Content-Length: 176
Connection: keep-alive

然后看了error_log,显示了这个:

2011/08/20 20:11:43 [error] 8927#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: 127.0.0.1, server: ben.dev.b0.lt, request: "GET / HTTP/1.1", upstream: "http://10.4.1.1:22/", host: "localhost"

然后:

2011/08/20 20:12:03 [error] 8927#0: *1 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 127.0.0.1, server: ben.dev.b0.lt, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:2280/", host: "localhost"

然后是具有预期30秒超时(10 + 20)的access.log:

504:32.931:10.003, 20.008:.:176 1 127.0.0.1 localrhost - [20/Aug/2011:20:12:03 -0700] "GET / HTTP/1.1" "-" "-" "-" dev_edge 10.4.1.1:22, 127.0.0.1:2280 -

以下是我正在使用的日志格式,其中包括各个上游超时:

log_format  edge  '$status:$request_time:$upstream_response_time:$pipe:$body_bytes_sent $connection $remote_addr $host $remote_user [$time_local] "$request" "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $edge $upstream_addr $upstream_cache_status';
作者:polynomial

相关问答

添加新评论