В nginx начаная с версии 0.7.44 появилась возможность кешировать отдаваемые страницы, что может увеличить работы сайта в тысячу раз.
Рассмотрим практический пример настройки кеширования. За основу будет взят сайт контент которого не меняется в зависимости от пользователя (авторизован или гость) и нет активно меняющихся данных (например голосований). Это важно, т.к. активно изменяющийся контент требует индивидуального подхода и зачастую сложных схем кеширования.
В nginx кеширование отдельно настраевается для модулей proxy и fastcgi, ниже насмотрена настройка для модуля proxy, чтобы заработало для fastcgi замените директивы proxy_cache* на fastcgi_cache*.
Настройка общая
За основу будет взят сайт контент которого не меняется в зависимости от пользователя (авторизован или гость) и нет активно меняющихся данных (например голосований). Это важно, т.к. активно изменяющийся контент требует индивидуального подхода и зачастую сложных схем кеширования.
Сперва создадим папку в которой nginx будет хранить данные кеша.
mkdir /var/cache/nginx chown nginx:nginx /var/cache/nginx/
В главной конфигурации в разделе http {…} указываем эту папку:
/etc/nginx/nginx.conf
... ## Создаем кеш зону pagecache (память под ключи в 5Мб) с настройками: # inactive: xранить кеш 10 минут # max_size: максимальный размер кеш данные 50Мб proxy_cache_path /var/cache/nginx levels=2 keys_zone=pagecache:5m inactive=10m max_size=50m; ...
Теперь в конфигурации server {…} добавим:
server { ... # Кешировать указанные коды ответов 5 минут proxy_cache_valid 200 301 302 304 5m; # Ключ по которому сохраняются и берутся данные из кеша proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri"; # Защита от раздачи одинаковой куки в кешированном ответе proxy_hide_header "Set-Cookie"; # Игнорировать параметры кеша заданные бекэндом proxy_ignore_headers "Cache-Control" "Expires"; # Указывает в каких случаях клиенту можно отдать несвежий ответ из кеша proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; # активировать зону кеширования pagecache proxy_cache pagecache; ... }
Последняя запись proxy_cache pagecache активирует работу кеша. Если она написана в теле секции server, то кеш будет отрабатывать для всего сайта. Так же эту строчку можно поместить в конкретный location и догда кеш будет работать только для него.
Чтобы отключить кеширование для конкретного локейшена то укажите внутри него proxy_cache off.
Настройка с разделением пользователь-гость
Далее приводиться более сложный пример настройки кеширования nginx с разделением на гостей и авторизованных пользователей.
Принцип действия:
-
гостям данные отдаются из кеша (обновляются согласно настройкам кеширования — proxy_cache_valid)
-
авторизованным пользователям данные всегда отдаются напрямую, кроме случая когда:
-
бекэнд сервер выдает ошибку определенную в proxy_cache_use_stale
-
-
если бекэнд не работает или выдает ошибку определенную в proxy_cache_use_stale гостю выдается ответ из кеша не зависимо от его устаревания
-
определение зарегистрированного пользователя осуществляется по наличию определенной куки (её название зависит от движка сайта)
В конфиге nginx в секции http {…} добавляем строчку определения кеша:
## Создаем кеш зону pagecache (память под ключи в 15Мб) с настройками: # inactive: xранить кеш 60 минут # max_size: максимальный размер кеш данные 500Мб proxy_cache_path /var/cache/nginx levels=2 keys_zone=pagecache:15m inactive=60m max_size=500m;
В секции server {…}:
server { listen *:80; server_name site.name; # ключ по которому сохраняются и берутся данные из кеша proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri"; # Указывает в каких случаях клиенту можно отдать несвежий ответ из кеша proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; location / { # оригинальный url (нужен для кеширования) set $o_uri $request_uri; # Определение пользователя по куке LOGIN (замените на свою) if ( $cookie_LOGIN = "" ) { # если кука LOGIN не установлена обрабатывать запрос через кеш rewrite ^ /ng_cache last; } # Для авторизованных отдать данные напрямую proxy_cache pagecache; proxy_cache_valid any 0; proxy_pass http://10.0.1.26; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # !Важно! url по которому осуществляется авторизвация # и устанавливается определяющая кука (LOGIN) location /login { proxy_pass http://10.0.1.26; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # Учтите что кешируется весь ответ от беэнда, если хотите исключить некоторые файла, то # добавте эту настройку. Исключаем картинки, видео, музыку, архивы: location ~* \.(jpe?g|gif|png|tif|svg|mp3|ogg|avi|mpe?g|zip|gz|bz2?|rar|ico|bmp|swf|txt|xml)$ { proxy_pass http://10.0.1.26; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # Обработка через кеш location /ng_cache { internal; # активировать зону кеширования pagecache proxy_cache pagecache; # Кешировать указанные коды ответов 10 минут proxy_cache_valid 200 301 302 304 10m; # Защита от раздачи одинаковой куки в кешированном ответе proxy_hide_header "Set-Cookie"; # Игнорировать параметры кеша заданные бекэндом proxy_ignore_headers "Cache-Control" "Expires"; # Получение данных от бекэнда по оригинальному url proxy_pass http://10.0.1.26:80$o_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }