Файлы кэша не создаются nginx. Кэширование браузера Nginx

Не всегда бывает достаточно внесения правок в.htaccess файл для включения жизненно-необходимых для быстрой работы сайта функций, как сжатие и кеширование браузером. Особенно если у вас сервер на NGINX.

Приведу пример для включения этого функционала.

Сразу сделаем оговорку. Вы должны иметь доступ к файл nginx.conf из каталога /usr/local/nginx/conf , или /etc/nginx , или /usr/local/etc/nginx , в зависимости от ОС. Это подразумевает что у Вас выделенный или виртуальный сервер. На обычных хостингах может помочь только обращение в техническую поддержку.

Сжатие GZIP для сайта на NGINX

Выглядит это следующим образом

Http { #buffer_size, разные include и прочие общие настройки gzip on; gzip_min_length 1000; gzip_proxied any; gzip_disable "MSIE \.(?!.*SV1)"; gzip_types text/plain text/xml application/xml application/x-javascript text/javascript text/css text/json; gzip_comp_level 1; server { #настройки каждого из сайтов на сервере } }

Таким образом для всех сайтов на сервере включается сжатие.

Кеширование браузером

Для кеширования необходимы следующие изменения:

Location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ { expires 30d; #Остальные директивы }

Таким образом решается эта простая проблема, которая становится порой серьезной головной болью вебмастеров, плохо знакомых с работой системного администратора Linux.

Не так давно мне довелось поработать на одном сайте, который находился не на хостинге, а на выделенном сервере. Одно из отличий первого от второго – это то, что на выделенном сервере вы можете сделать более тонкие настройки.

Как вы поняли из заголовка, задача была настроить кэширование и GZIP-сжатие на таком сайте, и сейчас я расскажу вам, как это сделать.

Все операции мы проводим в файле конфигураций, который находится по адресу:

/etc/nginx/nginx.conf

В простом FTP вы можете не найти папку ect , для этого воспользуйтесь стандартным менеджером файлов, который находится в панели управления сервером.

Настраиваем GZIP-сжатие на сайте в Nginx

После того как файл конфигурации открыт, в нем нас будут интересовать две секции: это http {…} и server {…}.

Для включения GZIP-сжатия на вашем сайте в секцию http, сразу после «http { », вставьте:

Gzip_static on; gzip on; gzip_buffers 16 8k; gzip_comp_level 9; gzip_min_length 1024; gzip_types text/css text/plain text/json text/x-js text/javascript text/xml application/json application/x-javascript application/xml application/xml+rss application/javascript; gzip_disable "msie6"; gzip_vary on; gzip_http_version 1.0;

Если какие-то из строк уже есть в этой секции, то удалите их. Таким способом мы включили GZIP-сжатие на сайте. Вы также можете поиграть с настройками параметра «gzip_comp_level 9 ». Здесь «9 » – это максимальный уровень сжатия, а минимально возможный – «1 ».

Максимальный уровень требует немного больше ресурсов. Если после включения сжатия вы наблюдаете небольшие зависания сайта, то измените «9 » на «5 » - оптимальное значение.

Настраиваем кэширование файлов на сайте в Nginx

Для настройки кэширования файлов мы будем вносить изменения в секции server.

Для этого сразу после «server { » вставьте:

Location ~* ^.+.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|js|woff|ttf|svg|swf|mp3|ogg|avi|zip|rar)$ { try_files $uri $uri/ @fallback; expires 7d; }

Здесь «expires 7d; » – это количество дней, которым нужно кэшировать файлы (в нашем случае – 7 дней). Список необходимых файлов вы можете отредактировать сами, а также дополнить его необходимыми форматами.

После того как все необходимые настройки сделаны, вам необходимо перезапустить Nginx.

Для этого в SSH Terminal"e выполните команду:

Service nginx restart

На этом мы заканчиваем настройку, направленную на ускорение работы вашего сайта.

На не слишком загруженных сайтах благодаря браузерному кэшированию и предварительному сжатию данных можно и вовсе обойтись без плагинов кэширования. Однако в этом посте даны директивы, которые актуальны только для хостинга, на котором работает HTTP-сервер Apache. Некоторые хостеры ради экономии серверных ресурсов отключают Apache или вовсе не устанавливают его, предпочитая настраивать только менее прожорливый веб-сервер Nginx. Давайте посмотрим, как можно настроить предварительное сжатие и браузерное кэширование, если на вашем хостинге работает только Nginx.

1. Предварительное сжатие
Перед тем, как отдать содержимое страниц в браузер посетителя, можно его сжать. Сжатие уменьшает размер передаваемых файлов (иногда в несколько раз), что приводит к увеличению скорости загрузки страниц и уменьшению исходящего трафика. Сжимать нужно только файлы, содержащие текстовую часть - текст, HTML, PHP, JS, XML, и прочие подобные. Текст хорошо сжимается даже при низком уровне компрессии, объем передаваемых фалов уменьшается на 50-80%. Конечно, файлы небольшие, всего десятки килобайт, но если учесть, что таких фалов тысячи, и загружаются они тысячами посетителей каждый день, то, как говорят, с миру по нитке - нищему на воротник, экономия получается существенная.

1-1. Предварительное сжатие / Apache
Для тех, у кого установлен Apache, нужно узнать у хостера, какие специальные модули, реализующие его, установлены - mod_pagespeed или mod_deflate? Обычно в Apache 2x устанавливают mod_deflate. Есть еще mod_gzip, но его устанавливали в предыдущих версиях, так что его встретить маловероятно.

Если установлен модуль mod_pagespeed, то в файл.htaccess, находящийся в корне вашего сайта, нужно вставить:


ModPagespeed on
# using commands,filters etc

Если установлен модуль mod_deflate, то то в файл.htaccess, находящийся в корне вашего сайта, нужно вставить:


AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript


В данном случае сжатию подвергаются все текстовые файлы - txt, html, xml, xhtml, css, js.

Или в httpd.conf находящийся в /usr/local/ets/Apache22/:


AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css

BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0 no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html


После чего обязательно нужно перезапустить апач

/usr/local/etc/rc.d/apache22 restart

1-2. Предварительное сжатие / Nginx
Если хостинг работает под управлением Nginx, то директивы будут выглядеть иначе. В файл.htaccess, находящийся в корне вашего сайта, нужно вставить:

server {
gzip on;
gzip_types text/html text/css application/x-javascript text/plain text/xml image/x-icon;
}

1-3. Предварительное сжатие / Скрипт
Бывает так, что сервер, обеспечивающий работу вашего блога, не поддерживает mod_deflate или mod_gzip. В этом случае можно прибегнуть к универсальному скрипту, который работает и на Apache, и на Nginx.

В основном файле используемого вами движка, в самое его начало, первой строкой нужно вставить:

function isClientSupportGzip() {
if (headers_sent() || connection_aborted()) return false;
if (stripos(getenv("HTTP_ACCEPT_ENCODING"), "gzip") === false) return false;
if (stripos(getenv("HTTP_USER_AGENT"), "konqueror") !== false) return false;
return true;
}

If (isClientSupportGzip()) {
ob_start("ob_gzhandler");
}
else {
ob_start();
}


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

2. Браузерное кэширование
Наряду со сжатием можно давать браузеру команду использовать кэшированную копию. Зачем каждый раз качать файлы с сайта, если они не с момента последнего посещения не изменились? Лучше отслеживать изменения файлов, и скачивать только те, которые им подверглись, а те, что остались с последнего захода на сайт не измененными, брать их кэша. Этот способ позволяет существенно сократить трафик между браузером посетителя и хостингом сайта, что приводит к сокращению времени загрузки страниц. Особенно заметен прирост в скорости на страницах с картинками. Действительно, картинки меняются на сайте очень редко, и зачем их каждый раз закачивать, есди они уже есть в кэше браузера?

2-1. Браузерное кэширование / установки заголовков / Apache
Apache обеспечивает браузерное кэширование с помощью модулей mod_expires и mod_headers: mod_expires определяет время актуальности кэшированных данных, а mod_headers - их публичную доступность. Совместная работа приводит к гибкой проверке данных перед скачиванием: браузер получает специальные заголовки, по ним определяет, устарели ли данные, которые находятся у него в кэше с момента последнего посещения страницы, и если они устарели, то обновляет их, закачивания новые версии файлов, а если не устарели, то отображает файлы из своего кэша, не скачивая с сервера.

Если у вас работает Apache, для установки заголовков Expires добавьте в файл.htaccess:


ExpiresActive On
ExpiresDefault "access plus 5 seconds"
ExpiresByType image/x-icon "access plus 2592000 seconds"
ExpiresByType image/jpeg "access plus 2592000 seconds"
ExpiresByType image/png "access plus 2592000 seconds"
ExpiresByType image/gif "access plus 2592000 seconds"
ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType text/javascript "access plus 216000 seconds"
ExpiresByType application/javascript "access plus 216000 seconds"
ExpiresByType application/x-javascript "access plus 216000 seconds"
ExpiresByType text/html "access plus 600 seconds"
ExpiresByType application/xhtml+xml "access plus 600 seconds"


В данном случае актуальность кэша для разных фалов указана в секундах.

Если у вас работает Apache, для установки для установки заголовка Cache-control добавьте в файл.htaccess:






Header set Cache-Control "public"


Header set Cache-Control "private"


Header set Cache-Control "private, must-revalidate"


В данном случае проверяется актуальность в кэше файлов ico, jpg, jpeg, png, gif, swf, css, js, html, xhtml, php.

2-2. Браузерное кэширование / Nginx
Если у вас нет Apache, но есть Nginx, то для того, чтобы указать браузеру брать закэшированные данные, нужно вставить в конфиг nginx следующие строки:

location ~* \.(jpg|png|gif|jpeg|css|js)$ {
expires 24h;
}


В данном случае актуальность кэша 24 часа, а типы проверяемых файлов указаны перечислением - jpg, png, gif, jpeg, css, js.

Вот собственно и все основы, удачного ускорения ваших сайтов! ;)

Давно минули те старые добрые времена, когда сайты были сделаны на голом HTML и их страницы весили несколько десятков килобайт. А интернет был на dial-up.

Страницы современных сайтов весят уже несколько сотен килобайт, а частенько и несколько мегабайт. Картинки, скрипты, файлы стилей CSS - всё это непременные атрибуты нормального современного сайта и без них никак. А весит всё это «счастье» совсем не мало, и каждый раз посетители, зашедшие на ваш сайт, загружают всё это на свой компьютер. И пока загрузка не завершится, в браузере страница не откроется.

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

Настройка сжатия данных посредством Nginx.

Открываем файл конфигурации Nginx, расположенный по адресу /etc/nginx/nginx.conf

И в секцию http {…}, которая находится в начале файла добавляем то, чего там нет из примера ниже:

Gzip on; gzip_static on; gzip_comp_level 5; gzip_min_length 1024; gzip_proxied any; gzip_types text/plain application/xml application/x-javascript text/javascript text/css text/json;

Настройка кэширования статических файлов в кэше браузера пользователя, посредством Nginx.

В том же файле /etc/nginx/nginx.conf спускаемся ниже, находим конструкцию server для нужного сайта и дописываем туда:

Location ~* ^.+.(jpg|jpeg|gif|png|ico|css|pdf|ppt|txt|bmp|rtf|js)$ { root /var/www/user/data/www/site.ru; expires 7d;

где expires 7d - это количество дней, сколько кэш статических файлов должен храниться на компьютере пользователя. Если вы не вносите правки в css, js, файлы своего сайта и не меняете картинки, то имеет смысл этот параметр увеличить, вплоть до нескольких месяцев или даже до года.

Для наглядности приводим участок секции server из сервера, в котором Nginx был установлен стандартными средствами панели ISPmanager:

Server { server_name site.ru www.site.ru; listen 111.121.152.21; disable_symlinks if_not_owner from=$root_path; set $root_path /var/www/user/data/www/site.ru; location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ { root $root_path; access_log /var/www/nginx-logs/user isp; access_log /var/www/httpd-logs/site.ru.access.log ; error_page 404 = @fallback; }

А теперь мы добавим сюда expires 7d , теперь это будет выглядеть вот так:

Server { server_name site.ru www.site.ru; listen 111.121.152.21; disable_symlinks if_not_owner from=$root_path; set $root_path /var/www/user/data/www/site.ru; location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ { root $root_path; expires 7d; access_log /var/www/nginx-logs/user isp; access_log /var/www/httpd-logs/site.ru.access.log ; error_page 404 = @fallback; }

Перезагружаем Nginx командой:

Service nginx restart

Заходим на свой сайт и радуемся, он теперь стал загружаться в несколько раз быстрее. А вес страниц сайта снизился с нескольких мегабайт до пары десятков килобайт!

Данная статья будет полезна для владельцев виртуальных и выделенных серверов, так как у пользователей виртуального хостинга нет доступа к редактированию конфигурации Nginx. Однако клиенты виртуального хостинга , предлагаемого нашей организацией всегда могут обратиться в службу поддержки, и наши системные администраторы внесут необходимые настройки для вашего сайта.