27 марта 2009 г. GZip Nginx Оптимизация

Настройка Gzip в Nginx

nginx_gzip_small

Модуль ngx_http_gzip_module - это фильтр, сжимающий ответ методом gzip, что позволяет уменьшить размер передаваемых данных в 2 и более раз.

Включаем GZip в Nginx, в файле /usr/local/etc/nginx/nginx.conf

http {

    ...

    # Включение модуля
    gzip             on;

    # Минимальная длина ответа, при которой модуль будет жать, в байтах
    gzip_min_length  1000;

    # Разрешить сжатие для всех проксированных запросов 
    gzip_proxied     any;

    # MIME-типы которые необходимо жать
    #gzip_types text/plain text/html text/xml application/xml application/x-javascript text/javascript text/css text/json;
    # Если у вас появляются варнинги, типа "duplicate MIME type text/html", то вам стоит исключить text/html
    #gzip_types text/plain text/xml application/xml application/x-javascript text/javascript text/css text/json;

    # Запрещает сжатие ответа методом gzip для IE6
    gzip_disable     "msie6";

    # Уровень gzip-компрессии
    gzip_comp_level  8;

    ...

}

Полное описание всех директив модуля http://sysoev.ru/nginx/docs/http/ngx_http_gzip_module.html.
Не забудьте перезапустить Nginx!

Комментарии

Казахстанский налогоплательщик 6 апреля 2009 г. 21:51

Не думаю, что установка gzip_comp_level 8; разумная, лучше 6, а если процессор не шустрый, то еще чуть меньше. Там разница в процентах, но время генерации намного выше. А так, спасибо.

P.S. Ну и gzip_min_length 1000; можно поиграться, на малых файлах отдача не заметна. Нужно смотреть какие файлы преобладают среди маленьких и как сжимаются. но меньше явно делать не стоит, если процессор слабый, то можно увеличить, я думаю

В http://adw0rd.ru/2008/mod_deflate/ я рассказывал про инструмент для расчета степени gzip-сжатия, я им пользуюсь, однако надо всегда опираться на конкретный случай :)

Из MIME-типов, которые необходимо жать, надо удалить text/html - nginx в последних версиях делает это по дефолту.

Было бы интересно ещё почитать про всякие фичи энжайныкса типа реакции на повышенный LA или на всякие другие интересные события.

а это при ребуте нджинкса

[warn]: duplicate MIME type "text/html" in /usr/local/etc/nginx/nginx.conf:43

(ругается на gzip_types)

в порядке вещей?

Выполните

grep -R "text/html" /usr/local/etc/nginx/

и думаю все станет понятно

ну так у вас тоже так?)

Нет, у меня не так,
но я знаю хост у которого так и там админам пофиг :)

У меня та же байда появилась с warning после включения gzip. Как убрать?

Уберите объявление text/html и все

Спасибо, я уже разобрался, в последних версиях nginx text/html сжимается автоматом, так что сделал так:

gzip_types text/plain application/xhtml+xml text/xml application/xml application/xml+rss text/json;

Только почему вы в статье оставили? Может сделать пометку?

Сжатие js и css я убрал, вместо него сжимаю скрипты вручную и использую gzip_static on;, если в папке есть .css.gz или .js.gz, то nginx отдает их за место оригинальных причем сверяется дата и если оригинальный новее, то отдается он, а не архивная версия. Таким образом снизил нагрузку на сервер:)

Оставил так как вроде должно быть понятно где ошибка и так, по крайней мере мне сразу стало ясно.
Но судя по камментам надо добавить пометку :)

Здравствуйте. Помогите пожалуйста включить сжатие на связке nginx+apache. Вот что мне ответили в поддержке: На наших серверах работает связка nginx+apache. Через nginx отдаются статические файлы с расширениями: jpg,jpeg,gif,png,css,zip,tgz,gz,rar,bz2,doc,xls,exe,pdf,ppt,txt,tar,mid,midi,wav,bmp,rtf,js,swf,f4v,flv,avi,wmv,mp3,mp4

Это значит файлы не обрабатываются через apache и если есть какие-то директивы в файле .htaccess, то они тоже не подействуют, чтобы apache мог обработать данные файлы нужно давать ссылки на несуществующие файлы, в этом случае, запрос будет передаваться web серверу apache, соответсвенно можно будет использовать директивы .htaccess для обработки этих запросов.

Более понятного ответа я не добился. На сервере лежат сжатые css и js файлы, но они не загружаются. Подскажите что прописать в .htaccess&

Думаю имелось в виду нечто такое:
/static/css/screen.css -> отдается самим nginx
/some/path/getcss.php?file=screen.css -> nginx не станет обрабатывать, так как у файла нет расширения css, поэтому уйдет управление на apache

далее, вам надо либо написать правило с регуляркой для apache, либо создать файл /some/path/getcss.php с содержимым:


<?php
$PATH_TO_CSS = '/other/some/path/to/css/';
echo file_get_contents(PATH_TO_CSS . $_GET['file']);
exit;
  • можно переписать этот скрипт, чтобы он отдавал правильный заголовок "text/css"

ps. Написать правило в .htaccess более правильное решение с первого взгляда. Как именно его написать я уже не впомню, так как не пользуюсь уже давно apache вообще, можете спросить как это вам сделать на форуме http://pyha.ru/forum/

gochankot@gmail.com 31 марта 2017 г. 11:40

Сории за некропостинг

Здравствуйте. Помогите пожалуйста включить сжатие на связке nginx+apache. Вот что мне ответили в поддержке: На наших серверах работает связка nginx+apache. Через nginx отдаются статические файлы с расширениями: jpg,jpeg,gif,png,css,zip,tgz,gz,rar,bz2,doc,xls,exe, pdf,ppt,txt,tar,mid,midi,wav,bmp,rtf,js,swf,f4v,flv,avi,wmv,mp3,mp4

Это значит файлы не обрабатываются через apache и если есть какие-то директивы в файле .htaccess, то они тоже не подействуют, чтобы apache мог обработать данные файлы нужно давать ссылки на несуществующие файлы, в этом случае, запрос будет передаваться web серверу apache, соответсвенно можно будет использовать директивы .htaccess для обработки этих запросов.

Более понятного ответа я не добился. На сервере лежат сжатые css и js файлы, но они не загружаются. Подскажите что прописать в .htaccess&

Вообще-то выход есть

location ~* ^.+\.(jpg|jpeg|gif|png|ico|bmp|svg|swf|zip|tgz|gz|rar|bz2?|tar|doc|xls|ppt|pdf|rtf|exe|txt|wav|mp3|ogg|flv|mpe?g|avi|mp4|css|js)$
    root /www/***/data/www/***;
    error_page 404 = @fallback;
}

location @fallback {
    proxy_pass http://127.0.0.1:81;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
}

То есть если у вас есть статика то отдает nginx, а если её нет (404 ошибка) то переправляем запрос на apache ;)

Оставьте свой комментарий

Markdown