Nginx 上游不适用于 docker 部署堆栈
Nginx upstream doesn't work with docker deploy stack
我正在尝试使用 docker 部署堆栈。
我的堆栈是这样工作的:
- nginx-proxy(将用户请求重定向到好的容器)
- 网站(简单的 nginx 服务网站)
- api(django 应用程序,使用 gunicorn 启动)
- nginx-api(提供静态文件和上传的文件,如果是端点则重定向到 API 容器)
这是我的 docker-compose.yml:
version: '3.2'
services:
website:
container_name: nyl2pronos-website
image: nyl2pronos-website
restart: always
build:
context: nyl2pronos_webapp
dockerfile: Dockerfile
volumes:
- ./logs/nginx-website:/var/log/nginx
expose:
- "80"
deploy:
replicas: 10
update_config:
parallelism: 5
delay: 10s
api:
container_name: nyl2pronos-api
build:
context: nyl2pronos_api
dockerfile: Dockerfile
image: nyl2pronos-api
restart: always
ports:
- 8001:80
expose:
- "80"
depends_on:
- db
- memcached
environment:
- DJANGO_PRODUCTION=1
volumes:
- ./data/api/uploads:/code/uploads
- ./data/api/static:/code/static
nginx-api:
image: nginx:latest
container_name: nyl2pronos-nginx-api
restart: always
expose:
- "80"
volumes:
- ./data/api/uploads:/uploads
- ./data/api/static:/static
- ./nyl2pronos_api/config:/etc/nginx/conf.d
- ./logs/nginx-api:/var/log/nginx
depends_on:
- api
nginx-proxy:
image: nginx:latest
container_name: nyl2pronos-proxy
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./proxy:/etc/nginx/conf.d
- /etc/letsencrypt:/etc/letsencrypt
- ./logs/nginx-proxy:/var/log/nginx
deploy:
placement:
constraints: [node.role == manager]
depends_on:
- nginx-api
- website
当我使用 docker-compose up 时一切正常。
但是当我尝试使用 docker stack deploy --compose-file=docker-compose.yml prod 进行部署时。我的 nginx 配置文件找不到不同的 upstreams.
这是我的服务报错nginx-api:
2019/03/23 17:32:41 [emerg] 1#1: host not found in upstream "api" in /etc/nginx/conf.d/nginx.conf:2
看下面我的nginx.conf:
upstream docker-api {
server api;
}
server {
listen 80;
server_name xxxxxxxxxxxxxx;
location /static {
autoindex on;
alias /static/;
}
location /uploads {
autoindex on;
alias /uploads/;
}
location / {
proxy_pass http://docker-api;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
如果您发现我的配置有问题或我可以做得更好,请告诉我!
发生这种情况是因为 nginx-api
服务在 api
服务之前启动。
但我添加了 depends_on
选项?
你是对的,这个选项应该适用于 docker-compose up
案例。
但不幸的是 docker stack deploy
上没有,或者,正如 docs 所说:
The depends_on option is ignored when deploying a stack in swarm mode
with a version 3 Compose file.
好的,那我现在该怎么办?
没什么。它实际上不是错误-
docker 集群节点(您的堆栈服务)应该在出错时自动恢复。 (这就是您定义 restart: always
选项的原因)。所以它应该对你有用。
如果您使用撰写文件仅用于部署堆栈而不是在 docker-compose up
上 - 您可以完全删除 depends_on
选项,这对 docker 堆栈没有任何意义。
我正在尝试使用 docker 部署堆栈。
我的堆栈是这样工作的:
- nginx-proxy(将用户请求重定向到好的容器)
- 网站(简单的 nginx 服务网站)
- api(django 应用程序,使用 gunicorn 启动)
- nginx-api(提供静态文件和上传的文件,如果是端点则重定向到 API 容器)
这是我的 docker-compose.yml:
version: '3.2'
services:
website:
container_name: nyl2pronos-website
image: nyl2pronos-website
restart: always
build:
context: nyl2pronos_webapp
dockerfile: Dockerfile
volumes:
- ./logs/nginx-website:/var/log/nginx
expose:
- "80"
deploy:
replicas: 10
update_config:
parallelism: 5
delay: 10s
api:
container_name: nyl2pronos-api
build:
context: nyl2pronos_api
dockerfile: Dockerfile
image: nyl2pronos-api
restart: always
ports:
- 8001:80
expose:
- "80"
depends_on:
- db
- memcached
environment:
- DJANGO_PRODUCTION=1
volumes:
- ./data/api/uploads:/code/uploads
- ./data/api/static:/code/static
nginx-api:
image: nginx:latest
container_name: nyl2pronos-nginx-api
restart: always
expose:
- "80"
volumes:
- ./data/api/uploads:/uploads
- ./data/api/static:/static
- ./nyl2pronos_api/config:/etc/nginx/conf.d
- ./logs/nginx-api:/var/log/nginx
depends_on:
- api
nginx-proxy:
image: nginx:latest
container_name: nyl2pronos-proxy
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./proxy:/etc/nginx/conf.d
- /etc/letsencrypt:/etc/letsencrypt
- ./logs/nginx-proxy:/var/log/nginx
deploy:
placement:
constraints: [node.role == manager]
depends_on:
- nginx-api
- website
当我使用 docker-compose up 时一切正常。 但是当我尝试使用 docker stack deploy --compose-file=docker-compose.yml prod 进行部署时。我的 nginx 配置文件找不到不同的 upstreams.
这是我的服务报错nginx-api:
2019/03/23 17:32:41 [emerg] 1#1: host not found in upstream "api" in /etc/nginx/conf.d/nginx.conf:2
看下面我的nginx.conf:
upstream docker-api {
server api;
}
server {
listen 80;
server_name xxxxxxxxxxxxxx;
location /static {
autoindex on;
alias /static/;
}
location /uploads {
autoindex on;
alias /uploads/;
}
location / {
proxy_pass http://docker-api;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
如果您发现我的配置有问题或我可以做得更好,请告诉我!
发生这种情况是因为 nginx-api
服务在 api
服务之前启动。
但我添加了 depends_on
选项?
你是对的,这个选项应该适用于 docker-compose up
案例。
但不幸的是 docker stack deploy
上没有,或者,正如 docs 所说:
The depends_on option is ignored when deploying a stack in swarm mode with a version 3 Compose file.
好的,那我现在该怎么办?
没什么。它实际上不是错误-
docker 集群节点(您的堆栈服务)应该在出错时自动恢复。 (这就是您定义 restart: always
选项的原因)。所以它应该对你有用。
如果您使用撰写文件仅用于部署堆栈而不是在 docker-compose up
上 - 您可以完全删除 depends_on
选项,这对 docker 堆栈没有任何意义。