Ошибки

Ошибка 504 Gateway Timeout: что значит и как исправить

504 Gateway Timeout — сервер-посредник, например nginx, не дождался ответа от следующего сервера: PHP, приложения или другого сервера. По умолчанию nginx ждёт начала ответа 60 секунд. Значит, какой-то запрос обрабатывается слишком долго — и лучше ускорить его, чем просто поднять таймаут.

Обновлено 07.10.2026≈ 5 мин чтения
Содержание 12

Что означает код 504

По стандарту HTTP код 504 значит: сервер, работая посредником, не получил вовремя ответа от следующего сервера, к которому обратился, чтобы выполнить запрос. Страница nginx с этой ошибкой называется «504 Gateway Time-out».

Если вы посетитель

  1. Обновите страницу через минуту-другую.
  2. Если ошибка появилась после отправки формы или оплаты, не повторяйте их сразу: запрос мог выполниться, просто ответ не дошёл. Сначала проверьте, прошёл ли он, — например, по письму или в личном кабинете.
  3. Если ошибка держится, сообщите владельцу сайта, какую страницу вы открывали и когда.

Как найти причину по журналу

nginx записывает таймауты в журнал ошибок на уровне error, поэтому они видны без дополнительных настроек:

Строка в журналеЧто случилось
upstream timed out (110: Connection timed out) while reading response header from upstreamСоединение есть, но PHP или приложение не начали отвечать вовремя
upstream timed out (110: Connection timed out) while connecting to upstreamЗа отведённое время не удалось даже соединиться со следующим сервером

Какие таймауты за это отвечают

ДирективаЧто ограничиваетПо умолчанию
proxy_read_timeout, fastcgi_read_timeoutОжидание между двумя операциями чтения ответа60 секунд
proxy_send_timeout, fastcgi_send_timeoutОжидание между двумя операциями записи запроса60 секунд
proxy_connect_timeout, fastcgi_connect_timeoutУстановку соединения; обычно не может быть больше 75 секунд60 секунд

Таймауты чтения и записи считаются не на весь ответ, а между двумя операциями: если следующий сервер присылает данные понемногу, но без долгих пауз, соединение не оборвётся.

Как найти медленные скрипты PHP

У PHP-FPM есть журнал медленных запросов. Включите его в настройках пула PHP-FPM (файл www.conf):

request_slowlog_timeout = 10s
slowlog = /var/log/php8.3-fpm.slow.log

Путь к журналу здесь — пример, можно указать свой. По умолчанию журнал выключен: настройка request_slowlog_timeout равна 0, а если её задать, нужно задать и slowlog. После правки перезапустите PHP командой sudo systemctl restart php8.3-fpm (в Ubuntu 26.04 — php8.5-fpm). Для каждого запроса, который выполняется дольше 10 секунд, PHP-FPM запишет в журнал цепочку вызовов функций — по ней видно, на чём скрипт застрял.

Почему PHP не останавливает скрипт сам

У PHP есть свой лимит времени — max_execution_time, по умолчанию 30 секунд. Но в системах, кроме Windows, в него не входит время системных вызовов и операций с потоками — например, ожидание данных по сети. Скрипт, который долго ждёт ответа другого сервера, может работать намного дольше 30 секунд, и nginx перестанет ждать раньше.

В пуле PHP-FPM есть и жёсткий лимит — request_terminate_timeout: процесс, который работает дольше, принудительно останавливается. По умолчанию он равен 0, то есть выключен.

Как исправить

Ускорьте медленный запрос. Найдите его по журналу медленных запросов PHP-FPM или по журналу времени ответа из разбора кода 499. Долгую работу — отчёты, импорт, рассылки, обработку файлов — выносите в фоновые задачи, чтобы страница отвечала сразу.

Долгие запросы — норма для этого адреса. Тогда поднимите таймаут. Для PHP — в блоке location, который передаёт запросы PHP-FPM:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_read_timeout 120s;
}

Так таймаут поднимется для всех скриптов PHP. Лучше заведите отдельный блок location только для долгого адреса — с теми же строками include и fastcgi_pass. Для приложений за proxy_pass то же делает директива proxy_read_timeout.

Посредников несколько. Если перед сервером стоит CDN или балансировщик, у него свой таймаут, и он может быть короче, чем у nginx. Тогда ошибку покажет уже он, даже если nginx ещё ждёт.

После любых правок: sudo nginx -t, затем sudo systemctl reload nginx.

На обычном хостинге

Таймауты веб-сервера на виртуальном хостинге задаёт хостер. Если 504 появляется на тяжёлых страницах или при импорте, попробуйте делать такую работу частями, а если не помогает, напишите в поддержку адрес страницы и время ошибки.

504 и поиск Яндекса

По справке Яндекса, при ответе 504 сервер, работающий шлюзом или прокси, не дождался ответа от следующего сервера. Яндекс советует увеличить таймауты прокси или шлюза и проверить производительность следующего сервера.

Чем 504 отличается от соседних кодов

КодКогда возникает
408Сервер не дождался запроса от клиента
499Клиент не дождался ответа и закрыл соединение
502Посредник получил от следующего сервера неправильный ответ или не смог соединиться
504Посредник не дождался ответа от следующего сервера

Источники

Сверено 7 октября 2026 года.

Что почитать дальше

Проверено и обновлено: 07.10.2026