Как отключить gzip php nginx
Перейти к содержимому

Как отключить gzip php nginx

  • автор:

Как я могу отключить nginx gzip из PHP?

Я пытаюсь остановить nginx от использования gzip для одного запроса PHP. У меня уже есть следующее:

 @ini_set('zlib.output_compression', 'Off'); @ini_set('implicit_flush', 1); header('X-Accel-Buffering: no'); 

Согласно всему, что я нашел, что только X-Accel-Buffering должен отключать gzip, однако, когда я загружаю эту страницу из браузера, я все еще вижу заголовок:

Content-Encoding:gzip 

Я использую php7-fpm, nginx 1.10.1, debian8

Я провел тест с использованием sleep() для задержки вывода. Он выглядит как header(‘X-Accel-Buffering: нет’); Работает, однако он только предотвращает буферизацию, а не gzip. Я думаю, что gzip работает как поток каким-то образом.

Я вижу, что если я вывожу 1000 байт, перебирая оператор echo с 1 символом каждый, браузер получает около 11кб. Если я перебираю str_rep x 1000, то отправляется гораздо меньше данных. Должно быть, там есть накладные расходы.

Вне зависимости от того, мне нужно отключить gzip, чтобы я мог отправлять большое количество контента и измерять время загрузки. Если он был скомпонован, я не знаю, какова фактическая пропускная способность.

Поделиться Источник 11 декабря 2016 в 12:40

2 ответа

Nginx не будет запускать фильтр gzip, если заголовок Content-Encoding найден в ответе. Таким образом, вы можете установить заголовок Content-Encoding: identity на бэкэнде, и nginx передаст его клиенту без процесса gzip. identity означает «не закодированный».

Поделиться 12 декабря 2016 в 20:11

Я не нашел способа явно отключить это, однако я обнаружил, что есть список стандартных типов mime, которые будут закодированы модулем gzip.

Поскольку данные не нужно читать и просто отправляются в качестве теста скорости, изменение типа содержимого на что-то другое, кроме этого списка, предотвратит его зашифровку.

header('Content-Type: raw/data'); 

How can I disable nginx gzip from PHP?

According to everything I have found, that X-Accel-Buffering alone should disable gzip, however when I load this page from a browser, I can still see the header:

Content-Encoding:gzip 

I’m using php7-fpm, nginx 1.10.1, debian8 EDIT: I did a test using sleep() to delay the output. It looks like header(‘X-Accel-Buffering: no’); IS working, however it only prevents buffering and not gzipping. I guess gzipping is working as a stream somehow. I can see that if I output 1,000 bytes, looping over an echo statement with 1 char each, the browser receives about 11kb. If i echo a str_rep x 1000, then much less data is sent. There must be some overhead there. Regardless, I need to disable gzip so that I can send a large amount of content and measure the download time. If it’s gzipped, I don’t know what the actual throughput is.

Nginx. Как отключить кэширование админки?

merryjane

В указанном Вами конфиге, нигде не фигурирует кеширование на уровне nginx.
Если же Вы про директиву expires, то попробуйте для админки ее выставить в маленькое значение, например 1.

Ответ написан более трёх лет назад

cjbars

Денис @cjbars Автор вопроса

Игорь я возможно не так выразился.
есть параметр expires 14d;
он передает ответ Cache-Control:max-age=1209600
соответственно заставляя браузер брать данные из своего кэша.
Речь конечно не идет о кэшировании средствами nginx. Вопрос как отучить браузер от кэша?
И именно для админки

Re: Отключение буферизации для fastcgi

On Sat, Mar 13, 2010 at 03:29:36AM +0300, Dmitry Koterov wrote:

> Есть вот такая конфигурация:
>
> location ~ /action/ > gzip off;
> fastcgi_buffer_size 4k;
> fastcgi_busy_buffers_size 4k;
> fastcgi_buffers 2 4k;
> fastcgi_pass 127.0.0.1:9000;
> fastcgi_param SCRIPT_FILENAME $document_root/index.php;
> include fastcgi_params;
> >
>
> Вопрос: можно ли ВООБЩЕ ВЫКЛЮЧИТЬ буферизацию, а НЕ сделать ее равной 4k +
> 2*4k? Дело в том, что в index.php лежит:

Нет, вообще отключить буферизацию для fastcgi нельзя.

>
> // в php.ini отключены output_buffering, output_compression, output_handler;
> implicit_flush включен
> while (ob_get_level()) ob_end_clean(); // на всякий пожарный
> for ($i = 0; $i < 5; $i++) > echo «Test! » . time() . «
\n»;
> for ($n = 0; $n < 15000; $n++) echo "\n";
> flush();
> sleep(2);
> >
> exit;
>
> И экспериментальным путем было установлено, что $n = 15000 (плюс-минус) —
> это минимальный размер «вантуза», которым удается «протолкнуть» контент в
> браузер. Установка fastcgi_buffer_size и fastcgi_busy_buffers_size в меньшие
> значения не помогают (возможно, они просто вообще не могут корректно
> определяться внутри location, либо же всегда кратны 4K?).
>
> Т.е. задача — минимизировать размер «вантуза» любыми средствами. (Все-таки
> 15К — это многовато.)
> Подскажите, пожалуйста, как это правильно сделать.

nginx отдаёт данные клиенту (точнее — в цепочку исходящих
фильтров) после заполнения бекендом очередного буфера (либо
основного — fastcgi_buffer_size, либо одного из дополнительных —
fastcgi_buffers). В вашем случае это всегда 4k. Можно уменьшить,
но если в основной буфер не влезут все заголовки ответа — будет
502.

А 16k — скорее всего следует искать либо в php, либо в других
буферизирующих прослойках (e.g. ssl в nginx’е имеет буфер в 16k;
если тестируем по ssl — то результат объясним). Включённый debug
log вкупе с тестиком вида «напечатать 1k и поспать секунду,
повторить» быстро покажет что на самом деле происходит.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *