カテゴリー
WordPress

【nginx】WordPress でキャッシュしてはいけないページ(ファイル、ディレクトリ)設定!!!

ポイント

  • WordPress 関係のクッキーを使用している場合はキャッシュしない
  • WordPress プラグイン Nginx Cache Controller に必要な設定を維持する必要がある。今回の場合は、proxy_cache_key
  • 「POST はキャッシュしない」と「GET 以外はキャッシュしない」は異なる。GET をキャッシュするよう明確にしたいので「GET 以外はキャッシュしない」設定にする。
  • キャッシュファイルを Linux コマンドから削除する場合は、最新の注意を持って!nginx 以外に、PHP-FPM を再起動したほうがよい

WordPress 関係のクッキーを使用しているときはキャッシュしない

クッキーを判別することで、ログインしている時やコメントを記入したことある方用にキャッシュを分けるように設定しておりました。

原理といたしましては、キャッシュする時のキーを変えることによって、アクセスする人を判別したりキャッシュをそれぞれの方に紐付けたり、という感じですわね♪

さて、この方法、辞めますの!

クッキーは一意の値と予想しますけれども、よくわかっておりませんし、キャッシュしないに越したことが無いのであれば、しないようにいたします。

具体的な変更は、次のようになりますわね。

    # $proxy_cache_key に任意の文字を加えることで別のキーでページをキャッシュ可能にする
    set $proxy_cache_key "$scheme://$host$request_uri";

    # ログイン状態またはコメントを記入したことがあれば、その情報ごとにキャッシュを分ける
    if ($http_cookie ~ "(wordpress_logged_in_|comment_author_)(.*)") {
        set $proxy_cache_key "$2::$proxy_cache_key";
    }

    # クッキーから、コメント書き込み中、ログイン中、パスワード保護コンテンツはキャッシュしない
    if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
        set $do_not_cache 1;
    }

また、WordPress プラグインの Nginx Cache Controller を正しく動かすために、proxy_cache_key には次の固定値へ変更いたします。

        proxy_cache_key $proxy_cache_key;

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

GET 以外はキャッシュしない

現状は、「POST はキャッシュしない」ですのでほぼ「GET 以外はキャッシュしない」条件を満たしております。

けれども、どうやらキャッシュしない方がよいものとして、POST 以外にも HEAD というヘッダー情報をやりとりするものがあるそうですの。

ですので、GET のみをキャッシュするようにして、それ以外はキャッシュしないように変更いたしますわ♪

    # POST 時はキャッシュしない
    if ($request_method = POST) {
        set $do_not_cache 1;
    }

    # GET 時以外はキャッシュしない
    if ($request_method != "GET") {
        set $do_not_cache 1; 
    }

 キャッシュを一旦削除して、変更した設定を反映する方法♪

以上の設定の修正を /etc/nginx/conf.d/default.conf に行いました。これを実際に反映するには、nginx を再起動すればよいですわね♪(reload でもよいと存じますわ)

[root@oki2a24 ~]# /etc/init.d/nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
[root@oki2a24 ~]#

ですけれども、このままですと今までのキャッシュが残ってしまっております。キャッシュしたくないファイルが、キャッシュされているかもしれません。

もやもやしますの><。

ですので、削除してしまいます。ただし、注意が必要ですの!これ以降の操作は乱暴ですのでいわゆる自己責任!で行ってくださいまし。

キャッシュファイルは /var/cache/nginx/ ディレクトリに作成されますけれども、このディレクトリには「client_temp」「fastcgi_temp」「proxy_temp」「scgi_temp」「uwsgi_temp」というキャッシュされたディレクトリとファイル以外に nginx や PHP-FPM が使用しているようですの。

ですから、このキャッシュディレクトリ内を削除して一掃しましたら、直ちに nginx および php-fpm を再起動しますの!コマンドは次ですわ!

rm -rf /var/cache/nginx/*
/etc/init.d/nginx restart
/etc/init.d/php-fpm restart

以上で、設定の反映、いままでのキャッシュの削除ができましたの♪

おまけ。修正後の nginx 設定ファイル /etc/nginx/conf.d/default.conf の中身

# ドキュメントルート
root   /var/www/html/oki2a24.com;
# インデックスファイル指定
index  index.php index.html index.htm;

# キャッシュしたファイルが保管されるパスと、キャッシュゾーンの名前、容量を指定
# キャッシュ保管場所 /var/cache/nginx
# キャッシュを保存するサブディレクトリ階層の深さ 1:2
# キャッシュゾーン czone メモリの割当量 32m
# ゾーン内に保存できるキャッシュ最大値 256m
# アクセスの無いキャッシュを削除するまでの期間 1440m
proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=czone:32m max_size=256m inactive=1440m;
# 利用するキャッシュゾーンの名前を指定
proxy_cache czone;
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;
# ステータスコードが通常応答の「200」と、ファイルが存在しない「404」の場合30分間キャッシュを保持
proxy_cache_valid 200 404 30m;

# プロキシサーバ設定
server {
    listen 80 default_server;

    # ドットファイルへのアクセスを禁止、ログへの記録オフ
    location ~ /\. {deny all; access_log off; log_not_found off; }
    # robots.txt へのアクセスはログへの記録オフ
    location = /robots.txt  { access_log off; log_not_found off; }
    # favicon へのアクセスはログへの記録オフ
    location = /favicon.ico { access_log off; log_not_found off; }
    # wp-cron へのアクセスはログへの記録オフ
    location ~ /wp-cron.php { access_log off; log_not_found off; }
    # JavaScript CSS 画像へのアクセスはログへの記録オフ、直ちにプロキシに通しキャッシュ。
    # この期の設定でアクセス元の状態で複数キャッシュを行うが画像ファイルなどは複数キャッシュさせない
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        log_not_found off;
        proxy_pass http://unix:/var/run/nginx.sock;
    }

    # プロキシキャッシュ設定
    # 初期値はキャッシュするにセット
    set $do_not_cache 0;

    # GET 時以外はキャッシュしない
    if ($request_method != "GET") {
        set $do_not_cache 1;
    }

    # .php ファイルへ直接アクセスがあるのは基本的に管理ページのみのためキャッシュしない
    if ($uri ~* "\.php$") {
        set $do_not_cache 1;
    }

    # クッキーから、コメント書き込み中、ログイン中、パスワード保護コンテンツはキャッシュしない
    if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
        set $do_not_cache 1;
    }

    # 今まで組み立てたプロキシ設定でキャッシュを実行
    location / {
        proxy_no_cache $do_not_cache;
        proxy_cache_bypass $do_not_cache;
        proxy_cache_key "$scheme://$host$request_uri";
        proxy_pass http://unix:/var/run/nginx.sock;
    }
 
}

# ウェブサーバ設定
server {
    # ポートを指定
    #listen       80;
    listen unix:/var/run/nginx.sock; 
    # WordPress カスタム パーマネントリンク対応
    try_files $uri $uri/ /index.php?q=$uri&$args;

    # PHP-FPM 設定
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_pass_header "X-Accel-Redirect";
        fastcgi_pass_header "X-Accel-Buffering";
        fastcgi_pass_header "X-Accel-Charset";
        fastcgi_pass_header "X-Accel-Expires";
        fastcgi_pass_header "X-Accel-Limit-Rate";
    }
}

おわりに

今回も、こちらのサイトに大いにお世話になりました!まだまだこのサイトの知見からは勉強させていただけることがたくさんたくさんありそうですの♪他のトピックも覗いてみたいですわ♪

以上です。

コメントを残す