skip to content
Skesov.pro

Настройка таймаутов в 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)

Применение настроек

Протестируйте и перезапустите сервисы:

Terminal window
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl restart php8.3-fpm