NGINX:上游超时(110:连接超时),同时从上游读取响应头


130

我让Puma作为上游应用程序服务器运行,而Riak作为我的后台数据库集群。当我发送一个请求以减少约25K用户的数据块并将其从Riak返回到应用程序时,在Nginx日志中出现错误:

从上游读取响应标头时上游超时(110:连接超时)

如果我在没有nginx代理的情况下直接查询我的上游,并且请求相同,则会获得所需的数据。

一旦放置代理,就会发生Nginx超时。

**nginx.conf**

http {
    keepalive_timeout 10m;
    proxy_connect_timeout  600s;
    proxy_send_timeout  600s;
    proxy_read_timeout  600s;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;
    include /etc/nginx/sites-enabled/*.conf;
}

**virtual host conf**

upstream ss_api {
  server 127.0.0.1:3000 max_fails=0  fail_timeout=600;
}

server {
  listen 81;
  server_name xxxxx.com; # change to match your URL

  location / {
    # match the name of upstream directive which is defined above
    proxy_pass http://ss_api; 
    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cache cloud;
    proxy_cache_valid  200 302  60m;
    proxy_cache_valid  404      1m;
    proxy_cache_bypass $http_authorization;
    proxy_cache_bypass http://ss_api/account/;
    add_header X-Cache-Status $upstream_cache_status;
  }
}

Nginx有很多超时指令。我不知道我是否缺少重要的东西。任何帮助将不胜感激....


它应该仅在600s之后超时吗?您可以通过在127.0.0.1:3000上设置一个tcp服务器来伪造它的时间,该tcp服务器仅接受连接并且不对其进行任何操作,以查看需要花费多长时间。应该是600

Answers:


46

发生这种情况是因为您的上游需要太多时间来回答请求,而NGINX认为上游已经无法处理该请求,因此它以错误进行响应。只需在location配置块中包含并增加proxy_read_timeout即可。我也发生了同样的事情,我在工作中使用一个内部应用程序超时时间为1小时:

proxy_read_timeout 3600;

这样,NGINX将等待一个小时(3600秒)以使其上游返回内容。


6
注意,具有proxy_read_timeoutHTTP部分可能没有帮助。我proxy_passlocation部分有指令,只有在那里proxy_read_timeout设置有所不同。(nginx 1.16.0)
JonnyJD

似乎对我来说在http / server / location工作...也许情况已经改变了:)
rogerdpack

39

您应该始终避免增加超时,无论如何我都怀疑您的后端服务器响应时间是问题所在。

我通过清除连接保持活动标志并根据此处的答案指定http版本来解决此问题:https : //stackoverflow.com/a/36589120/479632

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;

        # these two lines here
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_pass http://localhost:5000;
    }
}

不幸的是,我无法解释为什么这样有效,也无法从链接的答案中提到的文档中解译出来,因此,如果有人有解释,我将非常有兴趣听到。


1
proxy_read_timeout如果您知道代理服务器(即使对于特定的URL)需要更多的处理时间,为什么不调整?
Josh M.

嗨!我不再记得确切的问题了,但是我认为这与URL的实际时间无关,而是没有这些设置,超时没有得到正确的处理。
Almund,

@magicbacon这是几年前的事情,所以我几乎再也没有记住此案了,但是,您更改了$http_host权利吗?我猜这不会飞到https。可能还需要其他设置来代理https请求。
阿尔蒙德

+1 ...这看起来有点尴尬,但实际上这是来自官方文档:) nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive我有一个稍微不同的问题“读取响应时上游过早关闭了连接当我将上游指令与keepalive一起使用时,使用这两行似乎可以解决该问题。
Karussell

1
@TimDavis我明白了,也许更好。我猜它可能在这个岗位依赖于流量,例如说这是需要的WebSockets:serverlab.ca/tutorials/linux/web-servers-linux/...
Almund

26

首先通过查询nginx错误日志文件确定哪个上游速度变慢,并在我的情况下相应地调整读取超时为fastCGI

2017/09/27 13:34:03 [error] 16559#16559: *14381 upstream timed out (110: Connection timed out) while reading response header from upstream, client:xxxxxxxxxxxxxxxxxxxxxxxxx", upstream: "fastcgi://unix:/var/run/php/php5.6-fpm.sock", host: "xxxxxxxxxxxxxxx", referrer: "xxxxxxxxxxxxxxxxxxxx"

所以我必须在服务器配置中调整fastcgi_read_timeout

 location ~ \.php$ {
     fastcgi_read_timeout 240;
     ...
 }

请参阅:原始帖子


这里有一个方法来添加定时信息的失败,看看有多少你“需要”增加至:stackoverflow.com/questions/18627469/... FWIW
rogerdpack

10

在您的情况下,它有助于对代理进行一些优化,或者您可以使用“#超时设置”

location / 
{        

  # time out settings
  proxy_connect_timeout 159s;
  proxy_send_timeout   600;
  proxy_read_timeout   600;
  proxy_buffer_size    64k;
  proxy_buffers     16 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
  proxy_pass_header Set-Cookie;
  proxy_redirect     off;
  proxy_hide_header  Vary;
  proxy_set_header   Accept-Encoding '';
  proxy_ignore_headers Cache-Control Expires;
  proxy_set_header   Referer $http_referer;
  proxy_set_header   Host   $host;
  proxy_set_header   Cookie $http_cookie;
  proxy_set_header   X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

对我来说,在位置部分中进行这些设置确实有所不同。在http部分中放置它们没有帮助(可能是因为我也在location部分proxy_pass中使用了
。– JonnyJD

使用这些声明,您究竟要优化什么?
弗拉德

9

我认为可能由于多种原因会发生此错误,但它可能特定于您使用的模块。例如,我使用uwsgi模块看到了它,因此必须设置“ uwsgi_read_timeout”。


2
我认为uwsgi_read_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; 为我工作。
tyan

9

我建议您看一下error_logs,特别是在上游部分,它显示了正在超时的特定上游。

然后,您可以据此进行调整proxy_read_timeoutfastcgi_read_timeoutuwsgi_read_timeout

还要确保您的配置已加载。

这里有更多详细信息Nginx上游超时(为什么以及如何修复)


4

正如许多其他人在这里指出的那样,增加NGINX的超时设置可以解决您的问题。

但是,增加超时设置可能并不像许多答案所示的那么简单。我自己遇到了这个问题,并试图更改/etc/nginx/nginx.conf文件中的超时设置,正如这些线程中几乎每个人所建议的那样。这一点也帮不了我;NGINX的超时设置没有明显变化。现在,几个小时后,我终于设法解决了这个问题。

解决方案位于该论坛线程中,它的意思是您应该将超时设置放在/etc/nginx/conf.d/timeout.conf中(如果此文件不存在,则应创建它)。我使用了与线程建议相同的设置:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

1

我遇到了同样的问题,结果是Rails控制器出现“每天”错误。我不知道为什么,但是在生产中,puma一次又一次地运行错误,并导致出现以下消息:

从上游读取响应标头时上游超时(110:连接超时)

可能是因为Nginx试图一次又一次地从puma中获取数据。有趣的是,即使我在控制器中调用其他操作,该错误也会导致超时消息,因此,一个错字会阻止所有应用程序。

检查您的log / puma.stderr.log文件以查看是否存在这种情况。


0

从我们的角度来看,它使用了带有代理缓存的spdy。当缓存过期时,我们将收到此错误,直到更新缓存为止。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.