Unix Domain Socket(UDS)
Unix Domain Socket(UDS)対応
LISTEN側でUDSを使う場合
起動パラメータの-aで以下のような指定をします-a /var/run/varnish-uds.sock,user=vcache,group=varnish,mode=666今回はproxyプロトコルを指定していませんが指定できます。(PROXYを追加しましょう)
また今回はお手軽にNginxとつなぐために666にしていますが、適切な設定にするべきでしょう。Nginx側
upstream backend { server unix:/var/run/varnish-uds.sock; } server { listen 80 default_server; listen [::]:80 default_server; location / { proxy_pass http://backend; } ... }これだけです。
なお、LISTEN側でUDSを使う場合はVCL4.1が必須です。
が、現状試してる限りでは起点となるvcl(default.vcl)が4.1であればinclude先は4.0でも平気な動きをしています。
しかし、ドキュメント上はWhen UDS listeners are in use, VCL >= 4.1 will be required for all VCL programs loaded by Varnish.
と記述されており、もしかしたら塞がれる可能性もありますので、UDSを使う場合はすべてのVCLを4.1にするのが無難でしょう。
Varnish6.0.0がリリースされました – cat /dev/random > /dev/null &
UDS + PROXY
-a /var/run/varnish-uds.sock,PROXY,user=vcache,group=varnish,mode=666 で upstream backend { server unix:/var/run/varnish-uds.sock; }
PROXYを追加すると502エラー
You have Varnish listening with PROXY protocol, but NGINX is talking regular HTTP protocol to it. Thus it fails.
To be precise, -a /var/run/varnish.sock,PROXY,user=varnish,group=varnish,mode=666 means that Varnish listens on UDS socket only accepting PROXY protocol. There is no magical switch to have it accept both regular HTTP and PROXY protocols.
In a perfect world, you would have a way for NGINX to forward (talk) PROXY protocol to Varnish. But you can't do this with proxy_pass within http {} context. You can do proxy_pass + proxy_protocol within an NGINX stream, but this is typically not what you want, because that would break HTTP/2 and downgrade it to older protocol.
なお、UDSは当然ながらIPアドレスはなく、UDS経由のアクセスは0.0.0.0:0として扱われます。
なので、client.identity(デフォルトではclient.ipが使われる)を使って振り分けを行う場合は常に同一backendが選択されるので注意が必要です。
適切に修正を入れるか、そもそも上流はPROXYプロトコルが使えるミドルウェアにするなどの対策が必要でしょう。
Varnish6.0.0がリリースされました – cat /dev/random > /dev/null &
if (client.ip == "0.0.0.0")
PROXYプロトコル