一些Nginx反向代理配置每天停止工作一次


12

我有一个Nginx反向代理,可以代理从外部亚马逊ELB到内部ELB的请求。

我有6个处理请求的后端实例。启用了站点的配置如下所示,但是端口号和proxy_pass不同。其他所有内容都相同:

server {
    listen 3000;
    location / {
            proxy_pass http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000;
            include /etc/nginx/proxy.conf;
    }

}

大约每隔24小时,其中一种配置就会停止工作。所有其他代理都可以正常工作。如果我重新启动nginx,所有配置将再次起作用。error.log中没有任何内容,访问日志,syslog或dmesg中也没有任何异常。

这是已知的吗?我的代理配置有问题吗?我还可以查看其他日志吗?



Answers:


22

这个问题的答案是ELB有时会更改ip地址,而nginx确实会在启动期间进行名称解析。

要解决此问题,您的VPC中始终有一个DNS服务器为0.2。因此,如果本地IP CIDR为10.0.0.0/16,则DNS服务器位于10.0.0.2。

将此添加到nginx配置。

resolver 10.0.0.2 valid=10s;

需要将proxy_pass 定义为一个变量,否则nginx只会解析一次。因此,根据上述配置,这是正确的配置:

server {
    listen 3000;
    location / {
            resolver 10.0.0.2 valid=10s;
            set $backend "http://internal-prod732r8-PrivateE-1GJ070M0745TT-348518554.eu-west-1.elb.amazonaws.com:3000"
            proxy_pass $backend;
            include /etc/nginx/proxy.conf;
    }
}

有谁知道nginx的哪个版本支持proxy_pass设置中的变量?我试图在弹性魔豆(nginx的版本1.6.2),它不希望接受变量反正我把它英寸
斯蒂芬ç

谢谢您的帮助,大约一个月以来一直在使我们疯狂!
Jim.R

关于nginx块的这篇文章也重复了此配置。nginx.com/blog/dns-service-discovery-nginx-plus
摩根Christiansson

1

如果您的proxy_pass没有直接传递给一个URL(如您的示例所示(http://amazonaws.com)),而是传递给了代理上游服务器场,如下所示:

upstream my_upstream {
 server1 127.0.0.1:1337;
 server2 127.0.0.1:1338; 
}
location / {
 proxy_pass         http://my_upstream;
}

这样一来,您就不必担心上游之一暂时失效了。因为他们都会做同样的工作。如果一个人没有回复,那么下一个将被代理该响应。内心的平静。

Nginx将自动跳过故障机器x秒钟。直到您修理它或它自己返回为止。(http://wiki.nginx.org/HttpUpstreamModule

因此,无论中断的原因是什么,通过将它们分发到上游服务器场中,都可以简化设置。


感谢您的回复!奇怪的是,我可以直接向后端实例发出请求,但不能通过nginx。如果我只是重新启动nginx,则请求将再次被代理。由于这已经在生产环境中了,所以我真的很想找出为什么其中一个配置似乎被“卸载”了,或者我怎么才能知道nginx在幕后真正做了什么。
user202172 2013年

然后,您可能想寻找更多的Nginx日志信息。这是一个人像您一样试图找出有关“我正在代理的间歇性问题”的更多信息的问题stackoverflow.com/questions/9914792/…他描述了一种获取更多相关日志的方法。希望能帮助到你。
user18099 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.