Thank you for reading this post, don't forget to subscribe!
Nginx умеет кэшировать запросы самостоятельно. Преимущества использования Nginx cache в его простоте по сравнению с Varnish.
Что кешировать?
Суть серверного кеширования в том, чтобы не генерировать постоянно одни и те же скрипты (например, ленту постов WordPress), что может иногда занимать целые секунды. Вместо этого, приложение генерирует страницу один раз, и результат сохраняется в память. Когда посетитель запросит ту же страницу второй раз, генерации уже не будет, а клиент получит сохраненную в памяти версию. Раз в какое-то время (называемое ttl), эта сохраненная версия будет удаляться и генерироваться новая, чтобы поддерживать актуальность данных.
Почти на всех сайтах можно кэшировать страницы для неавторизованных пользователей. Хорошо подойдет для сайтов с контентом, который доступен публично.
Включение кеширования в Nginx
Прежде всего нужно определить максимальный размер кеша (общий размер всех страниц в кеше будет не более этого размера). Это делается в основном файле настроек (nginx.conf) в секции http:
1 2 3 4 5 |
http { ... proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=all:32m <b>max_size=1g</b>; ... } |
# Устанавливаем размер кеша в 1G, сохранять его будем в папку /var/cache/nginx
Не забываем создать папку для кеша.
1 |
mkdir /var/cache/nginx |
Настройка хостов
Чтобы кеширование заработало, мы должны создать новый хост, который будет слушать 80 порт. А основной хост перенести на какой-то другой порт (например, 81). Кеширующий хост будет посылать запросы на основной либо отдавать данные из кеша.
Кеширующий хост
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 |
server { listen 80; location / { proxy_pass http://127.0.0.1:81/; proxy_cache all; proxy_cache_valid any 1h; } } |
[/codesyntax]
Каждая страница будет сохраняться в кеш на 1 час
Основной хост
[codesyntax lang="php"]
1 2 3 4 5 6 7 |
server { listen 81; location / { # fpm и т.п. } } |
[/codesyntax]
Обычный конфиг только на 81 порту
Cookies и персонализация
Многие сайты используют различные персональные блоки на страницах. Технология SSI позволяет реализовать продвинутое кеширование в случаях большого количество персонализированных блоков. В простом случае, мы можем просто отключать кеш, если у пользователя установлены какие-то Cookies.
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 |
server { listen 80; location / { if ($http_cookie ~* ".+" ) { set $do_not_cache 1; } proxy_cache_bypass $do_not_cache; proxy_pass http://127.0.0.1:81/; proxy_cache all; proxy_cache_valid any 1h; } } |
[/codesyntax]
Ошибки
Имеет смысл также включить кеширование ошибочных запросов на какое-то короткое время. Это позволит избежать частых повторных попыток обратиться к неработающей части сайта.
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server { listen 80; location / { if ($http_cookie ~* ".+" ) { set $do_not_cache 1; } proxy_cache_bypass $do_not_cache; proxy_pass http://127.0.0.1:81/; proxy_cache all; proxy_cache_valid 404 502 503 1m; proxy_cache_valid any 1h; } } |
[/codesyntax]
Кеширование fastcgi
Nginx позволяет кешировать ответы от fastcgi. Для включения этого кеша, необходимо также объявить его параметры (в секции http файла nginx.conf):
1 2 |
fastcgi_cache_path /var/cache/fpm levels=1:2 keys_zone=fcgi:32m max_size=1g; fastcgi_cache_key "$scheme$request_method$host$request_uri"; |
# Установим максимальный размер кеша в 1G
Не забываем создать папку
1 |
mkdir /var/cache/fpm |
В конфигурации основного хоста, добавляем правила кеширования:
[codesyntax lang="php"]
1 2 3 4 5 6 7 8 9 10 11 |
server { listen 80; location ~ \.php$ { fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_cache fcgi; fastcgi_cache_valid 200 60m; } } |
[/codesyntax]
В данном случае мы будем кешировать ответы с кодом 200 на 60 минут