Ошибка 504 Gateway Timeout в Nginx означает, что сервер, на котором работает Nginx, не смог получить ответ от прокси-сервера в установленный период времени. Это обычно происходит из-за того, что прокси-сервер не может обработать запрос в течение заданного времени или из-за проблем с соединением между Nginx и прокси-сервером.
Ошибка возникает, когда сервер Nginx работает в режиме прокси. Так случается в случае применения php-fpm или Apache. Если перевести с английского на русский, получим следующее - превышено время ожидания ответа от сервера.
Несколько причин такого поведения:
Теперь поговорим, что же можно сделать и как устранить ошибку 504 Gateway Timeout.
Первое, что следует попробовать на практике - если вашему серверу, php-fpm или apache не хватает ресурсов системы, например, памяти или процессора, посмотрите свободную ОЗУ с помощью команды free:
Нагрузку на процессор можно узнать командой 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:
Другая причина и её решение, если скрипт завис. Если вы сами запускаете скрипт, то сразу увидите что зависло, но если такая ошибка встречается у пользователей, то это уже более серьезная проблема. Вы можете посмотреть встречаются ли вашим пользователям такие ошибки и где они встречаются с помощью команды:
Более подробную информацию иногда можно увидеть в 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
На этом инструкция завершена.