HAProxy作为AWS API网关的反向代理

正如标题所示,我有一个AWS API Gateway端点,我想把它放在HAProxy后面。

这是我目前的HAProxyconfiguration

defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen http bind 127.0.0.1:8080 maxconn 18000 acl api_gateway path_beg /api-gateway use_backend api-gateway-backend if api-gateway backend api-gateway-backend http-request set-header Host xxxxx.execute-api.ap-southeast-2.amazonaws.com server api-gateway xxxxx.execute-api.ap-southeast-2.amazonaws.com:443 

当我点击HAProxy上的/api-gateway端点时,会收到400 Bad Request 。 见下文:

api网关400

我试图改变后端使用此server api-gateway xxxxx.execute-api.ap-southeast-2.amazonaws.com:443 ssl verify none但我得到503 Service Unavailable而不是。

我认为这可能与SSL SNIconfiguration有关,我需要在HAProxy上启用,请参阅此论坛posthttps://forums.aws.amazon.com/thread.jspa?threadID=240197

如果您不使用HTTPS,则CloudFront将返回400 Bad Request错误,因为API网关不支持HTTP。

添加ssl verify none HTTPS启用到后端,CloudFront只是closures连接,导致HAProxy 在断开连接时logging会话状态为SC--并返回本地503 Service Unavailable错误。

该解决scheme确实发送服务器名称标识(SNI)。 否则,CloudFront的前端不知道要为您提供哪个SSL证书 – 通用*.cloudfront.net通配符证书,或者*.execute-api.ap-southeast-2.amazonaws.com或可能还有数十万种其他的可能性。 这就是SNI在这种情况下所做的 – 它告诉服务器你连接的是什么名字。

解决scheme – 这是一个单行,显示为多行清晰:

 server api-gateway xxxxx.execute-api.ap-southeast-2.amazonaws.com:443 ssl verify none sni str(xxxxx.execute-api.ap-southeast-2.amazonaws.com) 

您必须在此使用str()string样本提取 ,因为sni服务器关键字需要一个样本提取expression式(例如,您希望使用传入请求的SNI的情况)。

表格问题中的问题实际上与SNI没有关系 – configuration的一部分是正确的。 问题在于他们没有做好你已经做得正确的事情 – http-request set-header host ...以便CloudFront看到正确的Host:头。


还要注意论坛上的build议,这是一个“非常糟糕的主意”,似乎明显错位。 我还没有在生产环境中使用API​​网关,但是当我这样做时,我完全是这样做的。