2013-04-14 3 views
22

Я пытаюсь включить сжатие gzip для компонентов моего сайта. У меня есть сервер Ubuntu 11.04 и nginx 1.2.
в моей конфигурации Nginx веб-сайте, у меня есть этотвключить сжатие gzip с nginx

 
gzip    on; 
#gzip_min_length 1000; 
gzip_http_version 1.1; 
gzip_vary on; 
gzip_comp_level 6; 
gzip_proxied any; 
gzip_types text/plain text/html text/css application/json application/javascript application/x-javascript text/javascript text/xml application/xml application/rss+xml application/atom+xml application/rdf+xml; 
#it was gzip_buffers 16 8k; 
gzip_buffers 128 4k; #my pagesize is 4 
gzip_disable "MSIE [1-6]\.(?!.*SV1)"; 

и YSlow и Google мера скорости советует мне использовать GZIP для снижения риска передачи по сети. теперь, когда я пытаюсь curl -I my_js_file я получил

 
curl -I http://www.albawaba.com/sites/default/files/js/js_367664096ca6baf65052749f685cac7b.js 
HTTP/1.1 200 OK 
Server: nginx/1.2.0 
Date: Sun, 14 Apr 2013 13:15:43 GMT 
Content-Type: application/x-javascript 
Content-Length: 208463 
Connection: keep-alive 
Last-Modified: Sun, 14 Apr 2013 10:58:06 GMT 
Vary: Accept-Encoding 
Expires: Thu, 31 Dec 2037 23:55:55 GMT 
Cache-Control: max-age=315360000 
Pragma: public 
Cache-Control: public 
Accept-Ranges: bytes 

любую идею о том, что я сделал неправильно или что должен я делать, чтобы получить сжатый контент?

+3

Может ли это быть вызвано этой строкой: 'gzip_http_version 1.1;'? Что произойдет, если вы измените его на «1.0»? –

+0

Спасибо Chuna за ваше предложение (thumb up :)) теперь прохождение google скорости не дает предупреждения, хотя curl -I дает тот же результат – Alaa

+0

, а google по-прежнему предоставляет http://www.albawaba.com/countries_list как несжатый, как скважина – Alaa

ответ

8

Я только что изменил gzip_http_version 1.1; - gzip_http_version 1.0;, а затем он работал

+0

Это работает и для меня. Знаете ли вы, почему это так? – Prabhakaran8737

+0

Здесь следует упомянуть, что этот ответ не является правильным решением проблемы, скорее всего, это будет обходным путем. Установка gzip_http_version в 1.0 может привести к некоторым проблемам, для получения дополнительной информации, например, https://serverfault.com/questions/418693/why-nginx-gzip-http-version-defaults-to-http-1-1 – MBI

3

Вам нужно запустить:

curl -I --compressed my_js_file 

сделать локон отправить заголовок Accept-Encoding для Gzip - сервер будет только сжимать содержимое, если клиент посылает заголовок, говорящий он примет его.

NB Вы можете написать:

gzip_disable "msi6" 

, а не с помощью регулярных выражений, чтобы отключить в IE 5.5 и 6, и вам не нужно указать текст/HTML как тип, так как он всегда сжимается до тех пор, Gzip активируется.

+0

curl --compressed --head http://www.albawaba.com/sites/default/files/js/js_367664096ca6baf65052749f685cac7b.js Дает: HTTP/1.1 200 OK Сервер: nginx/1.2.0 Дата: Вс, 14 апреля 2013 г. 16:59:34 GMT Content-Type: application/x-javascript – Alaa

+0

Я подозреваю, что это не полный вывод. Это заголовок Content-Encoding, который вам нужно проверить, а не Content-Type. Если я использую curl - сжатый на локальном сервере nginx, я получаю «Content-Encoding: gzip», но не заголовок Content-Encoding, если я не включаю параметр-сжатый – junichiro

+0

, возможно, слишком очевиден, но обязательно перезапустите веб-сервер после редактирования конфигурационного файла – junichiro

11

Я не могу найти что-то явно неправильное с вашей конфигурацией, обычно gzip на & gzip_types application/x-javascript будет достаточно для вас. Если все работает правильно, вы получите «Content-Encoding: gzip», который вернется к вам.

ПОЖАЛУЙСТА, ХРАНИТЕ В РАЗУМЕ: У меня гораздо больше согласованности с инструментами GOOGLE DEVELOPER (завиток просто не ведет себя так, как это делает браузер).

В Chrome щелкните правой кнопкой мыши и перейдите к разделу «Проверить элемент», затем перейдите в «сеть» (затем перезагрузите страницу, если вам нужно), затем щелкните ресурс и проверьте вкладку заголовка, вывод должен выглядеть так: (обратите внимание на содержание-кодирование GZIP, яй):

Request URL:https://ssl.gstatic.com/gb/js/sem_a3becc1f55aef317b63a03a400446790.js 
Request Method:GET 
Status Code:200 OK (from cache) 
Response Headersview source 
age:199067 
cache-control:public, max-age=691200 
content-encoding:gzip 
content-length:19132 
content-type:text/javascript 
date:Fri, 12 Apr 2013 06:32:58 GMT 
expires:Sat, 20 Apr 2013 06:32:58 GMT 
last-modified:Sat, 23 Mar 2013 01:48:21 GMT 
server:sffe 
status:200 OK 
vary:Accept-Encoding 
version:HTTP/1.1 
x-content-type-options:nosniff 
x-xss-protection:1; mode=block 

в любом случае, если вы уверены, что ваш контент не получает архивированная, я обычно встаю и работает довольно быстро со следующим:

## Compression 
gzip    on; 
gzip_buffers  16 8k; 
gzip_comp_level 4; 
gzip_http_version 1.0; 
gzip_min_length 1280; 
gzip_types  text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon image/bmp; 
gzip_vary   on; 

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

Не забудьте перезагрузить или перезагрузить nginx после изменения конфигурации.

Возможно также полезно проверить ваши журналы и посмотреть, есть ли что-то интересное, если вы все еще застряли.

+0

и yslow и google speed test показывают, что мои компоненты не сжаты .. см. Https://developers.google.com/speed/pagespeed/insights#url=http_3A_2F_2Fwww.albawaba.com_2F&mobile=false – Alaa

+0

Вы изменили конфигурацию и перезапустите nginx. Каковы были результаты? –

+0

уверен, что я сделал ,,, он дает тот же результат – Alaa

3

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

Вот файлы, которые браузер удаляет из этого домена. Номер справа - это размер загрузки файла.

Files served from domain

Вы не можете быть в состоянии сказать с экрана выстрела, но все файлы содержимого текста архивированная, за исключением JS файл вы упоминаете в своем вопросе. На скриншоте файл js - это файл зеленого цвета размером около 200K. Этот размер файла больше, чем вы указали для своих буферов gzip (128K).

Gzip module docs действительно не дают хорошего указания относительно того, для чего используются буферы gzip (используются ли буферы для несжатых или сжатых данных). Однако следующая публикация, по-видимому, указывает, что размер буфера должен быть больше, чем размер несжатого файла: Large files with NGINX, GZip, and SSL

+0

Спасибо Chue, я поднял gizip_buffers (как показано в вопросе выше [отредактирован]), и по-прежнему та же проблема. Пожалуйста, сообщите, если у вас есть мысли – Alaa

+0

, кстати, я очень ценю вашу помощь, но даже coutries_list не имеют был gzipped, хотя он меньше, чем 128K ... – Alaa

+0

@Alaa - Вы правы, что country_list не был gzipped. Я пропустил это. У меня есть тестовая установка nginx, где я помещаю оба файла, и они оба gzipped. Моя конфигурация gzip имеет только две строки: 'gzip on' и' gzip_types ... '. Кроме того, возможно ли, что файлы кэшируются прокси-сервером перед вашим сервером nginx? Можете ли вы попробовать завихнуться на машине nginx ('curl ... http: //127.0.0.1 /.../ js_36..js')? –

19

Как уже писали другие, недостаточно включить сжатие gzip на вашем сервере - клиенту также необходимо запросить он в своих запросах через заголовок Accept-Encoding: gzip (или его надмножество). Современные браузеры включают этот заголовок автоматически, но для завитка вам необходимо включить одно из следующих действий в вашей команде:

  • -H "Accept-Encoding: gzip": Вы должны увидеть заголовок Content-Encoding: gzip в ответ (возможно, потребуется для вывода заголовков с локон-х -v флаг), а также некоторые, казалось бы, искаженные результаты для содержимого, фактический поток gzip.
  • --compressed: В заголовках ответов вы должны увидеть Content-Encoding: gzip, но завиток знает, как распаковать содержимое перед его выходом.
+4

Странная вещь. Мой Nginx в экземпляре AWS Ubuntu не устанавливает заголовок Content-Encoding: gzip', когда я делаю запрос из браузера. Но когда я делаю «curl -H» Accept-Encoding: gzip «-I http: // example.com', Nginx устанавливает« Контент-кодирование: gzip' »просто отлично. Зачем? И содержимое кажется gziped, хотя заголовок не установлен. Я проверил с помощью Google PageSpeed, и он не жалуется на отсутствие gzip. – Green

+0

Трудно сказать. Различные серверы имеют различную логику вокруг этого, например. некоторые черные списки определенных User-агентов или Content-типов из gzip-кодирования. В других случаях это может быть, но браузер скрывает его от пользователя. Так что это действительно зависит. :) – lot

+0

Я испытываю такое же поведение, как @Green, Nginx сообщает о сжатии gzip в журналах, а для запросов CURL я вижу заголовок 'Content-Encoding: gzip' в ответах, но не тогда, когда запросы сделаны из браузера , на вкладке Сеть в инструментах разработчика Chrome. – Marc

1

Как и в случае с Alaa, мне пришлось добавить gzip_http_version 1.0; (эта версия не указана ранее), чтобы она работала (я пробовал Firefox 27.0.0).

3

мне пришлось включить GZIP в моей конфигурации /etc/nginx/nginx.conf:

gzip on; 
gzip_disable "msie6"; 

gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript; 

Пожалуйста, обратите внимание, что я должен был добавить application/javascript к стандартной gzip_types конфигурации.

2

Вот моя конфигурация nginx и она работает.

gzip    on; 
gzip_min_length  1000; 
gzip_buffers  4 8k; 
gzip_http_version 1.0; 
gzip_disable  "msie6"; 
gzip_types   text/plain text/css application/json application/javascript application/x-javasc ript text/xml application/xml application/xml+rss text/javascript; 
gzip_vary   on; 

Я думаю, что это ключевые точки gzip_disable, gzip_disable и gzip_types.

Смежные вопросы