雑記

インフラのことだったりプログラムのことだったりどうでもいいこと書いたり。要は雑記。

nginx+varnish+apache+phpの環境構築(3)

前回前々回の続き。

今回はvarnishの設定。
各設定の補足はコメントにて記載。

*設定
#
# backend
#
backend app {
    .host = "app.hogehoge.com;
    .port = "80";
}

#
# acl purge setting
#
acl purge {
    "localhost";
    "127.0.0.1";
}


sub vcl_recv {

set req.grace = 300s;

    ## 不正なmethodは拒否
    if (req.request != "GET" &&
        req.request != "HEAD" &&
        req.request != "POST" &&
        req.request != "PURGE" &&
        req.request != "BAN")
    {
        error 403;
    }

    ## purgeの設定
    if (req.request == "PURGE" || req.request == "BAN") {
        if (!client.ip ~ purge) {
            error 404;
        }
    ban("req.http.host == " + req.http.host + " && req.url ~ " + req.http.X-Purge-Url);
    error 200 "Purged.";
    }

    ## 振り分け先の設定
    if (req.http.host == "cache.hogehoge.com:8080") {
        set req.http.host = "app.hogehoge.com";
        set req.backend = app;
    }
    else {
        error 403 "Forbidden";
    }

    ## バックエンドとの通信は圧縮を無効化
    if (req.http.Accept-Encoding) {
        unset req.http.Accept-Encoding;
        unset req.http.Vary;
    }

    ## キャッシュしない条件の設定
    if (req.request == "POST" ||
        req.http.Authenticate ||
        req.http.Authorization ||
        req.http.Cookie && req.http.Cookie ~ "authtoken=")
    {
        return(pass);
    } 

    if (req.http.Expect) {
        return(pipe);
    } 

    # キャッシュ
    return(lookup);
}


sub vcl_hash {
    hash_data(req.http.host);
    hash_data(req.url);
    return(hash);
}

sub vcl_hit {
    if (req.request == "PURGE") {
        purge;
        error 200 "Purged.";
    }
    return(deliver);
}

sub vcl_miss {
    if (req.request == "PURGE") {
        purge;
        error 200 "Purged.";
    }
    return(fetch);
}

sub vcl_fetch {
    set beresp.grace = 900s;

    # キャッシュ時間のデフォルト設定
    set beresp.ttl = 1800s;

    # キャッシュするのはステータスコードが200,304のとき
    if (beresp.status != 200 && beresp.status != 304) {
        set beresp.ttl = 0s;
    }

    # no-cacheの場合はキャッシュしない
    if (beresp.http.cache-control ~ "no-cache" || beresp.http.cache-control ~ "private" || beresp.http.Pragma ~ "no-cache") {
        set beresp.ttl = 0s;
    }

    # Cookieを使用している場合はキャッシュしない
    if (beresp.http.Set-Cookie) {
        set beresp.ttl = 0s;
    }

    # 不要なヘッダーは除去
    unset beresp.http.expires;
    unset beresp.http.Pragma;

    return(deliver);
}


sub vcl_deliver {
    ## Varnishのキャッシュ情報の付与
    if(!resp.http.X-Served-By) {
        set resp.http.X-Served-By = server.identity;
        if (obj.hits > 0) {
            set resp.http.X-Cache = "HIT";
        }
        else {
            set resp.http.X-Cache = "MISS";
        }
        set resp.http.X-Cache-Hits = obj.hits;
    }
    else {
        # append current data
        set resp.http.X-Served-By = regsub(resp.http.X-Served-By, "$", ", ");
        set resp.http.X-Served-By = regsub(resp.http.X-Served-By, "$", server.identity);
        if (obj.hits > 0) {
            set resp.http.X-Cache = regsub(resp.http.X-Cache, "$", ", HIT");
        }
        else {
            set resp.http.X-Cache = regsub(resp.http.X-Cache, "$" , ", MISS");
        }
        set resp.http.X-Cache-Hits = regsub(resp.http.X-Cache-Hits, "$", ", ");
        set resp.http.X-Cache-Hits = regsub(resp.http.X-Cache-Hits, "$", obj.hits);
    }

    ## remove Varnish header
    unset resp.http.Via;
    unset resp.http.X-Varnish;
    unset resp.http.X-Served-by;
}

sub vcl_error {
    set obj.http.Content-Type = "text/html; charset=utf-8";

    synthetic {"
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>"} + obj.status + " " + obj.response + {"</title>
</head>
<body>
<h1>"} + obj.status + " " + obj.response + {"</h1>
<p>"} + req.http.host + {"</p>
<p>"} + req.http.X-Purge-Url + {"</p>
</body>
</html>
"};

    return(deliver);
}


sub vcl_init {
    return (ok);
}

sub vcl_fini {
    return (ok);
}
<||

*補足
-ポートは8080を利用
-ストレージはメモリー