How to! - nginx версия два.

Главные вкладки

Аватар пользователя solomenikm solomenikm 17 декабря 2010 в 20:00

Я писал как настроить ngnix здесь, но эта метода плоха сама в себе, плюс какое-то обновление удалило куку DRUPAL_UID из друпала. Короче, вот новое решение.

Требования.
Модуль [module=logincookie]. В нем устанавливаем куку NOCACHE когда пользователь залогинился, и удаляем ее когда он вышел.
Тестировал под nginx0.7, под nginx0.8 почему-то не кэшировал, так что смотрите, я вас предупредил.

Сам конфиг отдающий закэшированые страницы анонимусам:

   gzip                         on;
   gzip_static                  on;
   gzip_http_version            1.0;
   gzip_vary                    on;
   gzip_min_length              100;
   gzip_proxied                 any;
   gzip_types                   text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
   gzip_disable                 "msie6";
   gzip_comp_level              6;

# дирректоррия где будет храниться кэш, уровни, зона:размер.
   proxy_cache_path     /var/cache/nginx levels= keys_zone=anonymous:200m;
   proxy_temp_path      /var/cache/nginx/temp;
   proxy_cache_valid    any 1d;

server {
        server_name .mysite.com .mysite2.com ;

        listen *:80;
#нужно чтобы отдавать красивую 500 ошибку с себя
        error_page      502 503 504 509 /500.html;
        error_page      404 = [user=cached]cached[/user];
        error_page      412 = [user=nocached]nocached[/user];
       
# директория где лежит наш друпал   
        root            /var/www/d6;   
        rewrite         ^(/manager/.*)$ https://$http_host$1    permanent;

        location ~* ^.+\.(jpg|jpeg|png|gif|ico|zip|gz|rar|flv|wmv|avi|mpeg|mpg|mp3|mov|htc|swf)$ {
                access_log      off;
                expires         max;
                try_files       $uri $uri/ [user=cached]cached[/user];
                }
               
        location ~* ^.+\.(css|txt|js|ttf)$ {
                access_log      off;
                expires         1w;
                try_files       $uri $uri/ [user=cached]cached[/user];
                }

#для зарегистрированных проксируем прозрачно
        location [user=nocached]nocached[/user] {
        # важно чтобы значение было -1 один, чтобы случайно не отдать "неправильный ответ" пользователю
                expires                 -1;
                proxy_pass              http://127.0.0.1:8080;
                proxy_redirect          default;
                proxy_pass_header       Cookie;
                proxy_pass_header       Set-Cookie;
                proxy_set_header        Host $http_host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                }
       
#гостям проксируем и кэшируем
        location [user=cached]cached[/user] {
                expires                 -1;
                proxy_next_upstream     updating;
                proxy_pass              http://127.0.0.1:8080;
                proxy_redirect          default;
                proxy_pass_header       Cookie;
                proxy_pass_header       Set-Cookie;
                proxy_set_header        Host $http_host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;    
                proxy_cache             anonymous;
                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";     
                }

        location / {
        #если кука установлена
                if ($cookie_NOCACHE ) { return 412; }
        #если кука не установлена
                if (!-f $cookie_NOCACHE ) { return 404; }
        }
}

Примечания.
Статику кэшировал сознательно. ab -c100 -n5000 http://localhost.mysite.com/ выполняеться за три секудны на локальном, виртуальном сервере.

Комментарии

Аватар пользователя r0mik r0mik 28 декабря 2010 в 23:16

это все конечно хорошо, но тут есть одно но - нативное nginx-кэширование (и любой дрогой прокси, типа varnish или squid) оказывается все равно несколько медленней, чем boost - http://groups.drupal.org/node/26485#comment-101518
это не удивительно, потому что try_files в любом случае выдаст файл быстрей любого поиска по хешам в кэше. и чем больше файлов в кэше, тем он будет медленней. не на много медленней, но тем не менее. у меня по ab выдает где-то 8К/сек на чистой статике и до 7К/сек через nginx-кэш (3К файлов в кэше)...
к тому же boost имеет огромное кол-во настроек, что избавляет от необходимости править конфиг на каждый чих (типа добавить еще какую куку или локейшн убрать вообще из кэша)
кэширование nginx-ом имеет смысл там, где нет собственных развитых средств для этого дела.. у друпала они есть.. все это имхо Wink

Аватар пользователя solomenikm solomenikm 31 декабря 2010 в 14:26

Очень интересное замечание. Спасибо за ответ. У меня есть вопрос. Вы пишете:

r0mik wrote:
try_files в любом случае выдаст файл быстрей любого поиска по хешам в кэше.

Но ngnix тоже может использовать try_files, может имеет смысл организовывать кэширование через него? Это не будет иметь такой же эфект как тот что описали Вы?