簡體   English   中英

如何在Nginx上游使用Docker swarm DNS / Service名稱

[英]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 不是通過127.0.0.11 ...這是容器本身 UPDATE:在自定義網絡上可以查詢127.0.0.0/8地址)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM