Nginx Linux 504

Nginx: 504 Gateway Time-out — upstream не отвечает вовремя

  • Обновлено
  • Чтение ≈ 2 минуты
  • Нужны права администратора

Краткий ответ

Nginx выдаёт 504 Gateway Time-out, когда backend (PHP-FPM, Node.js, прокси) не успевает ответить за отведённое время. Увеличьте proxy_read_timeout или fastcgi_read_timeout, но сначала найдите причину медленного ответа.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Настройка таймаутов

#Что означает ошибка

504
504 Gateway Time-out

Nginx передал запрос на upstream (PHP-FPM, Gunicorn, Node.js, другой сервер) и не дождался ответа за время proxy_read_timeout (по умолчанию 60 секунд) или fastcgi_read_timeout. Это не ошибка nginx — он лишь сообщает, что backend не отвечает вовремя. Поэтому решение лежит в двух плоскостях: настройка таймаутов и устранение причины медленной работы.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Долгий скриптТяжёлый запрос к БД, экспорт или импорт выполняются больше минуты.Ошибка на одних и тех же страницах, в логе backend долгие запросы.Оптимизируйте запрос или вынесите в фон.
Слишком малый таймаутТаймаут nginx короче времени выполнения.Через ровно 60 секунд появляется 504.Увеличьте proxy_read_timeout/fastcgi_read_timeout.
Backend перегруженЗакончились воркеры PHP-FPM, процессы стоят в очереди.В логе server reached pm.max_children.Увеличьте pm.max_children, ускорьте код.
Backend недоступенПроцесс упал или не слушает порт.502/504 одновременно, в systemctl сервис в failed.Запустите сервис, проверьте сокет.

#Пошаговое решение

  1. Посмотрите логиНа сервере Nginx через SSH выполните sudo grep "upstream timed out" /var/log/nginx/error.log | tail -n 20 и запишите конкретный URL, upstream и фазу connecting/reading. Отметьте, после какого времени Nginx выдаёт 504 и возникает ли это на одном запросе или массово.
  2. Проверьте статус backendСопоставьте upstream-адрес с fastcgi_pass/proxy_pass из nginx -T, затем посмотрите статус соответствующего PHP-FPM или приложения. Если upstream недоступен, исправляйте его службу/порт, а не таймаут. На системах с несколькими пулами не перезапускайте все PHP-FPM ради одного сайта.
  3. Найдите медленный запросЕсли backend работает, изучите slowlog PHP-FPM, медленные запросы MySQL и внешние API. Найдите конкретную операцию, удерживающую воркер, и проверьте её на тестовом окружении. Длительный SQL-запрос не станет быстрее после увеличения fastcgi_read_timeout.
  4. Увеличьте таймаутыЕсли запрос по своей природе выполняется долго и это допустимо, подберите ограниченный fastcgi_read_timeout или proxy_read_timeout именно в нужном location, предварительно создав копию конфигурации. Слишком большой таймаут увеличит занятость соединений и может усугубить перегрузку.
  5. Проверьте лимиты воркеровПосмотрите в журнале PHP-FPM сообщения server reached pm.max_children, измерьте память пула, количество активных процессов и очередь. Увеличивайте число воркеров только после расчёта свободной RAM; при OOM и swap сначала оптимизируйте запросы.
  6. Проверьте конфигурацию и перезагрузитеПосле правок Nginx выполните sudo nginx -t и затем sudo systemctl reload nginx; при изменении PHP-FPM проверьте и примените его конфигурацию отдельно. Повторите исходный URL, убедитесь в ожидаемом ответе и отсутствии свежего 504 в журнале.

#Настройка таймаутов

nginx.conf
Увеличение таймаутов для PHP-FPM и обратного прокси.
location ~ \.php$ {
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_read_timeout 300s;
    include fastcgi_params;
}

location /api/ {
    proxy_pass http://127.0.0.1:3000;
    proxy_connect_timeout 10s;
    proxy_read_timeout 300s;
    proxy_send_timeout 300s;
}
Linux · Терминал (Bash)КомандаНужен sudo
Проверка конфигурации и применение.
sudo nginx -t
sudo systemctl reload nginx
sudo tail -n 50 /var/log/nginx/error.log

Если за nginx стоит Cloudflare или другой CDN, помните, что у него свой лимит ответа (у бесплатного Cloudflare — 100 секунд, после чего появляется 524). Долгие операции лучше выносить в очередь задач и показывать пользователю прогресс. Подробнее — в документации nginx.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.