Ошибка, возвращаемая web-сервером "504 gateway timeout", стала знакома многим с массовым внедрением nginx, haproxy и других proxy-серверов для web. Так же эту ошибку можно получить от обычного squid в офисе. С чем же связано появление такой ошибки?

Дело в том, что сам nginx не занимается обработкой запроса к backend, а перенаправляет(проксирует) его дальше - в php-fpm, apache, nodejs, unicorn и кучу других серверов, на которых и работает web-приложение.

nginx proxy with php-fpm

Как и всё в нашем мире, проксирование имеет свои ограничения. Нас же интересует ограничение по времени обработки запроса бакендом. Именно в ситуации медленно работающего backend "504 gateway timeout" и происходит. Nginx не дождавшись ответа отдает ошибку 504.

За это время отвечают параметры конфига nginx:

Но не спешите их увеличивать!

Если ошибки ранее не было и она появилась внезапно, дело может быть в том, что бакенд начал работать медленнее. Проверьте значения load average - возможно, возросла нагрузка и сервер просто не справляется.

Проверьте, что все сервисы доступны из php: memcached, СУБД, файловая система успешно записывает сессии (если они на диске).

Проверьте текущие запросы в СУБД (возможно, все застряло именно там):

  • show processlist - для mysql/mariadb/percona
  • select * from pg_stat_activity; - для postgres
  • Проверьте наличие deadlock в базе

Так же 504 при нормально доступном и работающем php может быть вызван "тормозами" в сети между серверами nginx, бакенда, СУБД, если они расположены на разных серверах.

Лучший способ понять, что происходит - читать логи всех задействованных узлов системы (nginx, php-fpm, СУБД, прочее) и сразу исключить рассыпавшуюся файловую систему, прочитав вывод dmesg и mount.