업스트림의 호스트를 찾을 수없는 경우 nginx가 충돌하지 않도록 설정
Docker의 공통 도메인 아래에 여러 개의 레일 앱이 있으며 nginx를 사용하여 특정 앱에 요청을 보냅니다.
our_dev_server.com/foo # proxies to foo app
our_dev_server.com/bar # proxies to bar
구성은 다음과 같습니다.
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
응답하지 않으면 's를 반환합니다.resolver
지시문을 사용하여 현재 작동 여부에 관계없이 호스트를 확인할 수있는 항목을 가리 킵니다.location
위의 작업을 수행 할 수없는 경우 수준 에서 해결하십시오 (이렇게하면 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; }
The main advantage of using upstream
is to define a group of servers than can listen on different ports and configure load-balancing and failover between them.
In your case you are only defining 1 primary server per upstream so it must to be up.
Instead, use variables for your proxy_pass
(es) and remember to handle the possible errors (404s, 503s) that you might get when a target server is down.
For me, option 3 of the answer from @Justin/@duskwuff solved the problem, but I had to change the resolver IP to 127.0.0.11 (Docker's DNS server):
location /foo {
resolver 127.0.0.11 valid=30s;
set $upstream_foo foo;
proxy_pass http://$upstream_foo:80;
}
location /bar {
resolver 127.0.0.11 valid=30s;
set $upstream_bar foo;
proxy_pass http://$upstream_bar:80;
}
But as @Justin/@duskwuff mentioned, you could use any other external DNS server.
You can do not use --link
option, instead you can use port mapping and bind nginx to host address.
Example: Run your first docker container with -p 180:80
option, second container with -p 280:80
option.
Run nginx and set these addresses for proxy:
proxy_pass http://192.168.1.20:180/; # first container
proxy_pass http://192.168.1.20:280/; # second container
'programing' 카테고리의 다른 글
RESTful 웹 서비스를 보호하는 방법은 무엇입니까? (0) | 2020.09.10 |
---|---|
Spring Boot 시작 시간 단축 (0) | 2020.09.10 |
Django에서 새 앱 (startapp 포함)을 언제 만들까요? (0) | 2020.09.10 |
LaunchScreen.xib가 내 사용자 정의 글꼴을 표시하지 않음 (0) | 2020.09.10 |
Amazon EC2, Google App Engine, Microsoft Azure 및 Salesforce.com은 언제 사용해야합니까? (0) | 2020.09.10 |