Ошибка 504 Gateway Timeout возникает, когда сервер-шлюз не получает ответ от upstream-сервера в течение отведённого времени. Решение заключается в увеличении timeout-значений, оптимизации кода, масштабировании ресурсов и настройке балансировщика нагрузки. Выполните шаги ниже в порядке от простого к сложному.
Причины проблемы
- Недостаточное время ожидания ответа от сервера приложений
- Перегрузка сервера или нехватка вычислительных ресурсов (CPU, RAM, дисковая I/O)
- Неоптимизированные SQL-запросы или долгие вычисления в коде
- Слабое соединение между веб-сервером и upstream-сервером
- Проблемы с базой данных или третьесторонними API
- DDoS-атаки или аномальный трафик
- Неправильная конфигурация прокси-сервера или балансировщика нагрузки
Пошаговая инструкция
- Откройте файл конфигурации веб-сервера
nginx.conf(для Nginx) илиhttpd.conf(для Apache). - Найдите или добавьте параметр
proxy_connect_timeoutдля Nginx и установите значение60s(или выше:proxy_connect_timeout 120s;). - Увеличьте
proxy_send_timeoutдо300s: откройте блокupstreamи добавьте строкуproxy_send_timeout 300s;. - Установите
proxy_read_timeoutна значение300sили более в зависимости от длительности обработки запроса. - Для Apache найдите модуль
mod_proxyи установитеProxyTimeoutна600секунд. - Проверьте логи приложения в директории
/var/log/application.logилиC:\Logs\на Windows для выявления долгих запросов. - Оптимизируйте SQL-запросы: добавьте индексы на часто используемые колонки командой
CREATE INDEX idx_name ON table_name(column);. - Включите кеширование результатов (Redis, Memcached) для часто запрашиваемых данных.
- Настройте балансировщик нагрузки (Nginx, HAProxy) для распределения трафика между несколькими серверами приложений.
- Увеличьте лимит соединений в файле
limits.conf: отредактируйте строку* soft nofile 65536и* hard nofile 65536. - Перезагрузите веб-сервер командой
systemctl restart nginx(Nginx) илиsystemctl restart apache2(Apache). - Проверьте статус сервера командой
systemctl status nginxи убедитесь, что ошибок нет. - Протестируйте тяжёлый запрос и проверьте время отклика через DevTools браузера (
F12→Network).
Часто задаваемые вопросы
Какое оптимальное значение timeout? Для большинства приложений достаточно 60–300 секунд; для тяжелых аналитических запросов может потребоваться 600 секунд и более.
Как узнать, почему именно происходит timeout? Проверьте логи сервера приложений (tail -f /var/log/app.log), выполните мониторинг ресурсов командой top или htop во время запроса.
Будет ли увеличение timeout решением навсегда? Нет — это временная мера; обязательно оптимизируйте код и базу данных, иначе проблема вернётся при росте нагрузки.