单实例Elastic Beanstalk Node.js应用HTTPS连接被拒绝求助
我之前也碰到过一模一样的问题,折腾了好一阵才搞定,给你列几个排查方向,按顺序来应该能找到问题:
先检查安全组配置(最容易踩坑的点!)
Elastic Beanstalk的EC2实例安全组必须开放443端口的入站流量,否则直接会拒接HTTPS请求:
- 登录AWS控制台,找到你的Elastic Beanstalk环境对应的EC2实例
- 进入实例的安全组设置,添加入站规则:
- 类型:HTTPS
- 协议:TCP
- 端口范围:443
- 源:根据你的需求设置(比如
0.0.0.0/0或者特定IP段)
- 一定要记得保存规则,有时候哪怕配置文件里做了全对的设置,安全组没开端口直接就白搭
验证.ebextensions配置文件的正确性
官方文档的配置细节很容易错,你可以对照检查这几点:
- 确认
.ebextensions文件夹在压缩包的根目录,不能嵌套在其他文件夹里(比如不能是app/.ebextensions,必须和你的server.js等核心文件同级) - 打开
https-instance-single.config,检查关键配置:- 有没有正确指定证书的ARN?比如:
aws:elb:listener:443: ListenerProtocol: HTTPS InstancePort: 80 InstanceProtocol: HTTP SSLCertificateId: arn:aws:acm:us-east-1:123456789012:certificate/abcdefg-1234-5678-90ab-cdefghijklmn - 单实例环境下,
aws:elasticbeanstalk:environment:proxy部分是不是设置了正确的转发?比如:aws:elasticbeanstalk:environment:proxy: ProxyServer: nginx StaticFiles: /public/=public/ - 检查YAML语法有没有错误(比如缩进不对、冒号后面没空格),YAML对格式特别敏感,一点点小错误都会导致配置完全不生效
- 有没有正确指定证书的ARN?比如:
检查EC2实例上的Web服务器配置是否生效
如果配置文件没问题,登录到EC2实例里直接看Web服务器的状态:
- 用EB CLI或者AWS控制台的“连接”功能进入实例
- 对于Nginx,检查
/etc/nginx/conf.d/elasticbeanstalk/00_application.conf或者00_https_redirect.conf有没有正确生成443端口的配置 - 运行
sudo service nginx status看看服务是否正常,没启动就手动启动sudo service nginx start,顺便看/var/log/nginx/error.log有没有报错 - 如果是Apache,检查
/etc/httpd/conf.d/ssl.conf相关配置,同样看服务状态和日志
确认证书是否有效且匹配域名
- 检查你用的ACM证书是不是已经颁发成功,并且域名和你访问的HTTPS域名完全一致(比如证书是
example.com,你访问www.example.com就会出问题,得用通配符证书或者包含子域名的证书) - 证书不能过期,也不能是在其他区域创建的(单实例环境下,Elastic Beanstalk所在区域必须和证书区域一致)
测试实例本地的HTTPS连接
在EC2实例内部,用curl https://localhost测试一下:
- 如果能正常返回内容,说明实例内部服务没问题,问题出在外部网络或者安全组
- 如果连本地都访问不了,那就是Web服务器配置的问题
内容的提问来源于stack exchange,提问作者Caseyamn
相关产品推荐
相关产品推荐

