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

时间:2013-09-11 12:01:33

标签: nginx timeout puma

我将Puma作为上游应用服务器运行,将Riak作为后台数据库集群运行。当我发送一个请求,map - 减少大约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有一堆超时指令。我不知道我是否遗漏了一些重要的东西。任何帮助都将受到高度赞赏....

13 个答案:

答案 0 :(得分:23)

你应该总是避免增加超时,我怀疑你的后端服务器响应时间在任何情况下都是这个问题。

我通过清除连接保持活动标志并根据答案指定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 :(得分:18)

这是因为你的上游需要太多才能回答请求,NGINX认为上游已经在处理请求时失败,因此它会响应错误。 只需在location中包含并增加proxy_read_timeout即可。 同样的事情发生在我身上,我在工作中使用内部应用程序超时1小时:

proxy_read_timeout 3600;

有了这个,NGINX将等待一小时让其上游返回一些东西。

答案 2 :(得分:13)

首先通过查阅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;
     ...
 }

请参阅:original post

答案 3 :(得分:8)

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

答案 4 :(得分:7)

在您的情况下,它有助于代理中的一些优化,或者您可以使用“#time out settings”

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;
}

答案 5 :(得分:6)

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

然后根据你可以调整proxy_read_timeout fastcgi_read_timeout或uwsgi_read_timeout。

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

此处有更多详情Nginx upstream timed out (why and how to fix)

答案 6 :(得分:0)

从我们这边使用spdy和代理缓存。当缓存过期时,我们会收到此错误,直到缓存更新为止。

答案 7 :(得分:0)

我遇到了同样的问题,导致每天都是#34;" rails控制器中的错误。我不知道为什么,但在生产中,puma会一次又一次地运行错误导致消息:

从上游读取响应头时

上游超时(110:连接超时)

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

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

答案 8 :(得分:0)

希望它可以帮助某人: 我遇到了这个错误,原因是更改了phpfpm的日志文件夹后对phpfpm的权限错误,因此phpfpm可以对其进行写入,一切都很好。

答案 9 :(得分:0)

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

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

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

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

答案 10 :(得分:0)

对于proxy_upstream超时,我尝试了上述设置,但这些无效。

设置resolver_timeout对我有用,因为它知道花费30秒才能产生上游超时消息,例如me.atwibble.com无法解决(110:操作超时)。

http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver_timeout

答案 11 :(得分:0)

还请检查上游服务器的 keepalive_timeout

我遇到了类似的问题:随机 502,nginx 日志中有 Connection reset by peer 错误,发生在服务器负载过重时。最终发现它是由 nginx' 和上游(在我的例子中是 gunicorn)keepalive_timeout 值之间的不匹配引起的。 Nginx 是 75 秒,上游只有几秒钟。这导致上游有时会陷入超时并掉线,而nginx不明白为什么。

提高上游服务器值以匹配 nginx' 解决了这个问题。

答案 12 :(得分:-1)

在location或nginx.conf中新增一行配置,例如: proxy_read_timeout 900s;