我将Nginx用作同一台计算机上Varnish 6前面的SSL端点。使用TCP端口时,此方法效果很好。由于Varnish 6支持在Unix域套接字上进行侦听,因此我将配置更改为使用套接字:
清漆以选项-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的任何Web请求都将返回“ 502 Bad Gateway”。
Nginx错误日志显示“上游从上游读取响应标头时过早关闭了连接”。
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
知道发生了什么事吗?
清漆是清漆6.0.3版本7d1ded3aa033a018317dbafc61587026ea2ef8a3, Nginx是nginx / 1.14.0(Ubuntu), 在Ubuntu 18.04 Bionic上运行
答案 0 :(得分:1)
您有Varnish使用PROXY协议进行侦听,但是NGINX正在与常规HTTP协议进行通讯。因此失败了。
确切地说,-a /var/run/varnish.sock,PROXY,user=varnish,group=varnish,mode=666
表示Varnish仅在接受代理协议的 UDS套接字上侦听。接受常规的HTTP和PROXY协议并没有什么神奇的开关。
在一个完美的世界中,您将为NGINX提供一种将PROXY协议转发(交谈)到Varnish的方法。但是您不能在proxy_pass
上下文中使用http {}
来执行此操作。您可以在NGINX流中执行proxy_pass
+ proxy_protocol
,但这通常不是您想要的,因为那样会破坏HTTP / 2并将其降级为较旧的协议。
请务必阅读UDS stack concepts。具体来说,它提到了为什么NGINX是UDS设置中TLS终止的错误选择:
NGINX无法通过http代理模块转发PROXY协议。这意味着服务器{proxy_pass ....} TLS终结于侦听PROXY协议的Varnish不会起作用。
和
nginx SSL流+基于PROXY协议的Varnish侦听将不支持HTTP / 2,因为nginx SSL流不知道如何协商ALPN协议。