Вопрос или проблема
Недавнее обновление zlib из-за уязвимости безопасности кажется вызывает серьезную проблему при обслуживании PHP-FPM 8.0 через nginx на Ubuntu focal. Любые запросы с gzip-кодировкой не работают с самого начала ответа, хотя nginx регистрирует запросы как успешные и правильного размера. Если я делаю запросы без заголовка Accept-Encoding
, все работает идеально. Как временное решение, я пытаюсь отключить всю поддержку gzip, но это, похоже, чрезвычайно настойчиво… На данный момент я попробовал следующие настройки в nginx:
gzip off;
fastcgi_buffering off;
add_header Accept-Encoding "";
proxy_set_header Accept-Encoding "";
и я также проверил, что нет других директив, которые снова включат их, используя grep вывод nginx -T
.
Однако, если я выведу заголовки запроса из PHP (т.е. после их прохождения через nginx), я все еще вижу этот заголовок:
Accept-Encoding: deflate, gzip, br, zstd
так что nginx не удаляет его из запроса перед его передачей в PHP-FPM. Я пробовал устанавливать эти директивы на уровне сервера и уровня размещения, с теми же результатами.
В PHP я отключил всю буферизацию вывода, но, похоже, невозможно отключить zlib без перекомпиляции.
Как мне заставить nginx удалить этот заголовок запроса, чтобы ни nginx, ни PHP не сжимали ответы?
Директива proxy_set_header
предназначена для проксирования запросов, т.е. для их передачи через цепочку HTTP-на-HTTP-серверов. И у вас следующий в цепочке сервер FastCGI, так что ваш набор директив начинается с fastcgi_
.
Вы можете полностью отключить передачу заголовков запроса в PHP, установив fastcgi_pass_request_headers
в положение off, или можете удалить конкретный заголовок, сбросив его с помощью fastcgi_set_header
.
Для fastcgi используйте немного другой синтаксис. Вместо установки заголовка, вы устанавливаете параметр, который соответствует заголовку. Имена параметров начинаются с “HTTP_”, далее следует имя заголовка в верхнем регистре. Дефисы заменяются на подчеркивания в имени параметра.
fastcgi_param HTTP_ACCEPT_ENCODING "";
.
Ответ или решение
Чтобы удалить заголовок Accept-Encoding в запросе nginx при работе с PHP-FPM на Ubuntu Focal, нужно следовать определённой процедуре изменения конфигурации nginx, так как обычные методы могут не дать нужный результат. Ваше желание отключить поддержку gzip оправдано в свете возникших проблем, поэтому вот как можно правильно настроить nginx для достижения этой цели.
Анализ Проблемы и Решение
Вы сталкиваетесь с ситуацией, когда заголовок Accept-Encoding, добавленный к запросам, мешает корректному исполнению, так как gzip-сжатие вызывает сбой в ответах через PHP-FPM. Даже несмотря на попытки отключения gzip с помощью директив вроде gzip off
, проблема сохраняется. Это происходит, потому что данные заголовки продолжают передаваться на сервер FastCGI (PHP-FPM).
Шаги для Решения Проблемы
-
Убедитесь, что gzip действительно отключён:
- В nginx конфигурационном файле (обычно
/etc/nginx/nginx.conf
) либо в конфигурациях серверов (server
блоках) установите:gzip off;
- В nginx конфигурационном файле (обычно
-
Используйте правильные директивы для FastCGI:
- Поскольку вы работаете с PHP-FPM через FastCGI, необходимо использовать директивы
fastcgi_
. - Для изменения или удаления заголовка Accept-Encoding примените:
fastcgi_param HTTP_ACCEPT_ENCODING "";
- Разместите эту строку внутри блока
location
, где указываетсяfastcgi_pass
.
- Поскольку вы работаете с PHP-FPM через FastCGI, необходимо использовать директивы
-
Отключите передачу заголовков запроса, если необходимо:
- Теоретически, можно отключить передачу всех заголовков, но это может негативно повлиять на некоторые файлы:
fastcgi_pass_request_headers off;
- Имейте в виду, что полное отключение заголовков запросов может привести к проблемам с определёнными функциями, которые зависят от них.
- Теоретически, можно отключить передачу всех заголовков, но это может негативно повлиять на некоторые файлы:
-
Перезагрузка nginx:
- Не забудьте применить изменения, перезагрузив конфигурацию nginx:
sudo systemctl reload nginx
- Не забудьте применить изменения, перезагрузив конфигурацию nginx:
Дополнительные Замечания
- Проверка Конфигурации: Всегда проверяйте, нет ли конфликтующих директив в других файлах конфигурации nginx. Для этого используйте команду:
nginx -T | grep конфиг_файл
- Диагностика через Логи: Изучите логи nginx для подтверждения, что gzip отключён и заголовки не передаются:
/var/log/nginx/error.log
и/var/log/nginx/access.log
. - Тестирование: Убедитесь, что изменения действительно применяются, проверив заголовки с помощью утилит вроде
curl
:curl -H "Accept-Encoding:" -I http://ваш_сервер/ваш_скрипт.php
Заключение
Эти шаги помогут вам надежно контролировать заголовки запросов, передаваемых через nginx, способствуя устранению ошибок, связанных с сжатием контента. Попробуйте интегрировать данные изменения в конфигурацию вашей системы, чтобы обеспечить стабильную и безопасную работу ваших приложений.