Настройка кэширования на Nginx

Mar 30, 2017 13:55 · 497 words · 3 minute read nginx

Суть кеширования на стороне сервера заключается в том, чтобы избавиться от постоянного запуска одних и те же скриптов (как пример, генерации ленты постов 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 довольно проста, но если все сделать правильно, то можно получить десятикратное ускорение сайта и неплохую экономию ресурсов.

tweet Share