Nginxでリバースプロキシとしてfastcgi cacheを使う

タイトルは、突っ込みが入ったら変えます。

Nginxにリバースプロキシを設定する。
fastcgi cacheで。

リバースプロキシとfastcgi cacheについては、Nginxのfastcgi cacheってリバースプロキシ?を参照。

Nginxの基本設定PHP-FPMが動く設定WordPress用の設定はやってあること前提です。

1. nginx.confの設定

設定ファイルを開く。

sudo vim /etc/nginx/nginx.conf

変更後がこちら。
追加するディレクティブは1つだけ。

user nginx;
user nginx;
worker_processes 2;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

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

    server_tokens off;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile   on;
    tcp_nopush off;

    keepalive_timeout 65;

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

    # FastCGIキャッシュ用
    fastcgi_cache_path /var/cache/nginx/runble1.com levels=1:2 keys_zone=cache_runble1.com:15m inactive=7d max_size=1000m;

    include /etc/nginx/conf.d/*.conf;
}

追加している部分を抜粋。
追加したディレクティブは1つだけだけど、パラメータが多いなー・・・

fastcgi_cache_path      /var/cache/nginx/runble1.com levels=1:2 keys_zone=cache_runble1.com:15m inactive=7d max_size=1000m;

1つ目のパラメータは、キャッシュを保存するパスを指定。
保存場所は/var/runがいいとの情報もある。

/var/cache/nginx/runble1.com

2つ目は、キャッシュパス配下のディレクトリの文字数を指定。
levels=1:2は1階層目は1文字、2階層目は2文字でサブディレクトリが作成されることを意味する。

levels=1:2

3つ目は、キャッシュパスのゾーン名とゾーンサイズを指定。
ゾーン名がcache_runble1.com。ゾーンサイズが15mでゾーンに15MBが消費される。

keys_zone=cache_runble1.com:15m

inactiveで指定した期間を過ぎるとキャッシュが削除される。
7dは7日間アクセスがなかったら削除されるということ。

inactive=7d

ゾーン内のキャッシュ全てを合わせたサイズを指定。
1000MB(1GB)と指定してある。それを超えたら止まる(キャッシュされなくなる?)。

max_size=1000m

2. default.confの設定

default.confを開く。

sudo vim /etc/nginx/conf.d/default.conf

変更後がこちら。

server {
    listen 80 default_server;

    server_name runble1.com www.runble1.com;
    if ($http_host = www.runble1.com) {
        rewrite (.*) http://runble1.com$1;
    }

    root /var/www/wp;
    index index.php;

    access_log /var/log/nginx/runble1_access.log main;
    error_log /var/log/nginx/runble1_error.log warn;

    #error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    # WordPress用のリダイレクト設定
    try_files $uri $uri/ /index.php?q=$uri&$args;

    # WordPress用アクセスログ設定
    location ~* \.(gif|jpg|png|ico|css|js)$ {
        access_log off;
    }
    location ~ /wp-admin {
        access_log off;
        include php_exec;
    }
    location ~ /wp-content {
    access_log off;
        include php_exec;
    }
    location ~ /wp-includes {
        access_log off;
        include php_exec;
    }
    location ~ /wp-cron.php {
        access_log off;
        include php_exec;
    }
    location ~ /wp-login.php {
        access_log off;
        include php_exec;
    }
    location ~ /wp-comments {
        access_log off;
        include php_exec;
    }

    # fastcgi cacheのフラグ
    set $do_not_cache 0;

    # fastcgi cacheの判定</pre>
<pre>    # POST中の場合
    if ($request_method != "GET") {
        set $do_not_cache 1;
    }
    # WordPressにログイン中、コメント中、記事作成中
    if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
        set $do_not_cache 1;
    }
    # モバイル系の場合
    if ($http_x_wap_profile ~ ^[a-z0-9\"]+) {
        set $do_not_cache 1;
    }
    # -- Mobile ?
    if ($http_profile ~ ^[a-z0-9\"]+) {
        set $do_not_cache 1;
    }
    # -- Kei-tai ?
    if ($http_user_agent ~ ^.*(2.0\ MMP|240x320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mobile|hiptop|IEMobile|KYOCERA/WX310K|LG/U990|MIDP-2.|MMEF20|MOT-V|NetFront|Newt|Nintendo\ Wii|Nitro|Nokia|Opera\ Mini|Palm|PlayStation\ Portable|portalmmm|Proxinet|ProxiNet|SHARP-TQ-GX10|SHG-i900|Small|SonyEricsson|Symbian\ OS|SymbianOS|TS21i-10|UP.Browser|UP.Link|webOS|Windows\ CE|WinWAP|YahooSeeker/M1A1-R2D2|iPhone|iPod|Android|BlackBerry9530|LG-TU915\ Obigo|LGE\ VX|webOS|Nokia5800).*) {
        set $do_not_cache 1;
    }
    # -- Mobile ?
    if ($http_user_agent ~ ^(w3c\ |w3c-|acs-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-|dang|doco|eric|hipt|htc_|inno|ipaq|ipod|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-|lg/u|maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|palm|pana|pant|phil|play|port|prox|qwap|sage|sams|sany|sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo|teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|wap-|wapa|wapi|wapp|wapr|webc|winw|winw|xda\ |xda-).*) {
        set $do_not_cache 1;
    }
    # -- Kei-tai ?
    if ($http_user_agent ~ ^(DoCoMo/|J-PHONE/|J-EMULATOR/|Vodafone/|MOT(EMULATOR)?-|SoftBank/|[VS]emulator/|KDDI-|UP\.Browser/|emobile/|Huawei/|IAC/|Nokia|mixi-mobile-converter/)) {
        set $do_not_cache 1;
    }
    # -- Kei-tai ?
    if ($http_user_agent ~ (DDIPOCKET\;|WILLCOM\;|Opera\ Mini|Opera\ Mobi|PalmOS|Windows\ CE\;|PDA\;\ SL-|PlayStation\ Portable\;|SONY/COM|Nitro|Nintendo)) {
        set $do_not_cache 1;
    }

    # 拡張子がphpの場合
    location ~ \.php$ {
        # fastcgi(php-fpmの設定)
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # fastcgi cacheの設定
        fastcgi_cache cache_runble1.com;
        fastcgi_cache_key "$scheme://$host$request_uri";
        fastcgi_cache_valid 200 10m;
        fastcgi_cache_valid 404 1m;
        fastcgi_no_cache $do_not_cache;
        fastcgi_cache_bypass $do_not_cache;

        #
        include fastcgi_params;
    }

}

default.confに追加したディレクティブは多い。
上から見ていこう。

キャッシュ用フラグのセット。
キャッシュを使う場合は0のまま、使わない場合は1にする。

# fastcgi cacheのフラグ
set $do_not_cache 0;

以下の3つの場合は、キャッシュしない。
・POST中
・WordPressにログイン中、コメント中、記事作成中
・携帯及びモバイルからアクセス

# fastcgi cacheの判定
# POST中はキャッシュしない
if ($request_method != "POST") {
set $do_not_cache 1;
}
# WordPressにログイン中、コメント中、記事作成中はキャッシュしない
if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
    set $do_not_cache 1;
}

 # モバイル系
 if ($http_x_wap_profile ~ ^[a-z0-9\"]+) {
     set $do_not_cache 1;
 }
以下略

fastcgi cacheの設定部分が以下。
自分はlocation ~ \.php$ { }内に入れているけど、serverディレクティブ内に記述している人もいる。

# fastcgi cacheの設定
fastcgi_cache cache_runble1.com;
fastcgi_cache_key "$scheme://$host$request_uri";
fastcgi_cache_valid 200 10m;
fastcgi_cache_valid 404 1m;
fastcgi_no_cache $do_not_cache;
fastcgi_cache_bypass $do_not_cache;

この部分のディレクティブは1つずつ見ていこう。

キャッシュのゾーンを指定。
httpディレクティブで指定したゾーン名を指定する。

fastcgi_cache cache_runble1.com;

キャッシュするときのキー情報を指定。
キー情報はキャッシュを取ってくる(識別する)ための情報。

fastcgi_cache_key "$scheme://$host$request_uri";

HTTPステータスごとにキャッシュ時間を指定。
200の時は20分、404のときは1分キャッシュする。

fastcgi_cache_valid 200 10m;
fastcgi_cache_valid 404 1m;

キャッシュする場合としない場合の判定。
$do_not_cacheが0の時キャッシュする、0でなければキャッシュしない。

fastcgi_no_cache $do_not_cache;

キャッシュで応答するかどうかの場合の判定。
$do_not_cacheが0の時はキャッシュを返す、0でなければキャッシュで応答しない。

fastcgi_cache_bypass $do_not_cache;

参考

Nginxを使ったもう一歩進んだWordPressチューニング | cloudrop

Nginx のFastCGIキャッシュ(fastcgi cache )を使ってみた | レンタルサーバー・自宅サーバー設定・構築のヒント

Nginxのproxy cacheからfastcgi cacheに移行

FastCGI Cache 404 – Not Found

コメント

タイトルとURLをコピーしました