Apache Error AH03175: connection timed out waiting for backend — Решение
Клиент при выполнении запроса видит долгую загрузку страницы, которая завершается ошибкой 504 Gateway Timeout или 503 Service Unavailable. В системном журнале error.log регистрируется истечение таймаута FastCGI-канала: [proxy_fcgi:error] [pid 1234:tid 5678] [client ...] AH03175: mod_proxy_fcgi: connection timed out waiting for backend (/var/run/php/php-fpm.sock).
| Узкое место | Симптом в системе | Причина таймаута |
|---|---|---|
| Пул PHP-FPM переполнен | Сообщения server reached pm.max_children | Все воркеры заняты, новый запрос стоит в очереди и отваливается по таймауту |
| Долгие SQL запросы | High CPU / Lock в MySQL/PostgreSQL | Скрипт завис в ожидании ответа от СУБД |
Низкий ProxyTimeout | Обрыв ровно через 30 или 60 секунд | Значение таймаута Apache меньше реального времени выполнения скрипта |
- Apache не смог дождаться ответа от службы PHP-FPM за отведенное время.
- Во время пиков нагрузки сайт полностью перестает отвечать пользователям.
- Увеличьте таймаут ожидания бэкенда в конфигурации виртуального хоста Apache:
# Увеличиваем лимит ожидания до 300 секунд: ProxyTimeout 300 <FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost" </FilesMatch> - Главная причина — нехватка воркеров PHP-FPM: Откройте файл пула (
/etc/php/8.2/fpm/pool.d/www.conf) и увеличьте количество дочерних процессов:pm = dynamic pm.max_children = 50 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 20 pm.max_requests = 1000 request_terminate_timeout = 300s - Проверьте системный журнал PHP-FPM на наличие предупреждений о перегрузке пула:
sudo tail -n 50 /var/log/php8.2-fpm.log - Включите медленный лог PHP-FPM (slowlog) для выявления зависающих функций и SQL-запросов:
slowlog = /var/log/php-fpm-slow.log request_slowlog_timeout = 5s - Перезапустите стек сервисов:
sudo systemctl reload apache2 && sudo systemctl restart php8.2-fpm.
pm.max_children по формуле: (Свободная RAM сервера под PHP) / (Средний размер одного процесса PHP). Например: 4096 МБ RAM / 60 МБ = ~68 процессов.Частые вопросы (FAQ)
Чем AH03175 отличается от AH01075?
AH01075 возникает при сбое передачи данных конвейера ввода-вывода (APR bucket brigade), а AH03175 фиксирует чистый сетевой таймаут ожидания первого ответа от FastCGI бэкенда.
Почему увеличение ProxyTimeout не всегда решает проблему?
Если бэкенд завис наглухо из-за блокировки транзакции в БД или бесконечного цикла в коде, увеличение таймаута лишь продлит ожидание пользователя, но не решит причину зависания.
Как проверить количество активных процессов PHP-FPM прямо сейчас?
Выполните команду: pgrep -c php-fpm или используйте ps aux | grep php-fpm | wc -l.
Что делает директива pm.max_requests = 1000?
Она принудительно перезапускает воркер PHP-FPM после обработки каждых 1000 запросов, очищая возможные утечки памяти в PHP-библиотеках.