NginxでProxy Cacheしてみた

年末に少しだけ書いたWordpressの高速化ですが、高速化の最終系とも言える
Nginx proxy cacheに手を出してみました。

性能強化しても、アクセスなんて殆ど無いんですけどね。
やってみたいから設定した! ただそれだけです。

基本方針としては

  • 静的コンテンツも動的コンテンツも可能な限りキャッシュする。
  • モバイル系デバイスからの接続はキャッシュしない。
  • 管理画面はキャッシュしない。
  • ログイン中はキャッシュしない。
  • 記事のポストやコメント書き込みがあったらキャッシュを破棄する。

で、こんな感じで設定してみました。

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    directio        8m;
    keepalive_timeout  10;

    gzip              on;
    gzip_http_version 1.1;
    gzip_types        text/plain
                      text/xml
                      text/css
                      application/xml
                      application/xhtml+xml
                      application/rss+xml
                      application/atom_xml
                      application/javascript
                      application/x-javascript ;
    gzip_disable      "MSIE [1-6]\." "Mozilla/4";
    gzip_comp_level   1;
    gzip_proxied      off;
    gzip_vary         on;
    gzip_buffers      4 8k;
    gzip_min_length   1000;

    proxy_cache_path   /var/tmp/nginx/cache levels=1:2 keys_zone=czone:8m max_size=100m inactive=7d;
    proxy_set_header   Host               $host;
    proxy_set_header   X-Real-IP          $remote_addr;
    proxy_set_header   X-Forwarded-Host   $host;
    proxy_set_header   X-Forwarded-Server $host;
    proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_cache_valid  200                1d;
    proxy_cache_valid  any                10m;
    
    upstream backend {
        ip_hash;
        server 127.0.0.1:8080;
    }

### front cache ###
    server {
        listen       80;
        server_name  mmio.net;
        
        location /wp-admin { proxy_pass http://backend; }
        location ~ .*\.php { proxy_pass http://backend; }
        location / {
            proxy_pass         http://backend;
            proxy_no_cache     $do_not_cache;
            proxy_cache_bypass $do_not_cache;
            proxy_cache czone;
            proxy_cache_key    $uri$is_args$args;

            if ($http_user_agent ~* '(DoCoMo|UP\.Browser|SoftBank|WILLCOM|emobile|iPhone|iPod|Android.*Mobile)') {
                set $do_not_cache 1;
            }
            if ($http_cookie ~* "comment_author_[^=]*=([^%]+)%7C|wordpress_logged_in_[^=]*=([^%]+)%7C") {
                set $do_not_cache 1;
            }
        }
        location ~ /purge(/.*) {
           allow 127.0.0.1;
           allow 49.212.135.193;
           deny all;
           proxy_cache_purge czone $1$is_args$args;
        }
    }    

### backend server ###
    server {
        listen       8080;
        server_name  mmio.net;
        access_log  /var/log/nginx-backend.log;

        location / {
            root   /home/www/blog/ ;
            index  index.html index.htm index.php;
            ## static files ##
            if (-f $request_filename) {
                expires 14d;
                break;
            }
            try_files $uri $uri/ /index.php;
	    }
        location ~ \.php$ {
            fastcgi_pass   unix:/tmp/php.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /home/www/blog/$fastcgi_script_name;
            include        fastcgi_params;
        }
        location = /favicon.ico { log_not_found off; }
        location = /robots.txt  { log_not_found off; }
        location ~ /\.ht { deny  all; }
    }
}

この設定で、動的コンテンツは1日、静的コンテンツは14日のキャッシュが行われます。
Wordpressのキャッシュ制御プラグインへのインタフェースも用意したので、
更新時のキャッシュ破棄も問題なしです。
これで、アクセス数が激増しても大丈夫!

ほとんどアクセス無いんだけどね(´・ω・`)