我在docker swarm的默认nginx配置(根据lets-nginx项目)中通过lets-nginx运行nginx:
服务:
ssl:
image: smashwilson/lets-nginx
networks:
- backend
environment:
- EMAIL=sas@finestructure.co
- DOMAIN=api.finestructure.co
- UPSTREAM=api:5000
ports:
- "80:80"
- "443:443"
volumes:
- letsencrypt:/etc/letsencrypt
- dhparam_cache:/cache
api:
image: registry.gitlab.com/project_name/image_name:0.1
networks:
- backend
environment:
- APP_SETTINGS=/api.cfg
configs:
- source: api_config
target: /api.cfg
command:
- run
- -w
- tornado
- -p
- "5000"
api
是一个烧瓶应用,可在群组覆盖网络backend
上的端口5000上运行。
最初启动服务时一切正常。但是,每当我以使api
容器在三节点群中的节点之间移动的方式更新api
时,nginx
无法将流量路由到新容器。
我可以在nginx日志中看到它坚持旧的内部ip,例如10.0.0.2,当新容器现在在10.0.0.4时。
为了让nginx'看到'新的IP我需要重新启动nginx容器或docker exec
进入它并kill -HUP
nginx进程。
是否有更好的自动方式让nginx容器刷新其名称解析?
答案 0 :(得分:4)
感谢@ Moema的指针,我想出了一个解决方案。需要调整lets-nginx的默认配置,以使nginx获取IP更改:
resolver 127.0.0.11 ipv6=off valid=10s;
set $upstream http://${UPSTREAM};
proxy_pass $upstream;
这使用docker swarm的解析器和TTL并设置变量,强制nginx刷新swarm中的名称查找。
答案 1 :(得分:0)
请记住,当您使用set
时,您需要自己生成整个URL。
我在compose中使用nginx代理zuul网关:
location /api/v1/ {
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_pass http://rs-gateway:9030/api/v1/;
}
location /zuul/api/v1/ {
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_pass http://rs-gateway:9030/zuul/api/v1/;
}
现在有了Swarm,它看起来像这样:
location ~ ^(/zuul)?/api/v1/(.*)$ {
set $upstream http://rs-gateway:9030$1/api/v1/$2$is_args$args;
proxy_pass $upstream;
# Set headers
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
}
正则表达式很好,但不要忘记自己将GET参数插入到生成的URL中。