504 ответ от обратного прокси ngingx с помощью nodejs + docker - PullRequest
0 голосов
/ 23 марта 2019

UPDATE

Я обнаружил, что это работает, если я перезапускаю nginx на контейнере с docker exec -it backend_gateway_1 nginx -s reload. Я нашел некоторую информацию из этого вопроса . Кажется, что подключение к 127.0.0.1, а не к localhost будет работать, однако я использую сети докеров, поэтому я не уверен, какая у меня будет ситуация.

ОРИГИНАЛЬНЫЙ ВОПРОС

Я пытаюсь использовать nginx в качестве обратного прокси-сервера с докером. Я не могу понять, что не так, как иногда, когда это работает, но тогда, если я использую docker-compose down && docker-compose up, чтобы перезапустить все это, я обычно получаю эту ошибку 504

У меня такое ощущение, что это связано с конфигурацией nginx или docker. Я могу сделать запрос к / штрафу, но любой запрос к / пользователю вызывает временную проблему.

Когда я не получаю 504, приложение узла работает хорошо и создает / возвращает пользователя. Я также могу нормально подключиться к базе данных с помощью mongo-express, так что это должно помочь сузить круг.

докер-compose.yml

version: '3.5'
services:
  gateway:
    image: nginx:latest
    restart: always
    ports:
      - 8080:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/nginx-error.log:/var/log/nginx/error.log
    networks:
      - poker_network
  poker_mongo:
    image: mongo:latest
    container_name: poker_mongo
    restart: unless-stopped
    volumes:
      - db-data:/data/db
    expose: 
      - "27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: test
      MONGO_INITDB_ROOT_PASSWORD: 123
    networks:
      - poker_network
    depends_on:
      - gateway
  poker_user:
    container_name: poker_user
    build: ./user/
    image: poker/user:latest
    volumes:
      - ./user/:/usr/src/app
      #- /usr/src/app/node_modules
    expose:
      - "8080"
    depends_on:
      - gateway
      - poker_mongo
    networks:
      - poker_network
    environment:
      WAIT_HOSTS: poker_mongo:27017
  mongo-express:
    container_name: mongo-express
    image: mongo-express
    restart: always
    ports:
      - 8085:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: test
      ME_CONFIG_MONGODB_ADMINPASSWORD: 123
      ME_CONFIG_MONGODB_SERVER: poker_mongo
    depends_on:
     - gateway
     - poker_mongo
    networks:
      - poker_network

networks:
  poker_network:
volumes: 
  db-data:

nginx.conf

events { worker_connections 1024; }

http {

    server {
        listen 80;
        location /user {
            rewrite /user/(.*) /$1  break;
            proxy_pass http://poker_user:8080/;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
        }
        location / {
            return 200 'hello';
        }

    }
}

Любая помощь приветствуется, спасибо.

1 Ответ

1 голос
/ 25 марта 2019

Я нашел несколько похожих вопросов и постараюсь составить из них два возможных решения:

Первое решение

Первое решение заключается в обращении зависимости между службами: вместо poker_user зависит от gateway, вы можете gateway зависеть от пользователя,Таким образом, когда gateway запускается, если сможет разрешить poker_user имя хоста.

Файл Docker будет выглядеть следующим образом:

version: '3.5'
services:
  gateway:
    image: nginx:latest
    restart: always
    ports:
      - 8080:80
    depends_on: poker_user
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/nginx-error.log:/var/log/nginx/error.log
    networks:
      - poker_network
  poker_mongo:
    image: mongo:latest
    container_name: poker_mongo
    restart: unless-stopped
    volumes:
      - db-data:/data/db
    expose: 
      - "27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: test
      MONGO_INITDB_ROOT_PASSWORD: 123
    networks:
      - poker_network
  poker_user:
    container_name: poker_user
    build: ./user/
    image: poker/user:latest
    volumes:
      - ./user/:/usr/src/app
      #- /usr/src/app/node_modules
    expose:
      - "8080"
    depends_on:
      - poker_mongo
    networks:
      - poker_network
    environment:
      WAIT_HOSTS: poker_mongo:27017
  mongo-express:
    container_name: mongo-express
    image: mongo-express
    restart: always
    ports:
      - 8085:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: test
      ME_CONFIG_MONGODB_ADMINPASSWORD: 123
      ME_CONFIG_MONGODB_SERVER: poker_mongo
    depends_on:
     - gateway
    networks:
      - poker_network

networks:
  poker_network:
volumes: 
  db-data:

Я также удалил некоторые другие зависимости какЯ думаю, что они являются избыточными.

Второе решение

Это решение основано на изменении конфигурации nginx.Похоже, nginx пытается разрешить имя хоста, указанное в proxy_pass, и так как оно еще не доступно при запуске nginx, оно будет отвечать 504, потому что не пытается разрешить его снова.

Кажется, есть обходной путь с использованием переменных внутри директивы proxy_pass, которые обрабатываются по-разному и вынуждают nginx снова выполнить разрешение DNS.Для этого необходимо настроить преобразователь в nginx и , к счастью, есть один , встроенный в Docker при использовании пользовательских сетей.

Вот пример конфигурации nginx (хотя я не тестировалэто сам):

events { worker_connections 1024; }

http {

    server {
        listen 80;
        location /user {
            # Docker DNS server in user-defined networks
            # https://docs.docker.com/v17.09/engine/userguide/networking/configure-dns/
            resolver 127.0.0.11 ipv6=off;

            rewrite /user/(.*) /$1  break;

            # Using a variable will force nginx to re-resolve DNS name
            # https://serverfault.com/a/593003
            set $backend "http://poker_user:8080/";
            proxy_pass $backend;

            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
        }
        location / {
            return 200 'hello';
        }

    }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...