varnish nginx

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: seconds

Default: 5.000
Minimum: 0.000

Idle 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.

https://varnish-cache.org/docs/6.0/reference/varnishd.html

クライアント(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 が発生する場合がある。

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");
  }

https://gist.github.com/luzeduardo/4672076

set req.url = regsuball(req.url, "/+", "/");

URL 中で連続するすべてのスラッシュをひとつのスラッシュで置き換えます。例えば //docs///intro.html は /docs/intro.html に変換されます。
VCL 正規表現早見表 | Fastly ヘルプガイド

varnish nginx の比較

Comparing Varnish® vs Nginx - KeyCDN Support 2018