Веб-сервер Nginx часто работает не только в качестве самого веб-сервера для отдачи контента, но и в качестве прокси, когда он вступает только посредником. Такая ситуация наблюдается намного чаще, чем можно было бы ожидать. Например, при работе с php-fpm и другими модулями динамических языков.
Именно в таком режиме может наблюдаться ошибка 504 gateway time out Nginx. В нашей сегодняшней статье мы попытаемся разобраться почему она возникает и как с ней бороться. Разберем несколько способов решения и причин.
Содержание статьи
Что значит 504 gateway time out Nginx?
Как я уже сказал, такая ошибка возникает, когда сервер Nginx работает в режиме прокси. Например, при использовании php-fpm или Apache. Дословно, она означает, что превышено время ожидания ответа от сервера. В нашем случае, превышено время ожидания ответа от php-fpm. Рассмотрим несколько причин такого поведения:
- Скрипт PHP или на другом языке полностью завис и уже не вернет никакого ответа;
- Скрипт работает очень долго, но в Nginx настроен интервал на сброс соединения если целевой сервер не ответил на запрос за отведенный строк;
- Сервер перегружен и не успевает обслужить всех клиентов, вернуть ответы на все запросы Nginx;
Дальше рассмотрим что можно сделать если вы встретились с ошибкой 504 gateway time out Nginx.
Как исправить 504 gateway time out Nginx?
Самый первый вариант - это если вашему серверу, php-fpm или apache не хватает ресурсов системы, например, памяти или процессора. Вы можете посмотреть свободную память с помощью команды free:
free -h
Нагрузку на процессор можно узнать командой htop:
htop
Естественно, если вы видите, что PHP занимает все процессорное время, то значит проблема в ресурсах сервера. Вы можете покопаться в движке своего сайта, пытаться оптимизировать те или иные моменты, об этом будет отдельная статья или же выбрать более мощный VPS сервер.
Второй вариант - это если так и было запланировано, чтобы скрипт работал долго. В таком случае нужно настроить Nginx, чтобы он дождался ответа от Apache или php-fpm. Для решения проблемы в случае с php-fpm нужно только добавить две строчки в блок настройки fastgci:
Здесь 300 означает 300 секунд, для большинства скриптов, этого будет вполне достаточно, но вы можете еще больше увеличить значение если это нужно. Также ошибка 504 может возникать, когда Nginx используется в качестве прокси для Apache или любого другого веб-сервера, тогда нужно еще настроить время ожидания для прокси. Добавьте эти строки в секцию server:
Тут уже мы задаем таймаут 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
Здесь 5 секунд, означает, что в лог файл будут добавляться скрипты, которые выполняются дольше пяти секунд. Вы можете менять это значение по своему усмотрению. В логе вы сможете увидеть не только сами скрипты, но и трассировку методов, которые привели к проблемам:
Дальше останется только разобраться что с этим делать, например, оптимизировать скрипты или отключить лишние плагины.
Выводы
В этой статье мы рассмотрели как исправить 504 gateway time out Nginx 1.2 7, а также почему может возникнуть эта ошибка. Надеюсь, эта информация была полезной для вас.
Спасибо, помогло!
где эти команды прописывать и где что корректировать
Аналогичный вопрос, в чем смысл статьи, если не указано, где эти параметры прописывать
на серваке конечно. По ssh подключиться, аналогично если nginx в docker контейнере крутится и уже вводить комманды.
Большое спасибо за статью!
Было бы полезно добавить вариант, когда необходимо распарсить большой файл, например, XML. То есть на один скрипт убрать тайм-аут вовсе. Я встречал такой случай, когда нужно было распарсить XML дамп БД в несколько сот мегабайт. Это редкий случай, но пришлось потратить некоторое время для настройки сайта
В таких случаях лучше парсить не используя nginx а на прямую вызвать скрипт из linux
Ничего не нашёл.
Где эти кофигурационные файлы? Как называются? У меня совсем иное.