我有一个跨4个群集节点(ServiceA)和一个在同一个Swarm上的4个节点上运行的Nginx服务的服务。 Nginx的服务公开/发布端口80和443.所有的服务连接到同一个用户定义的覆盖networking,最重要的是我可以从容器中遏制/ ping服务名称(ServiceA),所以所有的工作到目前为止。
我的问题是如何让Nginx上游使用服务名称? 我读了很多,试着把这个添加到nginx.conf resolver 127.0.0.11 ipv6=off;
但没有帮助,Nginx的服务不会启动。 关于如何获取Nginx的任何想法,请参阅DockernetworkingDNS名称?
这是我的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.0/8地址) 。 127.0.0.11
…这是容器本身
https://docs.docker.com/engine/userguide/networking/configure-dns/ :
注意:如果您需要访问主机的本地主机解析程序,则必须修改主机上的DNS服务以侦听可从容器内访问的非本地主机地址 。
更新:我设法在Docker群中的自定义覆盖网络上这样做:
location / { resolver 127.0.0.11 ipv6=off; set $upstream_addr <swarm_stack_name>:<port>; proxy_pass https://$upstream_addr; ... }
我没有得到它与upstream {}
nginx指令工作…这似乎不处理动态的决议或我忽略了一些东西。