Ошибка upstream timed out в Nginx и как её исправить


upstream timed out 101 — ошибка, которая возникает при превышении лимита ожидания выполнения скрипта веб-сервером. Часто при таймауте соединения клиент будет видеть 504 ошибку.



upstream timed out 110 connection timed out в Nginx


В логах ошибки будут выглядеть так:

grep 'upstream timed out' /var/log/nginx/error.log

2018/08/13 17:01:03 [error] 32147#32147: *1197966 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 123.123.123.123, server: example.com, request: «POST /api.php/shop.product.update?id=3268 HTTP/1.1», upstream: «fastcgi://unix:/var/run/php7.0-example.sock», host: «example.com»


upstream timed out в Nginx


Если такие записи появляются прежде всего нужно установить причины.

Возможны два варианта:

  • код так работать не должен — ждет ответа от какого-то недоступного ресурса или базы
  • длительное выполнение нормально в данной ситуации


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

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



Параметры значения которых нужно править зависят от сервиса, который используется на бэкенде. Это тот сервис, в который проксирует запросы Nginx и который обрабатывает скрипты.

В случае с PHP таких сервиса может быть два: PHP-FPM и Apache.



Как исправить ошибку если используется PHP-FPM


Про связку Nginx + PHP-FPM можно найти информацию в статье по ссылке

Если скрипты выполняет fpm — меняется значение параметра fastcgi_read_timeout 400; (о директиве в документации Nginx)



Значение в секундах можно значительно увеличивать, обычно достаточно 400.

location / {
index index.php;
try_files $uri $uri/ =404;

fastcgi_connect_timeout 20;
fastcgi_send_timeout 120;
fastcgi_read_timeout 400;

}

Лимит может превышаться при длительном выполнении PHP скриптов.



Как исправить ошибку если используется Apache


Материал про данную конфигурацию доступен по ссылке.

При проксировании требуется добавить директиву proxy_read_timeout 150;



Значение также как в первом случае задается в секундах и означает лимит времени между операциями чтения.

location / {
index index.php;
try_files $uri $uri/ =404;

proxy_read_timeout 150;

}



После изменения конфигурации веб-сервер требуется её перечитать командой nginx -s reload. После этого процесс увидит и начнет использовать новые параметры и значения.

Сказать спасибо