Подтвердить что ты не робот

NGINX: тайм-аут восходящего потока (110: время ожидания соединения) при чтении заголовка ответа от восходящего потока

У меня есть Puma, работающая как сервер приложений вверх и Riak в качестве моего фона db-кластера. Когда я отправляю запрос, который преобразует карту, уменьшает кусок данных для примерно 25 тыс. Пользователей и возвращает его из приложения Riak в приложение, я получаю сообщение об ошибке в журнале Nginx:

тайм-аут вверх (110: время ожидания подключения) при чтении ответный заголовок вверх по течению

Если я запрошу свой upstream напрямую без прокси nginx, с тем же запросом, я получу необходимые данные.

Тайм-аут Nginx возникает после ввода прокси.

**nginx.conf**

user www-data;

worker_processes 2;

pid /var/run/nginx.pid;

events {
    worker_connections 4000;
}

http {

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 10m;

    proxy_connect_timeout  600s;
    proxy_send_timeout  600s;
    proxy_read_timeout  600s;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;

    types_hash_max_size 2048;
    proxy_cache_path /opt/cloud/cache levels=1  keys_zone=cloud:10m;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";
    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

  if ($http_x_forwarded_proto != 'https') {

    return 301 https://$server_name$request_uri;

  }

  location / {

    proxy_pass http://ss_api; # match the name of upstream directive which is defined above

    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;

  }

location ~ /\. { deny  all; }

}

Nginx имеет множество директив тайм-аута. Я не знаю, не хватает ли я чего-то важного. Любая помощь будет высоко оценена....

4b9b3361

Ответ 1

Вы всегда должны воздерживаться от увеличения тайм-аутов, я сомневаюсь, что ваше время отклика на серверный сервер является проблемой здесь в любом случае.

Я обошел эту проблему, очистив флаг keep-alive подключения и указав http-версию в соответствии с ответом здесь: fooobar.com/questions/117490/...

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

К сожалению, я не могу объяснить, почему это работает, и не удалось расшифровать его из документов, упомянутых в ответе, связанных, так что, если у кого есть объяснение, мне было бы очень интересно его услышать.

Ответ 2

В вашем случае это помогает немного оптимизировать прокси-сервер, или вы можете использовать "# тайм-аут"

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

Ответ 3

Я думаю, что эта ошибка может произойти по разным причинам, но она может быть специфичной для используемого вами модуля. Например, я видел это с помощью модуля uwsgi, поэтому пришлось установить "uwsgi_read_timeout".

Ответ 4

Я бы порекомендовал посмотреть на error_logs, в частности, на восходящей части, где он показывает определенный выход, который отключен.

Затем на основе этого вы можете настроить proxy_read_timeout fastcgi_read_timeout или uwsgi_read_timeout.

Также убедитесь, что ваша конфигурация загружена.

Подробнее здесь Nginx upstream тайм-аут (почему и как исправить)

Ответ 5

Сначала выясните, какой вверх по потоку замедляется, консультируясь с журналом ошибок 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;
            ............
    }
................................

Смотрите: оригинальное сообщение

Ответ 7

Это происходит потому, что ваш восходящий поток слишком сильно реагирует на запрос, и NGINX считает, что восходящий поток уже не прошел обработку запроса, поэтому он отвечает на ошибку. Просто включите и увеличьте proxy_read_timeout в местоположении. То же самое произошло со мной, и я использовал тайм-аут 1 часа для внутреннего приложения на работе:

proxy_read_timeout 3600;

При этом NGINX будет ждать часа, пока его восходящий поток ничего не вернет.

Ответ 8

С нашей стороны он использовал spdy с прокси-кешем. Когда кеш истекает, мы получаем эту ошибку до тех пор, пока кеш не будет обновлен.

Ответ 9

У меня была такая же проблема, и это привело к ошибке "каждый день" в контроллере rails. Я не знаю почему, но при производстве puma снова и снова вызывает ошибку:

тайм-аут upstream (110: время ожидания соединения) при чтении заголовка ответа вверх по течению

Вероятно, потому что Nginx пытается получить данные из puma снова и снова. Самое смешное, что ошибка вызвала сообщение о тайм-ауте, даже если я вызываю другое действие в контроллере, поэтому одна опечатка блокирует все приложение,

Проверьте файл журнала /puma.stderr.log, чтобы убедиться, что это так.