【发布时间】:2016-12-10 04:20:52
【问题描述】:
我让 HaProxy 终止 SSL 并将请求传递回 Varnish,然后 Varnish 为缓存页面或来自 Nginx 的请求提供服务。但是,Varnish 似乎将来自 HaProxy 的请求视为 HTTP/1 而不是 HTTP/2 并且无法提供服务。
当我尝试点击一个页面时,我可以在 Nginx 日志中看到以下内容:
" while reading PROXY protocol, client: 127.0.0.1, server: 127.0.0.1:8181
2016/08/11 06:53:31 [error] 5682#0: *1 broken header: "GET / HTTP/1.1
Host: www.example.com
User-Agent: curl/7.50.2-DEV
Accept: */*
X-Forwarded-For: IP_Removed
Accept-Encoding: gzip
X-Varnish: 32777
我发现了一些与 here 相关的内容,其中指出原因是 Nginx 仅适用于 v2 代理 v1。因此,因此,我使用 send-proxy 而不是 send-proxy-v2 开关强制在 HaProxy 中使用协议 1。但是当涉及到 Varnish 时,我认为 Varnish 正在以某种方式将其转换为协议 2,这导致它无法与 Nginx 正确通信。
我已经从等式中删除了 Varnish,并将 HaProxy 直接连接到 Nginx,它通过 HTTP/2 完美运行。问题是 Varnish 堆栈中发生了一些事情,可能怀疑是 Varnish 使用的代理协议 v2。
那么,长话短说,我如何强制 Varnish 遵守 PROXY1 而不是 PROXY2 协议?我尝试将 PROXY1 添加到启动守护程序选项中,但 Varnish 不会接受。任何帮助表示赞赏。谢谢!
更新 - 我在 HaProxy 后端使用 send-proxy-v2 开关测试了 HaProxy > Nginx,它导致了与将 Varnish 引入堆栈时相同的问题。在 HaProxy 上切换回 send-proxy 可以解决此问题。所以,我确信问题在于 Varnish 使用协议 2 而不是协议 1。但是如何告诉它不要呢?
【问题讨论】:
-
你确定你在谈论 HTTP/2 吗?这与 PROXY v2 协议无关。 Varnish 不支持 HTTP/2,它将在 Varnish 5.x 中引入。
-
也许我自己很困惑,但我的理解是 HaProxy 在处理 HTTP/2 时作为 TCP 而不是 HTTP 运行,因此有必要在后端使用 send-proxy。 Nginx 设置为使用它的 proxy_protocol 开关接收这个。我知道 Varnish 不是 HTTP/2 或 SSL,但它应该将协议原样传回 Nginx 没有?