如果没有find上游的主机,则设置nginx不会崩溃

在Docker中,我们有几个常用的rails应用程序,我们使用nginx来将请求定向到特定的应用程序。

our_dev_server.com/foo # proxies to foo app our_dev_server.com/bar # proxies to bar 

Config看起来像这样:

 upstream foo { server foo:3000; } upstream bar { server bar:3000; } # and about 10 more... server { listen *:80 default_server; server_name our_dev_server.com; location /foo { # this is specific to asset management in rails dev rewrite ^/foo/assets(/.*)$ /assets/$1 break; rewrite ^/foo(/.*)$ /foo/$1 break; proxy_pass http://foo; } location /bar { rewrite ^/bar/assets(/.*)$ /assets/$1 break; rewrite ^/bar(/.*)$ /bar/$1 break; proxy_pass http://bar; } # and about 10 more... } 

如果其中一个应用程序未启动,则nginx将失败并停止:

 host not found in upstream "bar:3000" in /etc/nginx/conf.d/nginx.conf:6 

我们并不需要所有这些,但nginx否则会失败。 如何让nginx忽略失败的上游?

  1. 如果你可以使用静态IP,那就使用它,它会启动,如果没有响应就返回503

  2. 使用resolver指令来指向可以parsing主机的东西,无论它是否正在运行。

  3. location级别parsing它,如果你不能这样做(这将允许Nginx启动/运行)

     location /foo { resolver 127.0.0.1 valid=30s; # or some other DNS (you company/internal DNS server) #resolver 8.8.8.8 valid=30s; set $upstream_foo foo; proxy_pass http://$upstream_foo:80; } location /bar { resolver 127.0.0.1 valid=30s; # or some other DNS (you company/internal DNS server) #resolver 8.8.8.8 valid=30s; set $upstream_bar foo; proxy_pass http://$upstream_bar:80; } 

使用upstream的主要优点是定义一组服务器,而不是在不同的端口上侦听,在它们之间configuration负载平衡和故障切换。

在你的情况下,你只能每个上游定义一个主服务器,所以它必须启动

相反,使用variables为您的proxy_pass (es),并记住处理可能的错误(404s,503s),您可能会收到目标服务器closures。

你可以不使用--link选项,而是使用端口映射并将nginx绑定到主机地址。

示例:使用-p 180:80选项运行第一个docker容器,使用-p 280:80选项运行第二个容器。

运行nginx并为代理设置这些地址:

 proxy_pass http://192.168.1.20:180/; # first container proxy_pass http://192.168.1.20:280/; # second container