在运行Docker的单实例Elastic Beanstalk环境中配置HTTPS遇到问题
配置问题根源&解决步骤
首先修正Nginx HTTP监听端口配置
你当前/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf里的监听端口写的是listen 8080,这是错误的:Elastic Beanstalk默认场景下Nginx需要监听主机的80端口,转发请求到你Dart服务所在容器的8080端口,你把监听端口改成8080之后,主机80端口没有服务处理,自然会出现访问异常。直接把该行修改为listen 80;即可,你的Dart服务保持默认监听8080端口就行,不需要改服务端口。修正HTTPS配置的语法和转发规则
你当前HTTPS配置里用了已经废弃的ssl on指令,新版本Nginx已经不支持该写法,会导致Nginx启动失败,HTTPS请求直接被拒绝。修改/etc/nginx/conf.d/https.conf里的Server块:
把listen 443;改成listen 443 ssl;,然后删除单独的ssl on;行即可。
同时确认转发规则:如果你的Nginx没有预定义docker上游服务,直接把proxy_pass http://docker;改成proxy_pass http://127.0.0.1:8080;,指向你本地运行的Dart服务端口即可。验证私有密钥拉取权限
确认你的EC2实例角色(默认是aws-elasticbeanstalk-ec2-role)已经配置了对应S3桶的s3:GetObject权限,否则实例拉不到私有密钥文件,Nginx加载SSL证书失败也会启动异常。你可以直接登录EB实例执行nginx -t命令检查Nginx配置是否合法,就能快速定位是不是证书/密钥的问题。可选优化(负载均衡环境)
如果你用的是带负载均衡的EB环境,不需要在实例层面配置HTTPS:直接把证书上传到AWS证书管理器,给负载均衡配置443监听器做SSL卸载即可,配置更简单,也方便后续证书更新。
配置修改完成后重新部署EB环境即可生效,要是还有异常可以直接查看Nginx的错误日志/var/log/nginx/error.log定位具体问题。
内容的提问来源于stack exchange,提问作者infinitewizard1010

