Apache Error AH01068: Got bogus version 0 FastCGI record — Решение
Клиент получает ошибку 503 Service Unavailable или 502 Bad Gateway при запросе динамических PHP-страниц. В системном журнале error.log регистрируется нарушение протокола: [proxy_fcgi:error] [pid 1234:tid 5678] [client ...] AH01068: Got bogus version 0 while reading FastCGI record header (perhaps not a FastCGI backend) или Got bogus version 72.
| Симптом в логе | Что ожидал Apache | Что реально ответил бэкенд |
|---|---|---|
Got bogus version 0 | FastCGI бинарный фрейм (Record Version 1) | Пустой ответ, TCP RST или raw HTTP payload |
Got bogus version 72 ('H') | FastCGI протокол | Текстовый HTTP ответ (HTTP/1.1 200 OK — буква 'H' имеет код 72) |
Got bogus version 60 ('<') | FastCGI протокол | HTML страница ошибки (символ <html> имеет код 60) |
- Apache не может распознать ответ upstream-сервера, так как протоколы взаимодействия не совпадают.
- Ошибка возникает при путанице модулей
proxy_httpиproxy_fcgiили отправке FastCGI-запроса на обычный HTTP-порт.
- Проверьте, какой именно бэкенд указан в директиве
ProxyPass. Если сервис является стандартным HTTP сервером (Node.js, Go, Python), используйте протоколhttp://, а НЕfcgi://:# ДЛЯ ОБЫЧНЫХ HTTP СЕРВИСОВ (Используйте proxy_http): ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ - Если вы проксируете запросы к PHP-FPM, убедитесь, что используется правильный синтаксис
proxy_fcgiи целевой порт действительно является FastCGI сокетом (а не HTTP):# ДЛЯ PHP-FPM ЧЕРЕЗ TCP СОКЕТ: <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> # ДЛЯ PHP-FPM ЧЕРЕЗ UNIX СОКЕТ: <FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php-fpm.sock|fcgi://localhost" </FilesMatch> - Убедитесь, что на целевом порту (например,
9000) запущен именно демон PHP-FPM, а не другой веб-сервер (например, Nginx или php-cli built-in server). - Проверьте права на UNIX сокет PHP-FPM в
/etc/php/8.x/fpm/pool.d/www.conf:listen.owner = www-data listen.group = www-data listen.mode = 0660 - Перезапустите PHP-FPM и Apache:
sudo systemctl restart php8.2-fpm sudo systemctl restart apache2
72 соответствует символу H (бэкенд ответил обычным HTTP-протоколом HTTP/1.1 вместо бинарного FastCGI), а версия 60 соответствует < (сервер вернул XML/HTML документ).Частые вопросы (FAQ)
Что такое FastCGI Record Header?
Это 8-байтовый бинарный заголовок пакета протокола FastCGI. Первый байт заголовка строго обязан содержать версию протокола FastCGI (константа FCGI_VERSION_1 = 1).
Почему PHP-FPM может вернуть 'bogus version 0'?
Это происходит, если рабочий процесс PHP-FPM упал по сегфолту (SIGSEGV) или был убит OOM Killer в момент начала отправки ответа, закрыв сокет с нулевым телом.
Как проверить, что порт слушает именно FastCGI, а не HTTP?
Попробуйте выполнить curl http://127.0.0.1:9000/. FastCGI сервер вернет бинарный мусор или разорвет соединение, а HTTP-сервер вернет читаемый заголовок HTTP/1.1.
Можно ли проксировать статические файлы через proxy_fcgi?
Нет, через mod_proxy_fcgi должны передаваться строго файлы скриптов (.php), а статичные файлы (CSS/JS/изображения) Apache должен отдавать самостоятельно силами модуля core.