Ошибка с кодом 504 Gateway Timeout при тяжелых запросах к веб ресурсу

Как исправить ошибку с кодом 504 Gateway Timeout при тяжелых запросах к веб ресурсу

Ошибка 504 Gateway Timeout возникает, когда сервер-шлюз не получает ответ от upstream-сервера в течение отведённого времени. Решение заключается в увеличении timeout-значений, оптимизации кода, масштабировании ресурсов и настройке балансировщика нагрузки. Выполните шаги ниже в порядке от простого к сложному.

Причины проблемы

  • Недостаточное время ожидания ответа от сервера приложений
  • Перегрузка сервера или нехватка вычислительных ресурсов (CPU, RAM, дисковая I/O)
  • Неоптимизированные SQL-запросы или долгие вычисления в коде
  • Слабое соединение между веб-сервером и upstream-сервером
  • Проблемы с базой данных или третьесторонними API
  • DDoS-атаки или аномальный трафик
  • Неправильная конфигурация прокси-сервера или балансировщика нагрузки

Пошаговая инструкция

  1. Откройте файл конфигурации веб-сервера nginx.conf (для Nginx) или httpd.conf (для Apache).
  2. Найдите или добавьте параметр proxy_connect_timeout для Nginx и установите значение 60s (или выше: proxy_connect_timeout 120s;).
  3. Увеличьте proxy_send_timeout до 300s: откройте блок upstream и добавьте строку proxy_send_timeout 300s;.
  4. Установите proxy_read_timeout на значение 300s или более в зависимости от длительности обработки запроса.
  5. Для Apache найдите модуль mod_proxy и установите ProxyTimeout на 600 секунд.
  6. Проверьте логи приложения в директории /var/log/application.log или C:\Logs\ на Windows для выявления долгих запросов.
  7. Оптимизируйте SQL-запросы: добавьте индексы на часто используемые колонки командой CREATE INDEX idx_name ON table_name(column);.
  8. Включите кеширование результатов (Redis, Memcached) для часто запрашиваемых данных.
  9. Настройте балансировщик нагрузки (Nginx, HAProxy) для распределения трафика между несколькими серверами приложений.
  10. Увеличьте лимит соединений в файле limits.conf: отредактируйте строку * soft nofile 65536 и * hard nofile 65536.
  11. Перезагрузите веб-сервер командой systemctl restart nginx (Nginx) или systemctl restart apache2 (Apache).
  12. Проверьте статус сервера командой systemctl status nginx и убедитесь, что ошибок нет.
  13. Протестируйте тяжёлый запрос и проверьте время отклика через DevTools браузера (F12 → Network).

Часто задаваемые вопросы

Какое оптимальное значение timeout? Для большинства приложений достаточно 60–300 секунд; для тяжелых аналитических запросов может потребоваться 600 секунд и более.

Как узнать, почему именно происходит timeout? Проверьте логи сервера приложений (tail -f /var/log/app.log), выполните мониторинг ресурсов командой top или htop во время запроса.

Будет ли увеличение timeout решением навсегда? Нет — это временная мера; обязательно оптимизируйте код и базу данных, иначе проблема вернётся при росте нагрузки.

Похожие материалы

Расширение браузера блокирует доступ к сайту из за ложного срабатывания
Яндекс Браузер пишет Подключение не защищено и выдает сбой SSL
Ошибка ERR_CONNECTION_REFUSED при открытии сайтов в Chrome