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