通过Unix域套接字连接Nginx和Varnish 6无法正常工作

时间:2019-05-15 16:30:02

标签: nginx varnish unix-socket

我将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上运行

1 个答案:

答案 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协议。