如果我将带有文件上传的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时不起作用。
答案 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