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を利用
-ストレージはメモリー