Ste*_*ons 7 dns routing nginx docker docker-swarm
我有一个服务运行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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
resolver如果已经部署了上游容器(创建了DNS条目),则删除应当有效。但是,这意味着除非上游容器已经在运行,否则您无法启动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服务,以侦听可从容器内部访问的非localhost地址。
更新: 我设法在docker swarm中的自定义覆盖网络上做到了这一点:
location / {
resolver 127.0.0.11 ipv6=off;
set $upstream_addr <swarm_stack_name>:<port>;
proxy_pass https://$upstream_addr;
...
}
Run Code Online (Sandbox Code Playgroud)
我没有让它与upstream {}nginx指令一起使用...这似乎无法处理动态解析,或者我忽略了某些东西。
| 归档时间: |
|
| 查看次数: |
2322 次 |
| 最近记录: |