EC2环境下Flask应用通过AWS ALB配置HTTPS(SSL)的方案咨询
正确配置方案指导
核心逻辑:ACM证书无需部署到EC2实例上,直接将HTTPS加解密逻辑放在ALB层完成即可,完美解决ACM证书不可导出的问题。以下提供两种可落地的配置方案,可根据自身业务需求选择:
方案一:保留原有HTTP栈(改动最小,最推荐)
完全不需要修改EC2内部已有的nginx -> gunicorn -> Flask HTTP服务逻辑,仅调整ALB和目标组配置即可:
- ALB侧配置:
- 新增443端口的HTTPS监听器,直接绑定你在ACM申请的证书
- 新增80端口的HTTP监听器,配置默认动作为重定向到443端口,实现所有HTTP请求自动跳转HTTPS
- 目标组配置:
- 目标组协议修改为HTTP,端口设置为你原有nginx暴露的HTTP端口(比如默认80,或你自定义的其他端口),健康检查也使用HTTP协议对应路径
- 最终链路:
用户HTTPS请求 -> ALB(443端口,HTTPS卸载,绑定ACM证书)-> 目标组(HTTP)-> EC2(nginx HTTP端口)-> gunicorn -> Flask - 优势:完全复用原有EC2内部的服务配置,nginx可继续承担静态资源代理、限流、访问日志收集、访问控制等你原有配置的功能。
方案二:简化栈结构,去掉nginx
如果你的业务场景没有用到nginx的额外功能,可直接用gunicorn对接目标组:
- 目标组协议保持HTTP,端口指向gunicorn监听的端口(比如默认8000)
- 最终链路:
ALB(HTTPS卸载)-> 目标组(HTTP)-> EC2(gunicorn HTTP端口)-> Flask - 注意:绝对不要直接使用Flask自带的开发服务器(
flask run启动的服务)对接目标组或暴露到公网,开发服务器没有生产级的并发处理能力和稳定性,仅适合本地调试使用,生产环境必须保留gunicorn这类WSGI服务器。
补充说明
- 无特殊合规要求的场景下,ALB到EC2之间走私有网络的HTTP通信即可满足安全需求,不需要在EC2上配置任何HTTPS相关逻辑,也无需给EC2的安全组开放443端口到公网,仅需要允许ALB的安全组访问EC2对应的HTTP端口即可。
- 如果要求ALB到EC2之间的链路也必须HTTPS加密,可以自行给EC2内部服务生成自签名证书使用,ALB配置后端协议为HTTPS时可选择忽略证书校验,不需要用到ACM的公开证书。
内容的提问来源于stack exchange,提问作者MS-87
相关产品推荐
相关产品推荐

