Ошибка 504 Gateway Timeout: что значит и как исправить
504 Gateway Timeout — сервер-посредник, например nginx, не дождался ответа от следующего сервера: PHP, приложения или другого сервера. По умолчанию nginx ждёт начала ответа 60 секунд. Значит, какой-то запрос обрабатывается слишком долго — и лучше ускорить его, чем просто поднять таймаут.
Содержание 12
Что означает код 504
По стандарту HTTP код 504 значит: сервер, работая посредником, не получил вовремя ответа от следующего сервера, к которому обратился, чтобы выполнить запрос. Страница nginx с этой ошибкой называется «504 Gateway Time-out».
Если вы посетитель
- Обновите страницу через минуту-другую.
- Если ошибка появилась после отправки формы или оплаты, не повторяйте их сразу: запрос мог выполниться, просто ответ не дошёл. Сначала проверьте, прошёл ли он, — например, по письму или в личном кабинете.
- Если ошибка держится, сообщите владельцу сайта, какую страницу вы открывали и когда.
Как найти причину по журналу
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 | Посредник не дождался ответа от следующего сервера |
Источники
- RFC 9110, раздел 15.6.5 — определение кода 504.
- Документация nginx: proxy_read_timeout и fastcgi_read_timeout.
- Исходный код nginx: ngx_http_upstream.c — строки журнала о таймаутах.
- Документация PHP: max_execution_time.
- Исходный код PHP: образец настроек пула www.conf — request_slowlog_timeout, slowlog и request_terminate_timeout.
- Яндекс Вебмастер: коды ответа HTTP.
Сверено 7 октября 2026 года.
Что почитать дальше
- Ошибка 502 Bad Gateway — когда ответ пришёл, но неправильный.
- Код 499 в nginx — когда не дождался уже посетитель.
- Как разместить сайт на VPS — настройка nginx с нуля.
- Что делать, если хостинг лежит — по шагам.
Проверено и обновлено: 07.10.2026