
Включить сжатие gzip и кэширование в Nginx и Apache
Сейчас, все браузеры поддерживают сжатия (картинок, файлов), т.к. он является частью спецификации протокола HTTP 1.1. Такое сжатие, а именно сжатие текстовых форматов (например CSS, Javascipt или HTML) сможет уменьшить их объем до 70%. Работает это следующим образом:
Прежде чем отправить ответ, сервер выполняет сжатие данных, при получения сжатого ответа от сервера браузер выполняет обратную процедуру и разжимает сжатый контент и выводит результат.
<img src=»http://linux-notes.org/wp-content/uploads/2015/03/gzip-v-nginx-i-apache.jpg» alt=»gzip в nginx и apache» width=»978″ height=»569″ srcset=»https://linux-notes.org/wp-content/uploads/2015/03/gzip-v-nginx-i-apache.jpg 978w, https://linux-notes.org/wp-content/uploads/2015/03/gzip-v-nginx-i-apache-300×175.jpg 300w, https://linux-notes.org/wp-content/uploads/2015/03/gzip-v-nginx-i-apache-900×524.jpg 900w» sizes=»(max-width: 978px) 100vw, 978px» />
И в своей теме «Включить сжатие gzip в Nginx и Apache» я расскажу как можно настроить веб-сервер (apache или nginx) с поддержкой сжатия.
Сжатие на веб-сервере Nginx
Если используете Linux (Debian/Ubuntu/Mint или CentOS/RedHat/Fedora) то путь к файлу конфигурации будет:
# vim /etc/nginx/nginx.conf
При использовании FreeBSD путь к файлу конфигурации лежит в:
# vim /usr/local/etc/nginx/nginx.conf
Если хотите использовать сжатие, то необходимо в файл сервера или в отдельный виртуальный хост прописать следующие строки:
#GZIPgzip on;gzip_min_length 1000;gzip_proxied expired no-cache no-store private auth;gzip_types text/plain application/xml;# Выделяем буфер для gzipgzip_buffers 32 4k;# Устанавливаем уровень сжатия, от 1-9gzip_comp_level 9;# Убираем поддержку IE6gzip_disable "msie6";# Устанавливаем версию для использования gzip (1.0 или 1.1)gzip_http_version 1.1;# Разрешаем использовать статикуgzip_static on;gzip_vary on;gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml;
Кэширование в Nginx
Так же, настраиваем кэширование (которое включается с опцией expires) для заголовки для картинок и статических файлов в nginx. Мой конфиг выглядит следующим образом:
# Хранить кэш 24ч1 суткиexpires 86400s;# Добавляем заголовки (хеадеры)add_header Pragma public;add_header Cache-Control "max-age=86400, public, must-revalidate, proxy-revalidate";#add_header "X-UA-Compatible" "IE=Edge,chrome=1";# Правила rewrite для версированного CSS + JS через дериктиву filemtimelocation ~* ^.+.(css|js)$ {rewrite ^(.+).(d+).(css|js)$ $1.$3 last;# Задаем сколько будет храниться кэшexpires 31536000s;# Выключаем логированиеaccess_log off;log_not_found off;# Добавляем заголовки (хеадеры)add_header Pragma public;add_header Cache-Control "max-age=31536000, public";}# Агрессивное кэширование для статических файловlocation ~* .(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|ogv|otf|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|t?gz|tif|tiff|ttf|wav|webm|wma|woff|wri|xla|xls|xlsx|xlt|xlw|zip)$ {# Задаем сколько будет храниться кэш·expires 31536000s;# Выключаем логирование·access_log off;log_not_found off;# Добавляем заголовки (хеадеры)add_header Pragma public;add_header Cache-Control "max-age=31536000, public";}
Это включит кэш на веб-сервере на максимальный период для всех перечисленных файлов.
Сжатие на веб-сервере Apache
По умолчанию модуль mod_deflate должен быть включен в apache. Но лучше убедиться и выполнить проверку и поискать следующую строку в конфиге веб-сервера apache:
LoadModule deflate_module modules/mod_deflate.so
Мы можем определить, какие типы файлов нужно сжать:
AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript
Пропишите следующую конфигурацию в виртуальный хост Apache и это включит сжатие mod_deflate для вашего сайта.
<Directory /var/www/html/><IfModule mod_mime.c>AddType application/x-javascript .jsAddType text/css .css</IfModule><IfModule mod_deflate.c># Compress HTML, CSS, JavaScript, Text, XML and fontsAddOutputFilterByType DEFLATE application/javascriptAddOutputFilterByType DEFLATE application/rss+xmlAddOutputFilterByType DEFLATE application/vnd.ms-fontobjectAddOutputFilterByType DEFLATE application/x-fontAddOutputFilterByType DEFLATE application/x-font-opentypeAddOutputFilterByType DEFLATE application/x-font-otfAddOutputFilterByType DEFLATE application/x-font-truetypeAddOutputFilterByType DEFLATE application/x-font-ttfAddOutputFilterByType DEFLATE application/x-javascriptAddOutputFilterByType DEFLATE application/xhtml+xmlAddOutputFilterByType DEFLATE application/xmlAddOutputFilterByType DEFLATE font/opentypeAddOutputFilterByType DEFLATE font/otfAddOutputFilterByType DEFLATE font/ttfAddOutputFilterByType DEFLATE image/svg+xmlAddOutputFilterByType DEFLATE image/x-iconAddOutputFilterByType DEFLATE text/cssAddOutputFilterByType DEFLATE text/htmlAddOutputFilterByType DEFLATE text/javascriptAddOutputFilterByType DEFLATE text/plainAddOutputFilterByType DEFLATE text/xml#The following line is enough for .js and .cssAddOutputFilter DEFLATE js cssAddOutputFilterByType DEFLATE text/plain text/xml application/xhtml+xml text/css application/javascript application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php application/x-httpd-fastphp text/html</IfModule><IfModule mod_setenvif.c># Удалить ошибки браузера (требуется только для очень старых браузеров)BrowserMatch ^Mozilla/4 gzip-only-text/htmlBrowserMatch ^Mozilla/4.0[678] no-gzipBrowserMatch bMSIE !no-gzip !gzip-only-text/html</IfModule><IfModule mod_headers.c>·Header append Vary User-Agent env=!dont-vary</IfModule>·<ifModule mod_gzip.c>mod_gzip_on Yesmod_gzip_dechunk Yesmod_gzip_item_include file .(html?|txt|css|js|php|pl)$mod_gzip_item_include handler ^cgi-script$mod_gzip_item_include mime ^text/.*mod_gzip_item_include mime ^application/x-javascript.*mod_gzip_item_exclude mime ^image/.*mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*</ifModule></Directory>
Используем кеш на стороне браузера в Apache
Как только пользователь откроет сайт будут скачиваться не только код страницы с html страницы, и так же css, картинки, js. И одно открытие страницы файла обращается к серверу от нескольких десятков и аж до нескольких сотен! такие запросы очень нагружают сервер, и так же дают дополнительное время на загрузку страницы у пользователя.
Создаем файлик .htaccess в своей домашней директории сайта и добавляем:
# кеширование в браузере на стороне пользователя<IfModule mod_expires.c>#Включаем поддержку директивы ExpiresExpiresActive On# Задаем время для хранения файлов (картинок) в кэше для каждого типаExpiresDefault "access 7 days"ExpiresByType application/javascript "access plus 1 year"ExpiresByType text/javascript "access plus 1 year"ExpiresByType text/css "access plus 1 year"ExpiresByType text/html "access plus 7 day"ExpiresByType text/x-javascript "access 1 year"ExpiresByType image/gif "access plus 1 year"ExpiresByType image/jpeg "access plus 1 year"ExpiresByType image/png "access plus 1 year"ExpiresByType image/jpg "access plus 1 year"ExpiresByType image/x-icon "access 1 year"ExpiresByType application/x-shockwave-flash "access 1 year"</IfModule># Cache-Control<ifModule mod_headers.c># Задаем 30 дней для данного типа файла<filesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">Header set Cache-Control "max-age=2592000, public"</filesMatch># Задаем 30 дней для данного типа файла<filesMatch ".(css|js)$">Header set Cache-Control "max-age=2592000, public"</filesMatch># Задаем 2 дня для данного типа файла<filesMatch ".(xml|txt)$">Header set Cache-Control "max-age=172800, public, must-revalidate"</filesMatch># Задаем 1 день для данного типа файла<filesMatch ".(html|htm|php)$">Header set Cache-Control "max-age=172800, private, must-revalidate"</filesMatch></ifModule># использование кеша браузеровFileETag MTime Size<ifmodule mod_expires.c><filesmatch ".(jpg|jpeg|gif|png|ico|css|js)$">ExpiresActive onExpiresDefault "access plus 1 year"</filesmatch></ifmodule>#Запрет отдачи HTTP-заголовков Vary браузерам семейства MSIE<IfModule mod_setenvif.c>BrowserMatch "MSIE" force-no-varyBrowserMatch "Mozilla/4.[0-9]{2}" force-no-vary</IfModule>
Проверка gzip и кэширования в Nginx и Apache
Создаем тестовый файл php_info.php в домашней директории вашего сайта со следующими строками:
<?phpphpinfo();?>
И открыв его в браузере по ссылке вида http://host_or_IP/php_info.php посмотреть что есть в поле “Loaded Modules“, вы должны увидеть там что-то вроде:
Использование кеша на стороне браузера apache
Если в списке нет mod_expires или mod_headers – выполните в консоли сервера (подключившись по ssh) по очереди следующие команды (это установит/включит mod_expires, mod_headers):
#·a2enmod headers# a2enmod expires# service apache2 restart
Для индексной странички видим, что gzip включён, но для URL из js нет:
$ curl -I -H 'Accept-Encoding: gzip,deflate' http://linux-notes.org/ | grep gzip
А после добавления gzip_types получаем такое:
$ curl -I -H 'Accept-Encoding: gzip,deflate' http://linux-notes.org/test/test.js
ИЛИ еще:
#·curl --header "Accept-Encoding: gzip,deflate,sdch" -I http://linux-notes.orgHTTP/1.1 200 OKServer: nginxDate: Thu, 25 Jun 2015 11:27:22 GMTContent-Type: text/html; charset=UTF-8Connection: keep-aliveVary: Accept-EncodingSet-Cookie: wfvt_3183169984=558be599d6523; expires=Thu, 25-Jun-2015 11:57:21 GMT; path=/; httponlyX-Pingback: http://linux-notes.org/xmlrpc.phpX-UA-Compatible: IE=edge,chrome=1Expires: Fri, 26 Jun 2015 11:27:22 GMTCache-Control: max-age=86400Pragma: publicCache-Control: max-age=86400, public, must-revalidate, proxy-revalidateContent-Encoding: gzip
Проверка Gzip онлайн ресурсами
Теперь, как на сайт были внесены изменения, давайте протестируем онлайновым инструментом, чтобы убедиться что GZIP работает правильно.
http://checkgzipcompression.com/
http://www.whatsmyip.org/http-compression-test/
На этом все, я завершаю свою тему «Включить сжатие gzip и кэширование в Nginx и Apache».
Was this helpful?
0 / 0