2016-08-11 36 views
0

我有HaProxy终止SSL并将请求传递回清漆,然后服务于缓存页面或Nginx请求。但是,Varnish似乎将HaProxy的请求视为HTTP/1而不是HTTP/2,并且无法提供服务。强制清漆使用代理协议1

我可以在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 PROXY only v1。所以,由于这个原因,我强制使用发送代理而不是send-proxy-v2交换机在HaProxy中使用协议1。但是当它变成清漆时,我认为清漆会以某种方式将其转换为协议2,从而导致它无法与Nginx正常通信。

我已经从等式中删除了清漆,并将HaProxy直接连接到Nginx,并通过HTTP/2完美工作。问题是在Varnish堆栈中发生了一些事情,可能的怀疑是Varnish使用的代理协议v2。

因此,长话短说,我该如何强制Varnish坚持使用PROXY1而不是PROXY2协议?我已经尝试将PROXY1添加到启动守护进程选项中,但Varnish不会接受该选项。任何帮助表示赞赏。谢谢!

更新 - 我在HaProxy后端使用send-proxy-v2开关测试了HaProxy> Nginx,并且在将Varnish引入堆栈时导致相同的问题。切换回HaProxy上的发送代理可以解决问题。所以,我确信问题是使用协议2而不是协议1的Varnish。但是如何告诉它不要?

+0

你确定你是在谈论HTTP/2?这与PROXY v2协议无关。 Varnish不会说HTTP/2,它会在Varnish 5.x中引入。 –

+0

也许我对自己感到困惑,但我的理解是,当处理HTTP/2时,HaProxy作为TCP而不是HTTP,因此有必要在后端使用send-proxy。 Nginx设置为通过proxy_protocol开关接收此信息。我了解Varnish不是HTTP/2或者是SSL,但它应该将协议传回给Nginx否? – d1ch0t0my

回答

1

据我所知,Varnish不是HTTP/2,或者做SSL,但它应该将协议传回给Nginx否?

但首先,让我们澄清。 HTTP/2和代理协议V2完全没有关系。从你的头脑中删除HTTP/2,因为这在任何意义上都不适用。

你的问题,其实,这样的:

如果HAProxy的派遣代理协议V1至光油和Nginx的配置背后光油期望代理协议V1,为什么Nginx的抱怨破头? Varnish是否不将代理协议V1转发到后端?是否由于某种原因发送代理协议V2,而不是?

而对这个问题的答案是,清漆不发送任何一个。 V1和V2都不是。

您需要使用代理协议的唯一方法是,HTTP感知组件可以从上游的非HTTP感知组件(例如HAProxy)使用mode tcp或Amazon ELB接收客户端IP地址(和端口)监听器处于TCP模式,其中任何一种通常都是为您进行SSL卸载,而不是HTTP请求路由,因此它需要另一种传递客户端地址的机制。

第一个支持HTTP的组件可以获取该地址并将其设置在HTTP标头中,通常为X-Forwarded-For,这是为了堆栈中其余组件的益处。因此,Varnish没有理由向前转发代理协议。在你的例子中没有这样做,并且没有明显的原因为什么Varnish甚至能够转发代理协议。 ¹

这使我们发现错误。您错误诊断了Nginx正在报告的问题。错误的头错误意味着Nginx正在接收除代理协议V1之外的其他内容。随着光环在循环中,在Nginx的请求中没有代理协议头² - 并且当监听器被配置为期望代理协议头时,该头是强制性的

如果组件配置为期望代理协议V1并且它不存在,那就是总是出错。但“不存在”意味着这一点。 V1头不存在。这并不意味着V2是。事实并非如此。

所以,我相信这个问题是清漆使用协议2,而不是1协议

您已经说服自己不正确。代理V2转换为Nginx - 正如您已经尝试使用HAProxy - 是一个错误,并且根本没有代理协议头 - 就像您从Varnish看到的那样 - 是一个错误,如上所述。两者都是错误配置,但类型不同。你在这里所做的是重复错误,但出于完全不同的原因。

如果您通过Varnish发送所有请求,则配置Varnish以使用从传入的代理协议机箱中获知的信息在转发的请求中设置X-Forwarded-For。从Nginx配置中删除代理协议。

或者将HAProxy配置为以HTTP模式运行,并让其使用option forwardfor插入标头。


¹显然,从错误,光油只是发送普通的HTTP头 - 没有什么看起来像代理协议。我不认为它甚至支持将代理协议发送到原始服务器的选项,但如果我忽略了该功能,有人会说。

²我会断言代理协议“头”没有正确地称为头,给出了什么意思。这是一个序言,而不是标题,尽管它不幸被称为标准中的“标题”。这当然不是HTTP标题。

0

如果升级清漆5.0,可以通过设置” .proxy_header = 1" SEND代理协议版本1至NGINX