通过 Unix 域套接字连接 Nginx 和 Varnish 6 不工作
Connect Nginx and Varnish 6 via Unix Domain Socket not working
我在同一台机器上使用 Nginx 作为 Varnish 6 前面的 SSL 端点。这在使用 TCP 端口时效果很好。由于 Varnish 6 支持监听 Unix 域套接字,我更改了配置以使用套接字:
varnishd 以选项启动:-a /var/run/varnish.sock,PROXY,user=varnish,group=varnish,mode=666
(以前是 -a :8080)
在Nginx配置中,我将proxy_pass http://127.0.0.1:8080;
改为proxy_pass http://unix:/var/run/varnish.sock;
重启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.
我在同一台机器上使用 Nginx 作为 Varnish 6 前面的 SSL 端点。这在使用 TCP 端口时效果很好。由于 Varnish 6 支持监听 Unix 域套接字,我更改了配置以使用套接字:
varnishd 以选项启动:
-a /var/run/varnish.sock,PROXY,user=varnish,group=varnish,mode=666
(以前是 -a :8080)在Nginx配置中,我将
proxy_pass http://127.0.0.1:8080;
改为proxy_pass http://unix:/var/run/varnish.sock;
重启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.