В данной статье я опишу, как настроить HttpGzipModule на Nginx (на Squeeze Debian). HttpGzipModule позволяет Nginx сжимать файлы и отправлять их клиентам (например, браузерам), которые могут обрабатывать сжатый контент. С HttpGzipModule, вы можете сжимать HTML, CSS, Javascript, текст или XML-файлы на 20 - 30% от их первоначального размера, таким образом, экономя трафик сервера и сделать пользователей модемов счастливее.
При включенном сжатии файлов немного выше нагрузка на сервер, но по моему опыту, это компенсируется временем подключения клиентов к серверу. Например пользователь модема загружает несжатый хтмл файл за 7 секунд, а сжатый за 2.
При использовании HttpGzipModule вы не должны бояться, что вы потеряете пользователей со старыми браузерами, которые не могут обрабатывать сжатый контент. Прежде всего браузер уточняет, сжатый или несжатый котнтент ему нужен, и сервер передает ему соответствующий.
Я предполагаю, что у вас есть рабочий Nginx на вашем сервере Debian Squeeze
Открываем /etc/nginx/nginx.conf:
vi /etc/nginx/nginx.conf
Вы увидите, что GZIP сжатие уже включено (в разделе http {}):
[...]
http {
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 2;
tcp_nodelay on;
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
[...]
|
gzip on; включает GZIP сжатие.
gzip_disable "MSIE [1-6]\.(?!.*SV1)"; отключает GZIP сжатие для браузеров, которые не поддерживают (в данном случае MS Internet Explorer до версии 6 SV1).
Конечно, мы можем точно настроить эту конфигурацию (вы можете найти список возможных директив конфигурации на http://wiki.nginx.org/HttpGzipModule ):
gzip_http_version 1.1; - Это позволяет GZIP сжатие HTTP-запроса версии 1.1. Как Content-Length заголовок не установлен, это сделает невозможным поддержку активности с версии 1.0.
gzip_vary on; - Это устанавливает заголовок ответа Vary: Accept-Encoding. Некоторые прокси-сервера допускают ошибка в том, что они отдают сжатый контент для браузеров, которые не поддерживают его. Устанавливая заголовок Vary: Accept-Encoding, вы указываете прокси-серверу для хранения как сжатой и несжатой версии контента.
gzip_comp_level 6; - Это уровень сжатия (от 1 до 9), где 1 степень сжатия (быстрая) и 9 самая медленная
gzip_proxied any; - Это настроит то, каким образом запросы, приходящие от прокси должны быть обработаны. any - включить сжатие для всех запросов.
gzip_types text/plain text/html text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js; - Это говорит Nginx, какие типы файлов сжимать (text/html всегда сжаты). Так как Javascript файлы могут иметь различные типы файлов на каждом сервере, я включил несколько возможных Javascript MIME типов (то же самое относится и к XML).
gzip_buffers 16 8k; - Это назначает количество и размер буферов сжатия. По умолчанию
gzip_buffers 4 4k; или gzip_buffers 4 8k;, но я увеличил это значение, для сжатия джаваскрипт файлов крупного размера
Так что моя окончательная конфигурация выглядит следующим образом:
[...]
http {
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 2;
tcp_nodelay on;
gzip on;
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/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js;
gzip_buffers 16 8k;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
[...]
|
Перезагрузить Nginx:
/etc/init.d/nginx reload
Для проверки вашей конфигурации, вы можете установить плагин для Firefox Live HTTP Headers. В выводе заголовков HTTP, вы должны увидеть, что клиент (Firefox) направил Accept-Encoding: gzip,deflate заголовок, чтобы указать серверу, что он принимает сжатый контент в форматах gzip и deflate; сервер должен сжать файл и отправить его с заголовком Content-Encoding: gzip (как вы видите на этом примере, Nginx также устанавливает Vary: Accept-Encoding в заголовке):