Обратный прокси-сервер Nginx внутри докера не поддерживает настройки порта для апстрима - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь использовать официальный образ докера nginx (https://hub.docker.com/_/nginx) для передачи статического контента и обратного прокси-сервера на веб-сервер api в другом контейнере докера. Оба они вызываются вызовом docker-composeпоэтому они должны быть частью одной сети.

Когда я просматриваю логи, я вижу такие ошибки, когда nginx не может общаться с вышестоящим сервером. Меня беспокоит то, что я вижу http://localhost/users?sort=lastName%2Cdesc и это выглядиткак будто он не соблюдает настройки порта для апстрима, который, конечно, потерпит неудачу. Я понятия не имею, какой должна быть конфигурация, чтобы она соответствовала этому. Во всех прочитанных мной руководствах есть некоторая комбинация объявления uri иобъявление в исходящем URL с косой чертой или без, и ни один из них не дает мне то, что мне нужно.

[ошибка] 7 # 7: * 3 нет активных восходящих потоков при соединении с восходящим потоком, клиент: 10.0.2.2, сервер:localhost, запрос: "GET / api / users? sort = lastName% 2Cdesc HTTP / 1.1", восходящий поток: "http://localhost/users?sort=lastName%2Cdesc", хост:" localhost ", реферер:" http://localhost/"

Dockчто-то

API на 8081
клиент на 8080
клиент должен переслать что-нибудь с / api / * в докер 8081 http://localhost:8081/ и удалить часть / api / часть

Dockerfile

Копирует весь статический html в / usr / share / nginx / html и конфигурацию в /etc/nginx/nginx.conf

FROM nginx
COPY . /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
RUN rm -f /usr/share/nginx/html/Dockerfile
RUN rm -f /usr/share/nginx/html/nginx.conf

nginx.conf

user nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;    
    sendfile        on;    
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

        location /api/ {
            proxy_pass http://localhost:8081/;
        }
    }
}

Логи из nginx

2019/10/11 00:21:38 [error] 7#7: *3 connect() failed (111: Connection refused) while connecting to upstream, client: 10.0.2.2, server: localhost, request: "GET /api/skills HTTP/1.1", upstream: "http://127.0.0.1:8081/skills", host: "localhost", referrer: "http://localhost/"
2019/10/11 00:21:38 [warn] 7#7: *3 upstream server temporarily disabled while connecting to upstream, client: 10.0.2.2, server: localhost, request: "GET /api/skills HTTP/1.1", upstream: "http://127.0.0.1:8081/skills", host: "localhost", referrer: "http://localhost/"
2019/10/11 00:21:38 [error] 7#7: *4 no live upstreams while connecting to upstream, client: 10.0.2.2, server: localhost, request: "GET /api/jobs?sort=createdDate%2Cdesc HTTP/1.1", upstream: "http://localhost/jobs?sort=createdDate%2Cdesc", host: "localhost", referrer: "http://localhost/"
10.0.2.2 - - [11/Oct/2019:00:21:38 +0000] "GET /api/jobs?sort=createdDate%2Cdesc HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
2019/10/11 00:21:38 [error] 7#7: *2 no live upstreams while connecting to upstream, client: 10.0.2.2, server: localhost, request: "GET /api/jobs/autosuggest HTTP/1.1", upstream: "http://localhost/jobs/autosuggest", host: "localhost", referrer: "http://localhost/"
10.0.2.2 - - [11/Oct/2019:00:21:38 +0000] "GET /api/jobs/autosuggest HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
10.0.2.2 - - [11/Oct/2019:00:21:39 +0000] "GET /api/users?sort=lastName%2Cdesc HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
2019/10/11 00:21:39 [error] 7#7: *3 no live upstreams while connecting to upstream, client: 10.0.2.2, server: localhost, request: "GET /api/users?sort=lastName%2Cdesc HTTP/1.1", upstream: "http://localhost/users?sort=lastName%2Cdesc", host: "localhost", referrer: "http://localhost/"
2019/10/11 00:21:39 [error] 7#7: *4 no live upstreams while connecting to upstream, client: 10.0.2.2, server: localhost, request: "GET /api/users/autosuggest HTTP/1.1", upstream: "http://localhost/users/autosuggest", host: "localhost", referrer: "http://localhost/"
10.0.2.2 - - [11/Oct/2019:00:21:39 +0000] "GET /api/users/autosuggest HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
2019/10/11 00:21:39 [error] 7#7: *2 no live upstreams while connecting to upstream, client: 10.0.2.2, server: localhost, request: "GET /api/assessments HTTP/1.1", upstream: "http://localhost/assessments", host: "localhost", referrer: "http://localhost/"
10.0.2.2 - - [11/Oct/2019:00:21:39 +0000] "GET /api/assessments HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
10.0.2.2 - - [11/Oct/2019:00:21:39 +0000] "GET /2.bundle.js HTTP/1.1" 200 11611 "http://localhost/jobs" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
10.0.2.2 - - [11/Oct/2019:00:21:40 +0000] "GET /21.bundle.js HTTP/1.1" 200 13624 "http://localhost/jobs" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
2019/10/11 00:21:40 [error] 7#7: *4 no live upstreams while connecting to upstream, client: 10.0.2.2, server: localhost, request: "GET /api/jobs?sort=createdDate%2Cdesc HTTP/1.1", upstream: "http://localhost/jobs?sort=createdDate%2Cdesc", host: "localhost", referrer: "http://localhost/jobs"
10.0.2.2 - - [11/Oct/2019:00:21:40 +0000] "GET /api/jobs?sort=createdDate%2Cdesc HTTP/1.1" 502 559 "http://localhost/jobs" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"

1 Ответ

1 голос
/ 11 октября 2019

Нельзя ссылаться на другой адрес контейнера, используя localhost. Вы можете представить контейнеры как отдельные машины и, очевидно, что использование localhost не позволит вам подключиться к компьютеру соседа или друга. Когда две машины находятся в одной сети, вы можете установить связь между ними, используя соответствующие им сетевые ips или имена хостов.

В Docker все работает одинаково. Если вы хотите подключиться к другому контейнеру в той же сети, вам нужно использовать его ip (вы можете получить его, например, docker network inspect <NETWORK_NAME>) или имя хоста, которое в этом случае будет таким же, как имя контейнера.

Таким образом, ваш nginx.conf вместо:

location /api/ {
    proxy_pass http://localhost:8081/;
}

должен содержать:

location /api/ {
    proxy_pass http://API_CONTAINER_NAME:8081/;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...