みやさんが公開している WordPress で Nginx のリバースプロキシキャッシュを制御するためのプラグイン Nginx Cache Controller のコントリビュータに任命されたので、さっそく修正して Ver.1.1.2 をリリースしました。
Nginx Cache Controller の詳細については、以下のみやさんのエントリを参照してください。
今回の修正では、以下の変更を行っています。
- 標準以外の URL キーで生成しているキャッシュを削除するためのフィルターフックを整備
- リバースプロキシにキャッシュされた日時で Last Modified ヘッダを送出できるようにオプションを追加
- define() で Nginx Proxy Cache ディレクトリを設定できるように修正
以下に詳細説明を書いておきます。
標準以外の URL キーで生成しているキャッシュを削除するためのフィルターフックを整備
例えば nginx.conf で以下のようにして、スマートフォントとかケータイ用に別の key でキャッシュしている場合…
server { listen 80; server_name example.com; root /path/to/example.com; index index.html index.htm; charset utf-8; set $mobile ""; if ($http_user_agent ~* '(DoCoMo|J-PHONE|Vodafone|MOT-|UP\.Browser|DDIPOCKET|ASTEL|PDXGW|Palmscape|Xiino|sharp pda browser|Windows CE|L-mode|WILLCOM|SoftBank|Semulator|Vemulator|J-EMULATOR|emobile|mixi-mobile-converter)') { set $mobile "@ktai"; } if ($http_user_agent ~* '(iPhone|iPod|Opera Mini|Android.*Mobile|NetFront|PSP|BlackBerry|Windows Phone)') { set $mobile "@smartphone"; } : location / { set $do_not_cache 0; if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) { set $do_not_cache 1; } proxy_no_cache $do_not_cache; proxy_cache_bypass $do_not_cache; proxy_redirect off; proxy_cache one; proxy_cache_key "$scheme://$host$request_uri$is_args$args$mobile"; proxy_cache_valid 200 60m; proxy_cache_valid 404 5m; proxy_pass http://backend; } }
functions.php にこんな感じで書いておけば、@ktai、@smartphone なキーで作成されたプロキシキャッシュも削除されます。
<?php add_filter('nginxchampuru_get_cache', 'nginxchampuru_get_cache', 10, 2); function nginxchampuru_get_cache($key, $url = null) { global $nginxchampuru; if (!$url) { $url = $nginxchampuru->get_the_url(); } $keys = array( $key, $nginxchampuru->get_cache_key($url.'@ktai'), $nginxchampuru->get_cache_key($url.'@smartphone'), ); if ($key !== $nginxchampuru->get_cache_key($url)) { $keys[] = $nginxchampuru->get_cache_key($url); } return $nginxchampuru->get_cache_file($keys); }
このフィルターフックは以前のバージョンから存在していたのですが、複数ファイルに対応していなかったので、ちょっとソースを修正しました。
リバースプロキシにキャッシュされた日時で Last Modified ヘッダを送出できるようにオプションを追加
オプション画面に設定を追加しました。
これを有効にすると、http ヘッダの Last Modified と Meta タグ Last-Modified を出力するようになります。
$ wget -S --spider http://example.com/ スパイダーモードが有効です。リモートファイルが存在してるか確認します。 --2012-06-05 16:07:57-- http://example.com/ example.com をDNSに問いあわせています... xx.xx.xx.xx example.com|xx.xx.xx.xx|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... HTTP/1.1 200 OK Server: nginx Date: Tue, 05 Jun 2012 07:07:57 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive Vary: Accept-Encoding Last-Modified: Tue, 05 Jun 2012 05:07:48 GMT :
<!DOCTYPE html> <html dir="ltr" lang="ja"> <head> <meta charset="UTF-8" /> <meta http-equiv="Last-Modified" content="Tue, 05 Jun 2012 05:07:48 GMT" /> <meta name="generator" content="WordPress 3.3.2" /> <meta name="robots" content="noindex,nofollow" /> <meta name="viewport" content="width=device-width" /> <title> example.com</title> <link rel="profile" href="http://gmpg.org/xfn/11" /> <link rel="pingback" href="http://example.com/xmlrpc.php" /> <link rel="canonical" href="http://example.com/" /> :
キャッシュされた日時がわかりますね。デバッグとかにも使えると思います。
define() で Nginx Proxy Cache ディレクトリを設定できるように修正
wp-config.php とかに、以下のように書いておくと Nginx がリバースプロキシキャッシュを溜め込むディレクトリを強制的に設定できます。
define('NCC_CACHE_DIR','/path/to/proxy_cache');
お客さんとこに、このプラグインを導入して設定を変更してもらいたくないときとかに使えますね。