![](/img/trans.png)
[英]How do I make nginx wait for my upstream service to start up in a Docker Swarm?
[英]How to use Docker swarm DNS/Service names in Nginx upstream
我有一個服務運行4個swarm節點(ServiceA)和一個運行在同一個Swarm上的4個節點上的Nginx服務。 Nginx服務公開/發布端口80和443.所有服務都連接到同一個用戶定義的覆蓋網絡,最重要的是我可以從容器內卷曲/ ping服務名稱(ServiceA),所以到目前為止一切正常。
我的問題是如何讓Nginx上游使用服務名稱? 我已經閱讀了很多,並嘗試將其添加到nginx.conf resolver 127.0.0.11 ipv6=off;
但它沒有幫助,Nginx服務將無法啟動。 關於如何讓Nginx看到Docker網絡DNS名稱的任何想法?
這是我的nginx.conf
events {
worker_connections 4096;
}
http {
include /etc/nginx/conf/*.conf;
include /etc/nginx/mime.types;
proxy_intercept_errors off;
proxy_send_timeout 120;
proxy_read_timeout 300;
upstream serviceA {
ip_hash;
server serviceA:8081;
}
server {
listen 80 default_server;
resolver 127.0.0.11 ipv6=off;
keepalive_timeout 5 5;
proxy_buffering off;
underscores_in_headers on;
location ~ ^/serviceA(?<section>.*) {
access_log /var/log/nginx/access.log nginx_proxy_upstream;
proxy_pass http://serviceA/$section$is_args$query_string;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 443 ssl;
resolver 127.0.0.11 ipv6=off;
keepalive_timeout 5 5;
proxy_buffering off;
underscores_in_headers on;
# allow large uploads
client_max_body_size 10G;
ssl_certificate /etc/nginx/ssl/myKey.crt;
ssl_certificate_key /etc/nginx/ssl/myKey.key;
location ~ ^/serviceA(?<section>.*) {
access_log /var/log/nginx/access.log nginx_proxy_upstream;
proxy_pass http://serviceA/$section$is_args$query_string;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
如果已部署上游容器(創建DNS條目),則應刪除resolver
。 但是,這意味着除非上游容器已在運行,否則無法啟動nginx。
對於通過resolver
的動態方法,您需要從容器內訪問docker引擎主機的DNS ( 不是通過 UPDATE:在自定義網絡上可以查詢127.0.0.0/8地址) 。 127.0.0.11
...這是容器本身
https://docs.docker.com/engine/userguide/networking/configure-dns/ :
注意:如果需要訪問主機的localhost解析程序,則必須修改主機上的DNS服務以偵聽可從容器內訪問的非本地主機地址 。
更新:我設法在docker swarm中的自定義覆蓋網絡上執行此操作,如下所示:
location / {
resolver 127.0.0.11 ipv6=off;
set $upstream_addr <swarm_stack_name>:<port>;
proxy_pass https://$upstream_addr;
...
}
我沒有使用upstream {}
nginx指令...這似乎沒有處理動態結果或我忽略了一些東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.