Обратный прокси с NGINX и Docker - PullRequest
0 голосов
/ 24 января 2019

У меня есть приложение, работающее на http://localhost:8000 с использованием созданного мной образа докера.

Теперь я хочу использовать NGINX в качестве прослушивания обратного прокси на порту 80, чтобы перенаправить на локальный хост: 8000.

Вот мой файл nginx.conf

#user  nobody;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    server {
        listen 80;
        location / {
            proxy_pass http://localhost:8000;
        }
    }
}

Вот мой Dockerfile:

FROM nginx

RUN rm /etc/nginx/conf.d/default.conf

COPY index.html /usr/share/nginx/html
COPY nginx.conf /etc/nginx

CMD nginx

Для построения образа я использую команду

docker build --no-cache -t mynginx .

Для запуска я использую

docker run -p 80:80 -d mynginx 

Теперь, если я тестирую с локального компьютера с curl localhost:8000, все работает, но если я пытаюсь с curl localhost, я получаю ошибку Bad Gateway.

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

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Причина, по которой вы получаете плохой шлюз, заключается в том, что внутри вашего контейнера nginx localhost разрешается в самом контейнере, а не в хост-системе.

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

docker network create my-network
docker network connect --alias application my-network <application container id/name>
docker network connect --alias reverse-proxy my-network <reverse proxy container id/name>

--network может быть произвольным именем, а --alias должно быть именем хоста, которое вы хотите разрешить в ваших контейнерах.Фактически вам не нужно указывать псевдоним, если вы уже присвоили (хосту) имя (docker run --name ...) своим контейнерам.

Затем вы можете изменить директиву proxy_pass на (псевдоним) имениКонтейнер вашего приложения:

proxy_pass http://application:8000;

Также см. документацию: Контейнерные сети

0 голосов
/ 24 января 2019

curl localhost:8000 работает => ваше приложение работает

curl localhost возвращает неверный шлюз, значит proxy_pass http://localhost:8000; не работает.Это связано с тем, что «localhost» относится к своему вызывающему, в данном случае к контейнеру nginx, на котором ничего не работает на порту 8000.

Вам необходимо указать его приложению, используя proxy_pass http://your_app:8000; где "your_app"это имя службы (docker-compose) или имя контейнера или его сетевой псевдоним.Убедитесь, что они находятся в одной сети.

...