nginx - varnish の構成
client - (https) - nginx - (socket) - varnish - (http) app
- nginx: SSL temination, logging
- varnish: cache
当初、nginx の proxy_cache を試したのですが、同一 URL へ多数のリクエストが来ている状況でキャッシュのライフタイムが切れると、バックエンドへ同じ URL に対して複数のリクエストが飛んでしまい、PHP アプリケーション側に負荷がかかるという現象があったので、今回は取りやめました。
Varnish では、同一 URL に対して複数のリクエストがあっても、バックエンドへは 1 リクエストしか飛ばないようになっています。
とある CMS を使ったサイトに Varnish を導入した話 - Shin x blog
タイムアウト
nginx
proxy_read_timeout 60s; (default: 60s)
varnish
.first_byte_timeout 60s (default: 60s)
バックエンドで時間がかかる処理をする場合はこの2つを大きくする
keepalive
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
upstream varnish { server unix:/var/run/varnish.sock; keepalive 16; } server { ... location / { proxy_pass http://varnish; proxy_http_version 1.1; proxy_set_header Connection ""; ...
nginx-backend間でKeepAliveする - road288の日記 2017
KeepAlive timeout
問題を回避するためにはリバースプロキシ側でプール内の接続のタイムアウトを管理できるよう、バックエンドサーバー側のKeepAliveTimeoutより短い値を設定する必要があります。
...
リバースプロキシのHTTP KeepAlive設定クライアント側から切断されるよう、クライアントにサーバより短いタイムアウトを設定するのが原則です。
HTTP KeepAliveとリバースプロキシにまつわる話 | TECHSCORE BLOG 2019
Syntax: keepalive_timeout timeout;
Default: keepalive_timeout 60s;
Context: upstream
Sets a timeout during which an idle keepalive connection to an upstream server will stay open.
https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive_timeout
Varnish / Nginx: initial connection after idle for ~5 seconds - Stack Overflow
KeepAlive in Varnish for client connections (read, your browser) is controlled by timeout_idle startup parameter.
In Varnish 4, its default is 5 seconds. Depending on resources available, you may want to set it up higher, i.e. 75.
Keep-Alive in web servers and load balancers
timeout_idle
Units: secondsDefault: 5.000
Minimum: 0.000Idle timeout for client connections.
A connection is considered idle until we have received the full request headers.
This parameter is particularly relevant for HTTP1 keepalive connections which are closed unless the next request is received before this timeout is reached.
クライアント(nginx)にサーバ(varnish)より短いタイムアウトを設定する。
例
nginx keepalive_time 600s; < varnish -p send_timeout=615
nginx keepalive_timeout 60s; < varnish -p timeout_idle=75
上記設定でも upstream prematurely closed connection while reading upstream が発生する場合がある。
upstream prematurely closed connection while reading upstream
merge slashes
varnishで処理する
/* Merge slashes */ if (req.url ~ "^(.*)//+(.*)$") { set req.url = regsuball(req.url, "//+", "/"); }
# Varnish doesn't like url containing double slashes # as such, we change double slashes to simple slashes if(req.url ~ "^(.*)//(.*)$") { set req.url = regsub(req.url,"^(.*)//(.*)$","\1/\2"); }
set req.url = regsuball(req.url, "/+", "/");URL 中で連続するすべてのスラッシュをひとつのスラッシュで置き換えます。例えば //docs///intro.html は /docs/intro.html に変換されます。
VCL 正規表現早見表 | Fastly ヘルプガイド