Я писал как настроить ngnix здесь, но эта метода плоха сама в себе, плюс какое-то обновление удалило куку DRUPAL_UID из друпала. Короче, вот новое решение.
Требования.
Модуль [module=logincookie]. В нем устанавливаем куку NOCACHE когда пользователь залогинился, и удаляем ее когда он вышел.
Тестировал под nginx0.7, под nginx0.8 почему-то не кэшировал, так что смотрите, я вас предупредил.
Сам конфиг отдающий закэшированые страницы анонимусам:
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/ выполняеться за три секудны на локальном, виртуальном сервере.
Комментарии
это все конечно хорошо, но тут есть одно но - нативное nginx-кэширование (и любой дрогой прокси, типа varnish или squid) оказывается все равно несколько медленней, чем boost - http://groups.drupal.org/node/26485#comment-101518
это не удивительно, потому что try_files в любом случае выдаст файл быстрей любого поиска по хешам в кэше. и чем больше файлов в кэше, тем он будет медленней. не на много медленней, но тем не менее. у меня по ab выдает где-то 8К/сек на чистой статике и до 7К/сек через nginx-кэш (3К файлов в кэше)...
к тому же boost имеет огромное кол-во настроек, что избавляет от необходимости править конфиг на каждый чих (типа добавить еще какую куку или локейшн убрать вообще из кэша)
кэширование nginx-ом имеет смысл там, где нет собственных развитых средств для этого дела.. у друпала они есть.. все это имхо
Очень интересное замечание. Спасибо за ответ. У меня есть вопрос. Вы пишете:
Но ngnix тоже может использовать try_files, может имеет смысл организовывать кэширование через него? Это не будет иметь такой же эфект как тот что описали Вы?
удалил