EC2实例搭配ELB与ACM配置Nginx HTTPS及健康检查问题
解决ELB+ACM下EC2 Nginx配置及健康检查异常问题
一、正确的Nginx配置
由于你已经通过ELB+ACM处理HTTPS加密,EC2实例上的Nginx只需要监听80端口,无需配置SSL证书。以下是完善后的配置:
server { listen 80; # 同时匹配域名和EC2私有IP,确保健康检查请求能被正确处理 server_name <my domain name> <EC2 private IP>; # 健康检查专用路由,直接返回200,无需经过Gunicorn,提升可靠性 location /health { return 200 "OK"; add_header Content-Type text/plain; } location / { proxy_pass http://unix:<path to the gunicorn socket>; # 必须配置的代理头,确保Flask能正确识别客户端请求信息 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; # 告诉Flask请求来自HTTPS } }
配置完成后,重启Nginx生效:
sudo systemctl restart nginx
二、健康检查异常排查
按以下步骤逐一排查:
目标组配置验证
- 确保健康检查路径设为
/health(对应上面Nginx配置的路由),端口为80,HTTP状态码匹配200。 - 确认目标组已正确注册EC2实例,实例状态不是"初始中"(若为初始中,等待5-10分钟再查看)。
- 确保健康检查路径设为
EC2安全组及防火墙检查
- 入站规则需允许ELB所在安全组访问80端口(不要直接开放0.0.0.0/0,仅限ELB访问更安全)。
- 检查EC2内部防火墙(如iptables)是否阻止了80端口的本地访问。
日志分析
- 查看Nginx错误日志(通常在
/var/log/nginx/error.log),确认Nginx启动正常,无socket文件权限、路径错误等问题。 - 查看Nginx访问日志(
/var/log/nginx/access.log),检查ELB的健康检查请求是否到达,返回的状态码是什么(若为404,说明路径不匹配;若为502,说明Gunicorn未正常运行)。
- 查看Nginx错误日志(通常在
Gunicorn状态验证
- 确认Gunicorn正在运行:
sudo systemctl status gunicorn - 检查socket文件存在且权限正确(Nginx用户需拥有读写权限,可通过
sudo chown www-data:www-data <path to socket>调整)。
- 确认Gunicorn正在运行:
三、server_name设置说明
不需要将server_name改为EC2公网IP:
- ELB转发请求时会保留客户端的Host头(即你的域名),因此设置为域名可以正确匹配用户的访问请求。
- 加上EC2私有IP是为了兼容ELB的健康检查请求(ELB通常用实例私有IP发起健康检查),避免请求被Nginx的默认server块拦截。
- 若不想指定具体域名和IP,也可以用
server_name _;匹配所有Host头,配置更简洁。
内容的提问来源于stack exchange,提问作者hitaton
相关产品推荐
相关产品推荐

