卷曲到Google Compute负载均衡器会收到错误502

时间:2015-06-02 16:03:58

标签: curl load-balancing google-compute-engine

如果我将带有文件上传的POST请求卷曲到我的谷歌计算负载均衡器(LB),我会收到502错误。如果我对LB后面的工作节点执行相同的卷曲,则工作。如果我使用像PHP Guzzle这样的库,它可以正常工作。如果我在LB上做了一个基本的GET请求,我得到了正确的响应,但是工作日志不会确认收到请求,就好像LB缓存了它一样。到底是怎么回事?仅供参考,google LB newb。感谢

编辑:

我正在使用GCE HTTP LB. Curl命令如下所示:

curl http://1.2.3.4 -F "key=value" -F "data=@path/to/file"

此curl命令在使用GCE VM IP时有效,但在使用GCE HTTP LB IP时不起作用。

2 个答案:

答案 0 :(得分:5)

这一行代码为我修好了:

curl_setopt($ch, CURLOPT_HTTPHEADER, ['Expect:']);

您显然需要将空的Expect:标头添加到您发送的任何其他标头中,但该标头修复了用于Google HTTP负载平衡器的cURL。

更多信息

Google文档Setting Up HTTP(S) Load Balancing备注和限制部分的底部附近有一条说明,说明不支持HTTP/1.1 100 Continue个回复。

似乎默认情况下,当您发送POST请求时,cURL将始终设置Expect: 100-continue标头。因此,显然cURL默认情况下无法通过GCE HTTP负载均衡器发送POST。

在最终用户方面,您只看到来自Google的502回复,这更加令人困惑,因为对不在负载均衡器后面的服务器进行完全相同的POST工作完全正常。

但是,Expect: 100-continue的存在会导致Google Load Balancer吓坏并破坏请求。

在服务器端,无法解析POST数据(虽然正确报告了Content-Length,但它甚至没有到达服务器)。在我的情况下,这导致服务器返回500内部服务器错误,GCE LB将其作为502 Bad Gateway错误发送并发回给用户。

添加空的Expect:标头后,我的POST数据正确地进入我的负载平衡虚拟机,他们正在解析并返回有效的响应,而我的客户端正在获得200而不是502。

感谢this question,这有助于阐明这个问题。

答案 1 :(得分:1)

默认情况下,未启用从负载均衡器到您的实例的流量。不幸的是,这没有很好的记录,实际上,当你创建一个负载均衡器时,这应该是自动发生的。

尝试将此防火墙规则添加到负载均衡器和VM所在的网络中:

130.211.0.0/22   tcp:1-5000   Apply to all targets