Apache Error AH01075: Error dispatching request to FastCGI — Решение
Клиентский запрос к динамическому приложению прерывается с ошибкой 503 Service Unavailable или 504 Gateway Timeout. В системном журнале error.log Apache появляется сообщение сбоя конвейера ввода-вывода (APR Bucket Brigade): [proxy_fcgi:error] [pid 1234:tid 5678] (70007)The timeout specified has expired: [client ...] AH01075: Error dispatching request to : (passing brigade to compiler).
| Системный код APR | Событие | Причина |
|---|---|---|
(70007) The timeout specified has expired | Истекло время ожидания | PHP-скрипт выполняется дольше таймаута ProxyTimeout |
(32) Broken pipe | Обрыв сокета клиентом | Пользователь закрыл браузер до завершения обработки |
| Bucket Brigade Failure | Сбой буферизации Apache | Нехватка памяти для промежуточного хранения POST-тела запроса |
- Сбой возникает при загрузке тяжелых файлов, экспорте объемных отчетов или выполнении длительных SQL-запросов.
- PHP-скрипт продолжает выполняться в фоне на стороне PHP-FPM, но Apache уже разорвал сессию.
- Увеличьте тайм-аут проксирования FastCGI (
ProxyTimeout) в конфигурации виртуального хоста:# Увеличиваем таймаут ожидания выполнения FastCGI до 300 секунд: ProxyTimeout 300 <FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost" </FilesMatch> - Синхронно увеличьте лимиты времени выполнения в конфигурационных файлах
php.iniи пуле PHP-FPM (/etc/php/8.2/fpm/pool.d/www.conf):# В php.ini: max_execution_time = 300 max_input_time = 300 # В www.conf: request_terminate_timeout = 300s - Если запрос передает объемное тело (POST/PUT payload), настройте буферизацию FastCGI ответов:
ProxyFCGIBackendType FPM # Отключаем сброс соединений при длительных операциях ввода-вывода: ProxyFCGISetEnvIf "true" proxy-fcgi-pathinfo 1 - Проверьте системные ресурсы сервера (утилизацию CPU и I/O wait дисков), чтобы убедиться, что база данных не блокирует исполнение PHP-процессов.
- Перезапустите службы:
sudo systemctl reload apache2 && sudo systemctl restart php8.2-fpm.
Частые вопросы (FAQ)
Что означает код ошибки (70007) The timeout specified has expired?
Это внутренний код библиотеки APR (Apache Portable Runtime), сообщающий, что время ожидания сетевого ответа от бэкенда превысило значение директивы ProxyTimeout или Timeout.
Почему PHP-скрипт падает ровно через 60 секунд?
Значение 60 секунд является стандартным глобальным таймаутом директивы Timeout в Apache по умолчанию. Увеличьте ProxyTimeout в вашем VirtualHost.
Может ли большой файл при загрузке вызывать AH01075?
Да, если медленный клиент передает файл дольше, чем разрешено таймаутом чтения тела запроса, Apache разорвет передачу brigade-пакета.
Как сделать индивидуальный таймаут для одного скрипта (например, cron.php)?
Оберните вызов в секцию <Files 'cron.php'> и установите ProxyTimeout 1800 внутри нее.