- 我在 AWS Elastic Beanstalk 上部署了 docker - 我有一个 Node.js Web 应用程序,并且需要它在 https 上运行。
- 当我点击 Elastic beanstalk 控制台中的链接时,我从 nginx/1.12.1 收到 502 Bad Gateway。
- 我能够在实例级别访问该应用。
- 我尝试为 TCP 直通 ( https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/https-tcp-passthrough.html ) 配置负载均衡器,只是为了检查应用是否会运行,但这没有帮助。
- 接下来,我尝试在负载平衡的 Elastic Beanstalk 环境 ( https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-endtoend.html ) 中配置端到端加密,但仍然遇到相同的错误。
- 我的应用程序需要端到端 https 来实现 sso。
- 以下是我在 .ebextensions 中为 https 使用的设置
sslSecurityGroupIngress:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
IpProtocol: tcp
ToPort: 443
FromPort: 443
CidrIp: 0.0.0.0/0
在 Nginx 中,我已经增加了 proxy_connect_timeout 和 proxy_read_timeout
最佳答案
我可以看到我的应用程序被配置为在端口 80 和 443 上监听,尽管规则仅重定向实例的端口 80,即使请求来自 https 协议(protocol)也是如此。如果您想配置端到端 https,则需要重定向到实例的端口 443 的规则。
以前我的 Elastic Beanstalk 配置设置如下:
Listener Rules Process
443 443 default
80 80 default
其中“默认”进程通过实例的端口 80 重定向所有连接。
我更新了 ElasticBeanstalk 环境以将 https 请求转发到实例的端口 443?以下是如何将规则与流程关联起来的示例:
======== .ebextensions/https-reencrypt-alb.config ========
option_settings:
aws:elbv2:listener:443:
DefaultProcess: https
ListenerEnabled: 'true'
Protocol: HTTPS
aws:elasticbeanstalk:environment:process:https:
Port: '443'
Protocol: HTTPS
======== .ebextensions/https-reencrypt-alb.config ========
可能导致此问题的一种情况可能与您的应用程序仅监听 443 端口有关,一旦实例中没有该端口的 ALB 重定向规则,则访问失败并显示以下错误是合理的:错误的网关请求。
添加此内容以进行 http 到 https 重定向:
============= http-to-https.config ===============
Resources:
AWSEBV2LoadBalancerListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: redirect
RedirectConfig:
Protocol: HTTPS
Port: 443
StatusCode: 'HTTP_301'
LoadBalancerArn:
Ref: AWSEBV2LoadBalancer
Port: 80
Protocol: HTTP
============= http-to-https.config ===============
关于Node.js 和 Docker - Elastic Beanstalk 502 错误网关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54677909/