Nginx Cache Controller

Nginx Cache Controller ver.1.1.2 をリリースしました

みやさんが公開している 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');

お客さんとこに、このプラグインを導入して設定を変更してもらいたくないときとかに使えますね。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください