Траблшутинг Nginx 504 Gateway Timeout: proxy_read_timeout и fastcgi
- Nginx возвращает клиенту HTTP статус
504 Gateway Time-out. - В
error.logNginx фиксируется запись:upstream timed out (110: Connection timed out) while reading response header from upstream. - Тяжелые SQL-запросы, выгрузки отчетов или сторонние HTTP-вызовы в бэкенде выполняются дольше 60 секунд (тайм-аут по умолчанию).
1. Анализ логов ошибок Nginx
tail -n 50 /var/log/nginx/error.log | grep -E "504|timed out"2. Тюнинг таймаутов для Proxy Pass (HTTP-бэкенды: Node.js, Go, Python)
Добавьте параметры в блок location или http:
location /api/ {
proxy_pass http://api_backend;
proxy_connect_timeout 60s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}3. Тюнинг таймаутов для FastCGI (PHP-FPM)
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
}4. Синхронизация лимитов в PHP-FPM / App Server
Увеличение таймаута в Nginx без изменения настроек бэкенда приведет к ошибке 502. В /etc/php/8.2/fpm/pool.d/www.conf:
request_terminate_timeout = 300sВ /etc/php/8.2/fpm/php.ini:
max_execution_time = 3005. Применение изменений
nginx -t && systemctl reload nginx
systemctl restart php8.2-fpm Частые вопросы (FAQ)
В чем разница между ошибками 502 Bad Gateway и 504 Gateway Timeout?
502 указывает, что бэкенд не работает, сбросил соединение или вернул некорректный ответ (TCP RST / ECONNREFUSED). 504 означает, что бэкенд принял запрос, но не успел отправить ответ за время, отведенное директивой proxy_read_timeout / fastcgi_read_timeout.
Является ли увеличение proxy_read_timeout лучшим решением?
Нет, это временная мера. Длительные операции (генерация PDF, экспорт БД) необходимо переносить в асинхронные очереди фоновых задач (Celery, RabbitMQ, Redis Queue).