繁体   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