Способы оплаты Abuse

Исправляем 504 gateway time out Nginx

20.02.2024, 23:31

Ошибка 504 Gateway Timeout в Nginx означает, что сервер, на котором работает Nginx, не смог получить ответ от прокси-сервера в установленный период времени. Это обычно происходит из-за того, что прокси-сервер не может обработать запрос в течение заданного времени или из-за проблем с соединением между Nginx и прокси-сервером.

Почему появляется 504 Gateway Timeout

Ошибка возникает, когда сервер Nginx работает в режиме прокси. Так случается в случае применения php-fpm или Apache. Если перевести с английского на русский, получим следующее - превышено время ожидания ответа от сервера. 

Несколько причин такого поведения:

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

Теперь поговорим, что же можно сделать и как устранить ошибку 504 Gateway Timeout.

Как исправить 504 gateway time out Nginx?

Первое, что следует попробовать на практике - если вашему серверу, php-fpm или apache не хватает ресурсов системы, например, памяти или процессора, посмотрите свободную ОЗУ с помощью команды free:

$ free -h

Нагрузку на процессор можно узнать командой htop:

$ htop

Если вы видите, что PHP занимает все процессорное время, то значит проблема в ресурсах сервера. Можно попытаться разобраться с движком сайта, оптимизировать ресурс или выбрать мощный VPS сервер.

Второй вариант - если так и было запланировано, чтобы скрипт работал долго. В таком случае нужно настроить Nginx, чтобы он дождался ответа от Apache или php-fpm. Для решения проблемы в случае с php-fpm нужно только добавить две строчки в блок настройки fastgci:

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

300 означает 300 секунд, для большинства скриптов, этого хватает, но при необходимости также не составит труда установить больше. Также ошибка 504 может возникать, когда Nginx используется в качестве прокси для Apache или любого другого веб-сервера, тогда нужно еще настроить время ожидания для прокси. 

Добавьте эти строки в секцию server:

proxy_connect_timeout 600;

proxy_send_timeout 600;

proxy_read_timeout 600;

send_timeout 600;

В данном случае имеем таймаут 600 секунд.

Теперь нам нужно перезапустить Nginx:

$ sudo systemctl restart nginx

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

$ fgrep -i " 504 " /var/log/nginx/access.log

Более подробную информацию иногда можно увидеть в error.log:

$ fgrep -i " 504 " /var/log/nginx/error.log

Дальше, если проблема именно в php-fpm, вы можете отследить какие скрипты выполняются медленно с помощью встроенной функции slow-log.

Для ее активации добавьте следующие строки в конфигурацию вашего пула:

$ sudo vi /etc/php-fpm.d/www.conf
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s

На этом инструкция завершена.