Nginx upstream не работает со стеком развертывания докера - PullRequest
4 голосов
/ 24 марта 2019

Я пытаюсь развернуть стек с помощью докера.

Вот как работает мой стек:

  • 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 все работает нормально. Но когда я пытаюсь развернуть с помощью стек докера, разверните --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;
    }
}

Если вы видите что-то не так в моей конфигурации или что-то, что я могу сделать лучше, дайте мне знать!

1 Ответ

2 голосов
/ 24 марта 2019

это происходит потому, что служба nginx-api работает до службы api.

но я добавил опцию depends_on?

вы правы, и эта опция должна работать для docker-compose up дела. но, к сожалению, не на docker stack deploy или, как выразился документ :

Параметр depen_on игнорируется при развертывании стека в режиме роя с версией 3. Создайте файл.

хорошо, что я могу сделать сейчас?

ничего. это на самом деле не ошибка-

Docker Swarm узлы (ваши стековые службы) должны восстанавливаться автоматически при ошибке. (именно поэтому вы определяете опцию restart: always). так что все равно должно работать на вас.

если вы используете файл compose только для развертывания стека, а не на docker-compose up - вы можете полностью удалить опцию depends_on, это ничего не значит для стека докеров.

...