关于 proxy_pass 的动态域名解析问题

本贴最后更新于 2134 天前,其中的信息可能已经时移世异

关于proxy_pass 的域名解析问题


nginx在反向代理动态的域名的时候, 差不多一天出现一次nginx访问挂掉,但真实服务正常运行,重启后又正常了, 查nginx的log,后发现域名解析的IP改变了后,nginx会缓存之前的IP,我了个去,最先找到了这人nginx的衍生品http://www.senginx.org/cn/index.php/动态upstream域名解析  (还没测试),嗯,好歹给了个结果,恼了蛮久还以为是nginx对web服务的连接未释放引起的呢! 这下满足了。。。。。


下文 文章转自: http://www.techindeep.com/nginx_proxy_pass.html


最近遇到了一个奇怪的问题,我们的一个需要nginx转发的A接口调用另一个IP服务接口时会报502,但是单独调用IP服务时就OK。并且reload A接口的nginx后,居然就正常了。
看了下A接口的nginx配置
location ^~/api/searchip.htm {
proxy_cache STATIC;
proxy_cache_valid 200 304 301 302 5m;
proxy_cache_key $host$uri$is_args$args;
proxy_pass http://example.ap-southeast-1.elb.amazonaws.com;
}
看起来很正常。
检查error日志发现了一个问题,日志中proxy_pass到后端的IP并不是example.ap-southeast-1.elb.amazonaws.com的当前IP。
在经过分析,找到了原因,example.ap-southeast-1.elb.amazonaws.com是亚马逊的ELB,后端挂着两台服务器作为后端。由于ELB的IP池是变化的,我们的ELB随着流量扩张收缩后,ELB的IP发生了变化。但是nginx配置proxy_pass的域名并没有被重新解析。仍然转到老的解析IP去了,因此出现了502。
有两个解决方法:
1、 将proxy_pass的域名改成upstream到具体的IP,因为我们的后端服务器是不变化的。
2、 可以将proxy_pass 后面的域名转为动态的,nginx 默认5分钟会重新解析动态的域名。
类似这样:
location ^~/api/searchip.htm {
proxy_cache STATIC;
proxy_cache_valid 200 304 301 302 5m;
proxy_cache_key $host$uri$is_args$args;
# proxy_pass http://example.ap-southeast-1.elb.amazonaws.com;
resolver 8.8.8.8;
set $IPS test.example.com;
proxy_pass http://$IPS;
}
参考文章:
http://forum.nginx.org/read.php?2,215830,215832#msg-215832

http://serverfault.com/questions/240476/how-to-force-nginx-to-resolve-dns-of-a-dynamic-hostname-everytime-when-doing-p

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    287 引用 • 535 回帖 • 432 关注

广告 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    最新发现,上文的 5 分钟,并不是精确的 5 分钟,而是 DNS 服务器刷新缓存的时间,也就是说 :这"ngnix 配置 成了动态域名,就不缓存 IP 了" ,然后你再把 “resolver 223.5.5.5 223.6.6.6 1.2.4.8 114.114.114.114 valid=3600s;” 设置成阿里的 DNS 服务器,我 X 快的一 B 了