nginx: [Emerg] хост не найден на вышестоящем сервере abcd при настройке nginx в качестве обратного прокси для микросервисов на основе докеров

У нас есть группа докеризованных микросервисов, которые уже работают на виртуальной машине с частным внутренним IP-адресом. Я сконфигурировал dockerized nginx для установки обратного прокси перед этими микросервисами, но я получаю nginx: [emerg] host not found in upstream «ms1» error.

Ниже находится файл nginx.conf

#user  nobody;
#Defines which Linux system user will own and run the Nginx server

worker_processes  4;
#Referes to single threaded process. Generally set to be equal to the number of CPUs or cores.

#error_log  logs/error.log; #error_log  logs/error.log  notice;
#Specifies the file where server logs.

#pid        logs/nginx.pid;
#nginx will write its master process ID(PID).

events {
    worker_connections  1024;
    # worker_processes and worker_connections allows you to calculate maxclients value:
    # max_clients = worker_processes * worker_connections
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    # If serving locally stored static files, sendfile is essential to speed up the server,
    # But if using as reverse proxy one can deactivate it
    #tcp_nopush     on;
    # works opposite to tcp_nodelay. Instead of optimizing delays, it optimizes the amount of data sent at once.
    #keepalive_timeout  0;
    keepalive_timeout  65;
    # timeout during which a keep-alive client connection will stay open.
    gzip  on;
    # tells the server to use on-the-fly gzip compression.
    server {
        listen       8080;
        server_name your-domain.com www.your-domain.com;
        #root configuration for static files.
        root   /usr/share/nginx/html;
        index  index.html index.htm;

        error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    upstream consumer-portal {
        server consumer-portal:9006;
    }

    upstream download-zip-service {
        server download-zip-service:9012;
    }

    server {
    listen          8080;
    server_name     www.example.com;

        location /consumer-portal/ {
        proxy_pass http://consumer-portal:9006/;
        }

        location /download-zip-service/ {
        proxy_pass http://download-zip-service:9012/;
        }
    }
}

Ниже приведено содержимое моего Dockerfile:

FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]

Ниже представлено содержимое файла docker-compose.yml.

version: '3'
services:
  nginx:
    restart: always
    build: ./conf/
    volumes:
    - ./mysite.template:/etc/nginx/conf.d/mysite.template
    ports:
    - "8080:8080"
    networks:
      - cloud

networks:
  cloud:
   driver: bridge

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

Я получаю ошибку ниже при запуске команд:

docker-compose build
docker-compose up

nginx_1  | 2018/07/02 20:48:52 [emerg] 1#1: host not found in upstream "consumer-portal:9006" in /etc/nginx/nginx.conf:50
nginx_1  | nginx: [emerg] host not found in upstream "consumer-portal:9006" in /etc/nginx/nginx.conf:50

Любое руководство приветствуется!

Новый файл conf согласно предложению к этому сообщению:

#user  nobody;
#Defines which Linux system user will own and run the Nginx server

worker_processes  4;
#Referes to single threaded process. Generally set to be equal to the number of CPUs or cores.

#error_log  logs/error.log; #error_log  logs/error.log  notice;
#Specifies the file where server logs.

#pid        logs/nginx.pid;
#nginx will write its master process ID(PID).

events {
    worker_connections  1024;
    # worker_processes and worker_connections allows you to calculate maxclients value:
    # max_clients = worker_processes * worker_connections
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    # If serving locally stored static files, sendfile is essential to speed up the server,
    # But if using as reverse proxy one can deactivate it
    #tcp_nopush     on;
    # works opposite to tcp_nodelay. Instead of optimizing delays, it optimizes the amount of data sent at once.
    #keepalive_timeout  0;
    keepalive_timeout  65;
    # timeout during which a keep-alive client connection will stay open.
    gzip  on;
    # tells the server to use on-the-fly gzip compression.
    server {
        listen       8080;
        server_name your-domain.com www.your-domain.com;
        #root configuration for static files.
        root   /usr/share/nginx/html;
        index  index.html index.htm;

        error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    # upstream consumer-portal {
    #     server consumer-portal;
    # }

    # upstream download-zip-service {
    #     server download-zip-service;
    # }

    server {
    listen          8080;
    server_name     www.example.com;

        location /consumer-portal/ {
        proxy_redirect http://consumer-portal:9006;
        }

        location /download-zip-service/ {
        proxy_redirect http://download-zip-service:9012;
        }
    }
}

person Santosh    schedule 02.07.2018    source источник
comment
Попробуйте удалить определение двух директив upstream и измените proxy_pass на proxy_pass http://consumer-portal:9006;. В качестве альтернативы, если вы хотите сохранить присвоение имени вышестоящему серверу с помощью директивы upstream, тогда ваша настройка proxy_pass должна использовать имя proxy_pass http://consumer-portal;   -  person hcheung    schedule 03.07.2018
comment
Я отредактировал вопрос, чтобы добавить новый файл conf в соответствии с вашим предложением @hcheung. Это не помогло   -  person Santosh    schedule 03.07.2018
comment
Есть ли причина, по которой вы меняете proxy_pass на proxy_redirect? Кроме того, когда вы используете http://consumer-portal:9006, я предполагал, что у вас определен хост, сопоставленный с конкретным IP-адресом в /etc/hosts? Потому что в вашей конфигурации нигде не указано, что означает этот IP http://consumer-portal.   -  person hcheung    schedule 04.07.2018
comment
Какой каталог root для вашего www.example.com сервера? У вас есть две директивы сервера, определенные для разных доменов, но только в одной указан каталог root.   -  person hcheung    schedule 04.07.2018
comment
Я пытаюсь настроить nginx для прокси-серверов микросервисов, www.example.com - это образец server_name, присвоенный серверу nginx   -  person Santosh    schedule 04.07.2018


Ответы (1)


Если вы хотите указать вышестоящие серверы с использованием имен хостов, вам необходимо указать преобразователь.

person miknik    schedule 03.07.2018
comment
Я тоже ищу такое же решение. Но сталкиваюсь с nginx: [emerg] invalid parameter "http://0.0.0.0:9123/" in /etc/nginx/nginx.conf:62 вместо http://consumer-portal:9006/. В соответствии с вопросом Сантош, я использую http://0.0.0.0:9123/. Другие конфигурации такие же - person Anand Deshmukh; 03.07.2018