EC2上Nginx缓存ASG维护的ELB上游节点旧IP问题咨询
解决Nginx缓存ELB后端旧IP导致请求转发失败的问题
这个问题我之前帮不少用户踩过坑——核心就是Nginx默认的DNS解析缓存机制在拖后腿!你这边ASG自动扩缩容换IP,但Nginx启动后就把ELB的解析结果缓存死了,除非重启或重载配置,不然根本不会去拿新IP。好在不用动ASG,只要调整Nginx的配置就能搞定。
关键原理
Nginx如果直接在proxy_pass里写ELB域名,只会在启动/重载配置时解析一次DNS,之后就一直用缓存的IP。而用变量存储域名的话,Nginx会每次请求时检查DNS缓存的有效期,到期就重新解析,刚好适配ASG动态变IP的场景。
具体配置步骤
配置DNS解析器与缓存有效期
在Nginx的server块(或http块)里添加resolver指令,指定AWS VPC内部的DNS服务器(通常是VPC网段的第二个IP,比如你的VPC是10.0.0.0/16,那DNS地址就是10.0.0.2),同时设置valid参数控制缓存刷新间隔(比如30秒,根据你的ASG扩缩频率调整)。用变量存储ELB域名
把直接写在proxy_pass里的ELB域名换成变量,触发Nginx动态解析。可选:设置DNS解析超时
加上resolver_timeout避免DNS解析超时影响请求。
完整配置示例
server { listen 80; server_name your-public-domain.com; # 替换成你的VPC DNS地址,设置30秒缓存有效期 resolver 10.0.0.2 valid=30s; resolver_timeout 5s; location / { # 用变量存储ELB的完整DNS域名 set $elb_target your-elb-name.us-east-1.elb.amazonaws.com; proxy_pass http://$elb_target; # 可选:添加常用的proxy头部 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
注意事项
- VPC DNS地址一定要正确:AWS VPC的默认DNS服务器是VPC CIDR块的第二个IP,比如10.2.0.0/16对应的DNS是10.2.0.2,你可以在EC2实例上用
cat /etc/resolv.conf确认。 valid参数的取值:如果ASG扩缩比较频繁,就设短一点(比如15s);如果扩缩少,可设长一点(比如1m),平衡解析性能和IP时效性。- 修改配置后,记得重载Nginx生效:
sudo nginx -s reload
这样配置后,Nginx会每隔30秒自动重新解析ELB的域名,就能获取到ASG新创建实例的IP,请求自然能正确转发了。
内容的提问来源于stack exchange,提问作者Shardool Singh
相关产品推荐
相关产品推荐

