Назад | Перейти на главную страницу

Не удается заставить nginx ответить ab сжатым содержимым

ab -n 1 -H 'Accept-Encoding: gzip, deflate' http://mywebsite.com/

Это всегда возвращает несжатый контент (я вижу это как по размеру, так и потому, что я обнюхиваю трафик с помощью ngrep).

Однако, если я запрашиваю контент в Firefox, результат будет сжат. Content-Encoding: gzip это говорит. Я пытался указать с помощью ab все заголовки запросов, указанные в Firefox, так как я вижу их обнюханными, но все же ab получает его несжатым, а Firefox сжимает.

Я использую версию nginx, которую я скомпилировал сам, но она идентична версии Debian squeeze backports 1.2.1, за исключением того, что в ней есть патч syslog. Версия 655654 ApacheBench 2.3. Вот конфигурация gzip nginx:

gzip                on;
gzip_min_length     1000;
gzip_types          text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_disable        "MSIE [1-6]\.(?!.*SV1)";
gzip_vary           on;

Тип документа - text/html (не указан выше, но всегда сжимается nginx; кроме того, я пытался добавить его, без разницы). Это динамический, полученный от uwsgi бэкэнд.

Заголовки запросов из ab:

GET [...] HTTP/1.0.
Accept-Encoding: gzip, deflate.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.
User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:23.0) Gecko/20100101 Firefox/23.1.
Accept-Language: en-US,en;q=0.5.
Cookie: csrftoken=[...].
Authorization: Basic [....].
Connection: keep-alive.
Host: [...].

Обнюхали заголовки запросов из Firefox:

GET [...] HTTP/1.1.
Host: [...].
User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:23.0) Gecko/20100101 Firefox/23.0.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8.
Accept-Language: en-US,en;q=0.5.
Accept-Encoding: gzip, deflate.
Cookie: csrftoken=[...].
Authorization: Basic [...].
Connection: keep-alive.

Хммм, может быть, это версия протокола.

Действительно, проблема в версии протокола. Как объясняет Марк Стосберг, неясно, поддерживает ли HTTP 1.0 сжатие или нет. какой является Понятно, что по умолчанию nginx поддерживает сжатие только для версии 1.1. Это можно изменить с помощью вариант конфигурации:

 gzip_http_version 1.0;

Похоже, это может быть проблема с HTTP 1.0 против HTTP 1.1. Документация о различиях включить это:

HTTP / 1.1 (в отличие от HTTP / 1.0) тщательно определяет заголовок Accept-Encoding, используемый клиентом, чтобы указать, какие кодировки контента он может обрабатывать, а какие предпочитает. Одна из сложных проблем - необходимость поддержки клиентов-роботов, которые пытаются создать зеркала ресурсов исходного сервера; другая проблема - необходимость взаимодействия с реализациями HTTP / 1.0, для которых Accept-Encoding был плохо определен.

Вот идея для перекрестной проверки. Возьмите Firefox и ab вне уравнения и отправлять необработанные HTTP-запросы, используя для этого специальный инструмент, например GET из libww-perl распространение. Вот пример синтаксиса для начала:

GET -sSe -H 'Connection: keep-alive' -H 'Accept-Encoding: gzip, default'  'http://example.com' | head -40

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