Advertisement
mightyroot

Nginx Cashe User/Guest

Jul 13th, 2012
377
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.26 KB | None | 0 0
  1. Принцип действия:
  2.  
  3. гостям данные отдаются из кеша (обновляются согласно настройкам кеширования - proxy_cache_valid)
  4. авторизованным пользователям данные всегда отдаются напрямую, кроме случая когда:
  5. бекэнд сервер выдает ошибку определенную в proxy_cache_use_stale
  6. если бекэнд не работает или выдает ошибку определенную в proxy_cache_use_stale гостю выдается ответ из кеша не зависимо от его устаревания
  7. определение зарегистрированного пользователя осуществляется по наличию определенной куки (её название зависит от движка сайта)
  8. В конфиге nginx в секции http {} добавляем строчку определения кеша:
  9.  
  10. ## Создаем кеш зону pagecache (память под ключи в 15Мб) с настройками:
  11. # inactive: xранить кеш 60 минут
  12. # max_size: максимальный размер кеш данные 500Мб
  13. proxy_cache_path /var/cache/nginx levels=2 keys_zone=pagecache:15m inactive=60m max_size=500m;
  14. В секции server {}:
  15.  
  16. server {
  17.     listen          *:80;
  18.     server_name     site.name;
  19.  
  20.     # ключ по которому сохраняются и берутся данные из кеша
  21.     proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
  22.     # Указывает в каких случаях клиенту можно отдать несвежий ответ из кеша
  23.     proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;
  24.  
  25.     location / {
  26.         # оригинальный url (нужен для кеширования)
  27.         set $o_uri $request_uri;
  28.  
  29.         # Определение пользователя по куке LOGIN (замените на свою)
  30.         if ( $cookie_LOGIN = "" ) {
  31.             # если кука LOGIN не установлена обрабатывать запрос через кеш
  32.             rewrite ^ /ng_cache last;
  33.         }
  34.  
  35.         # Для авторизованных отдать данные напрямую
  36.         proxy_cache     pagecache;
  37.         proxy_cache_valid   any 0;
  38.  
  39.         proxy_pass              http://10.0.1.26;
  40.         proxy_set_header        Host             $host;
  41.         proxy_set_header        X-Real-IP        $remote_addr;
  42.     }
  43.  
  44.     # !Важно! url по которому осуществляется авторизвация
  45.     # и устанавливается определяющая кука (LOGIN)
  46.     location /login {
  47.         proxy_pass              http://10.0.1.26;
  48.         proxy_set_header        Host             $host;
  49.         proxy_set_header        X-Real-IP        $remote_addr;
  50.     }
  51.  
  52.         # Учтите что кешируется весь ответ от беэнда, если хотите исключить некоторые файла, то
  53.         # добавте эту настройку. Исключаем картинки, видео, музыку, архивы:
  54.     location ~* \.(jpe?g|gif|png|tif|svg|mp3|ogg|avi|mpe?g|zip|gz|bz2?|rar|ico|bmp|swf|txt|xml)$ {
  55.                 proxy_pass              http://10.0.1.26;
  56.                 proxy_set_header        Host             $host;
  57.                 proxy_set_header        X-Real-IP        $remote_addr;
  58.     }
  59.  
  60.     # Обработка через кеш
  61.     location /ng_cache {
  62.         internal;
  63.  
  64.         # активировать зону кеширования pagecache
  65.         proxy_cache     pagecache;
  66.         # Кешировать указанные коды ответов 10 минут
  67.         proxy_cache_valid   200 301 302 304 10m;
  68.         # Защита от раздачи одинаковой куки в кешированном ответе
  69.         proxy_hide_header   "Set-Cookie";
  70.         # Игнорировать параметры кеша заданные бекэндом
  71.         proxy_ignore_headers    "Cache-Control" "Expires";
  72.  
  73.         # Получение данных от бекэнда по оригинальному url
  74.         proxy_pass              http://10.0.1.26:80$o_uri;
  75.         proxy_set_header        Host             $host;
  76.         proxy_set_header        X-Real-IP        $remote_addr;
  77.     }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement