Настройка кэширования на Nginx
Mar 30, 2017 13:55 · 497 words · 3 minute read
Суть кеширования на стороне сервера заключается в том, чтобы избавиться от постоянного запуска одних и те же скриптов (как пример, генерации ленты постов WordPress), выполнение которых может иногда занимать целые секунды.
С использованием кэширования приложение сгенерирует страницу один раз и сохранит результат в память на какое-то время (называемое TTL). Пока не истечет TTL, клиент будет получать сохраненную в памяти версию страницы. Давайте разберемся с настройкой кэширования на Nginx!
Преимущества кэширования Nginx по сравнению с Varnish состоят прежде всего в простоте настройки. Оптимально использовать кэширование для сайтов с контентом, который доступен неавторизованным пользователям (публичный).
Считаем, что Nginx у нас установлен из пакетов (или собран из исходников) и настроен.
Для включения кэширования в Nginx сначала необходимо определить максимальный размер кеша (общий размер всех страниц в кеше не может превышать это значение). Сделать это можно в конфигурационном файле /etc/nginx/nginx.conf
с помощью директивы в секции http
:
...
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=all:32m;
...
Не забываем создать каталог для кеширования, который мы указали выше:
mkdir /var/cache/nginx
Далее следует изменить настройки сайта, создав еще одну секцию server. Переносим наш основной сервер на другой порт (например, 81), а на стандартном 80 у нас теперь будет работать кэширующий хост, который либо будет отдавать данные из кэша, либо перенаправлять запросы на основной хост. Это может выглядеть примерно так:
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:81/;
proxy_cache all;
proxy_cache_valid any 1h; # Кешируем на 1 час
}
Для основного сервера:
server {
listen 81;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log off;
access_log /var/log/nginx/letsclearitup.access.log;
error_log /var/log/nginx/letsclearitup.error.log error;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/letsclearitup.sock;
fastcgi_hide_header X-Powered-By;
}
location /status {
fastcgi_pass unix:/run/php/letsclearitup.sock;
include fastcgi.conf;
allow 127.0.0.1;
deny all;
}
}
Если у пользователя установлены какие-либо Cookies, кэширование можно отключить:
server {
listen 80;
location / {
if ($http_cookie ~* ".+" ) {
set $do_not_cache 1;
}
proxy_pass http://127.0.0.1:81/;
proxy_cache all;
proxy_cache_valid any 1h; # Кешируем на 1 час
}
}
Есть смысл включать кэширование также и для ошибочных запросов, чтобы снизить нагрузку от обращений к неработающей части сайта:
server {
listen 80;
location / {
if ($http_cookie ~* ".+" ) {
set $do_not_cache 1;
}
proxy_pass http://127.0.0.1:81/;
proxy_cache all;
proxy_cache_valid 404 502 503 1m;
proxy_cache_valid any 1h; # Кешируем на 1 час
}
}
У Nginx есть возможность кеширования ответов от fastcgi
. Чтобы использовать данную возможность, в секции http файла /etc/nginx/nginx.conf
добавляем:
...
fastcgi_cache_path /var/cache/fpm levels=1:2 keys_zone=fcgi:100m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
...
Создаем каталог:
mkdir /var/cache/fpm
После чего в настройках сайта (в секции server для основного хоста) добавим такие строки:
server {
listen 81;
...
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/letsclearitup.sock;
fastcgi_hide_header X-Powered-By;
fastcgi_cache fcgi;
fastcgi_cache_valid 200 60m; # кешировать ответы с кодом 200 на 1 час
}
...
}
Настройка кэширования на Nginx довольно проста, но если все сделать правильно, то можно получить десятикратное ускорение сайта и неплохую экономию ресурсов.