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
Вы можете увидеть, как добавить больше заголовков, чтобы они соответствовали вашему запросу оттуда.