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

Mat*_*agg 10 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时不起作用.

小智 5

这一行代码为我修复了它:

curl_setopt($ch, CURLOPT_HTTPHEADER, ['Expect:']);
Run Code Online (Sandbox Code Playgroud)

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

更多信息

Google文档设置HTTP(S)负载平衡在" 注释和限制"部分的底部附近有一个注释,表示HTTP/1.1 100 Continue不支持响应.

似乎默认情况下,cURL将始终Expect: 100-continue在发送POST请求时设置标头.因此,显然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.

感谢这个问题有助于解决这个问题.

  • 该死的,罗斯,如果我能给你一万亿票,我愿意!这是那些为期一周、令人头痛的问题之一。 (2认同)

Tyg*_*uy7 1

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

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

130.211.0.0/22   tcp:1-5000   Apply to all targets
Run Code Online (Sandbox Code Playgroud)