Настройка таймаутов в Nginx и PHP: как избавиться от 504 Gateway Time-out
/ 2 min read
Table of Contents
Ошибка 504 Gateway Time-out означает, что Nginx не дождался ответа от бэкенда (например, PHP-FPM или другого проксируемого сервера) за отведенное время. Это часто случается при импорте больших баз данных, обработке тяжелых отчетов или выгрузке файлов.
Чтобы скрипты успевали выполняться, необходимо синхронизировать таймауты между всеми звеньями цепи.
1. Настройка таймаутов Nginx
Nginx имеет несколько параметров для контроля времени ожидания. Добавьте их в блок server или location (файл /etc/nginx/sites-available/default):
server { # Время, в течение которого Nginx поддерживает соединение с клиентом открытым keepalive_timeout 65;
location ~ \.php$ { # ... стандартные настройки fastcgi ...
# Максимальное время ожидания ответа от PHP-FPM fastcgi_read_timeout 300s; }
# Если вы проксируете запросы на другой сервис (например, Node.js или Python) location /api/ { proxy_read_timeout 300s; proxy_connect_timeout 75s; }}2. Настройка таймаутов PHP
Даже если Nginx готов ждать 5 минут (300 секунд), PHP может принудительно завершить скрипт раньше времени из-за собственных лимитов.
Изменения в php.ini
Отредактируйте ваш php.ini (например, /etc/php/8.3/fpm/php.ini):
; Максимальное время выполнения скрипта в секундахmax_execution_time = 300
; Максимальное время, затрачиваемое на разбор входных данных (POST/GET)max_input_time = 300Изменения в пуле PHP-FPM
Если вы используете PHP-FPM, откройте конфиг пула (/etc/php/8.3/fpm/pool.d/www.conf) и раскомментируйте параметр безопасности:
; Принудительное завершение процесса, если он висит дольше указанного времени.; Спасает от зависших скриптов, которые игнорируют max_execution_time.request_terminate_timeout = 300sПравило идеального таймаута
Убедитесь, что лимиты выстроены в логичную цепочку. Nginx должен ждать чуть дольше, чем работает PHP-FPM, чтобы получить корректный ответ (или ошибку) от бэкенда, а не просто обрывать соединение вслепую.
Формула:
request_terminate_timeout (PHP) ≤ fastcgi_read_timeout (Nginx)
Применение настроек
Протестируйте и перезапустите сервисы:
sudo nginx -tsudo systemctl restart nginxsudo systemctl restart php8.3-fpm