Amazon EC2监听HTTPS请求并转发至SpringBoot应用的实现方法咨询
解决方案总览
目前有两种主流实现方案,你可以根据业务规模和成本要求选择:
方案一:EC2实例部署Nginx反向代理(适合中小流量、成本敏感场景)
该方案直接在现有EC2上部署反向代理服务完成SSL卸载和请求转发,无需额外采购AWS服务:
- 第一步:申请SSL证书
可通过Let's Encrypt申请免费域名证书,或在AWS Certificate Manager(ACM)申请免费证书,证书绑定的域名需和你调用后端的域名完全一致。 - 第二步:EC2实例安装Nginx
以Amazon Linux 2系统为例,执行安装命令:sudo yum install nginx -y - 第三步:配置Nginx反向代理规则
在/etc/nginx/conf.d/目录下新建springboot-proxy.conf配置文件,添加如下内容:server { listen 443 ssl; server_name 你的后端域名; # 替换为实际使用的域名,如api.xxx.com # 替换为你自己的SSL证书文件路径 ssl_certificate /etc/ssl/certs/your_domain_fullchain.pem; ssl_certificate_key /etc/ssl/private/your_domain_privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://127.0.0.1:8080; # 转发到本地SpringBoot的8080端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } - 第四步:调整EC2安全组规则
入站规则开放443端口(HTTPS)的公网访问权限,8080端口仅允许127.0.0.1访问,避免SpringBoot端口直接暴露在公网。 - 第五步:验证配置并启动服务
执行命令校验Nginx配置是否合法:sudo nginx -t
无报错的话执行重启命令生效配置:sudo systemctl restart nginx
同时设置Nginx开机自启:sudo systemctl enable nginx
配置完成后即可实现所需转发效果:POST https://xxx.xxx.xxxx:443/user/signin 自动转发到 http://127.0.0.1:8080/user/signin
方案二:AWS应用负载均衡(ALB)方案(适合中大规模流量、需要高可用的生产场景)
该方案就是你提到的负载均衡处理HTTPS的方案,优势是SSL卸载由ALB完成,不需要在EC2上维护证书,还支持后续多EC2实例扩容:
- 第一步:在ACM中为你的后端域名申请免费SSL证书,完成域名所有权验证。
- 第二步:创建互联网面向型ALB,监听器配置443 HTTPS端口,绑定刚才申请的ACM证书。
- 第三步:创建HTTP协议的目标组,端口设置为8080,将部署SpringBoot的EC2实例加入目标组,健康检查配置为SpringBoot的可访问路径(如自定义的健康接口)。
- 第四步:调整安全组规则:ALB的安全组开放443端口公网访问,EC2实例的安全组仅允许ALB的安全组访问8080端口,避免公网直接访问SpringBoot。
- 第五步:将你的后端域名解析到ALB的CNAME地址即可。
注意事项
- 两种方案都不需要修改SpringBoot的任何配置,SpringBoot保持默认监听8080 HTTP端口即可。
- 生产环境建议关闭EC2的22端口公网访问,改用AWS Session Manager登录实例,提升安全性。
- 若使用ALB方案,不需要在EC2上额外配置SSL证书,所有HTTPS加解密操作都由ALB完成,降低EC2的性能开销。
内容的提问来源于stack exchange,提问作者Ao Jiao
相关产品推荐
相关产品推荐

