如果没有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忽略失败的上游?
-
如果你可以使用静态IP,那就使用它,它会启动,如果没有响应就返回
503
。 -
使用
resolver
指令来指向可以parsing主机的东西,无论它是否正在运行。 -
在
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