通过 Unix 域套接字连接 Nginx 和 Varnish 6 不工作

Connect Nginx and Varnish 6 via Unix Domain Socket not working

我在同一台机器上使用 Nginx 作为 Varnish 6 前面的 SSL 端点。这在使用 TCP 端口时效果很好。由于 Varnish 6 支持监听 Unix 域套接字,我更改了配置以使用套接字:

重启Nginx和Varnish,没有报错。套接字文件 /var/run/varnish.sock 已创建并且是世界可写的(我知道,我知道......我只是想得到它 运行)。 Netstat 说 varnishd 正在监听 /var/run/varnish.sock.

但是它不起作用,任何对 nginx 的网络请求 returns“502 Bad Gateway”。

Nginx 错误日志显示 "upstream prematurely closed connection while reading response header from upstream"。

Varnishlog 为每个请求显示如下条目:

*   << Session  >> 65578
-   Begin          sess 0 PROXY
-   SessOpen       0.0.0.0 0 a0 0.0.0.0 0 1557937009.691636 21
-   SessClose      RX_JUNK 0.000
-   End

知道出了什么问题吗?

varnish 是 varnish-6.0.3 修订版 7d1ded3aa033a018317dbafc61587026ea2ef8a3, Nginx 是 nginx/1.14.0 (Ubuntu), 运行 Ubuntu 18.04 仿生

您让 Varnish 使用 PROXY 协议进行侦听,但 NGINX 正在与它对话常规的 HTTP 协议。因此它失败了。

准确地说,-a /var/run/varnish.sock,PROXY,user=varnish,group=varnish,mode=666意味着Varnish监听UDS套接字接受PROXY协议。没有神奇的开关可以让它同时接受常规 HTTP 和 PROXY 协议。

在一个完美的世界中,您将有一种方法让 NGINX 将 PROXY 协议转发(交谈)到 Varnish。但是您不能在 http {} 上下文中使用 proxy_pass 执行此操作。您可以在 NGINX 流中执行 proxy_pass + proxy_protocol,但这通常不是您想要的,因为这会破坏 HTTP/2 并将其降级为旧协议。

务必阅读 UDS stack concepts。具体来说,它提到了为什么 NGINX 不是 UDS 设置中 TLS 终止的错误选择:

NGINX is not capable of forwarding PROXY protocol via http proxy module. It means that server { proxy_pass .... } TLS termination to a Varnish which listens on a PROXY protocol, will not work.

nginx SSL stream + Varnish listening on PROXY protocol won’t support HTTP/2 because nginx SSL stream does not know how to negotiate ALPN proto.