我有一个nginx反向代理服务器,它将来自外部亚马逊ELB的请求代理到内部ELB。
我有6个后端实例处理请求。 站点启用configuration看起来像这样,但有不同的端口号和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小时一次configuration停止工作。 所有其他代理工作正常。 如果我重新启动nginx,所有configuration再次工作。 error.log中没有任何内容,访问日志,系统日志或dmesg中没有什么奇怪的。
这个东西是已知的吗? 我的代理configuration有问题吗? 有没有其他的日志我可以看?
这个问题的答案是,ELB有时会改变ip地址,nginx会在启动时进行名称parsing。
为了解决这个问题,你的VPC中总是有一个DNS服务器在0.2。 所以如果本地IP CIDR是10.0.0.0/16,那么DNS服务器是10.0.0.2。
将此添加到nginxconfiguration。
resolver 10.0.0.2 valid=10s;
proxy_pass也需要被定义为一个variables,否则nginx只会parsing一次。 所以根据上面的configuration,这是正确的configuration:
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; } }
如果您的proxy_pass没有像您的示例( http://amazonaws.com )那样直接传递给一个URL,而是直接传递到代理上游服务器场,如下所示:
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 )
所以无论中断的原因是什么,通过将它们分配到上游农场,这转换成更简单的设置。