Моя цель — иметь 2 контейнера докеров:
- Контейнер nginx (на основе nginx:latest) для работы в качестве обратного прокси
- контейнер со статическим сайтом (на основе nginx:alpine)
Позже я добавлю 1+ бэкэнд-сервисы .net core (пока не важно). В настоящее время, когда я пытаюсь получить доступ к своему веб-серверу, используя общедоступный IP-адрес, я получаю 502 Bad gateway. Вот моя текущая конфигурация:
docker-compose.yaml
version: '3'
services:
reverse-proxy:
image: nginx:latest
container_name: reverse_proxy
depends_on:
- static-website
volumes:
- ./reverse_proxy/nginx.conf:/etc/nginx/nginx.conf
ports:
- 80:80
static-website:
image: sm-static-website
build:
context: ./website
container_name: sm_static_website
ports:
- "8080:80"
nginx.conf для обратного прокси:
worker_processes auto;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
}
http {
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name x.x.x.x; # my_public_ip
location / {
proxy_pass http://sm_static_website:8080;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
Dockerfile для статического сайта:
FROM nginx:alpine
WORKDIR /html
COPY . /var/www/html
EXPOSE 8080
Из контейнера моего веб-сайта я вижу, что nginx работает/прослушивает 80:
netstat -tulpn | grep LISTEN
tcp 0 0 127.0.0.11:41389 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1/nginx: master pro
tcp 0 0 :::80 :::* LISTE 1/nginx: master pro
С моего сервера я вижу, что и контейнеры remote_proxy, и контейнеры веб-сайтов прослушивают 80/8080 соответственно:
netstat -tulpn | grep LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13936/docker-proxy
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 13797/docker-proxy
tcp6 0 0 :::80 :::* LISTEN 13942/docker-proxy
tcp6 0 0 :::8080 :::* LISTEN 13804/docker-proxy
ps -aux на сервере возвращает:
root 13936 0.0 0.0 1075140 3580 ? Sl 00:24 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.18.0.3 -container-port 80
root 13797 0.0 0.0 1148872 3624 ? Sl 00:24 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.18.0.2 -container-port 80
В журнале контейнера веб-сайта ошибок нет, рабочие процессы запущены. Однако журнал обратного прокси показывает:
2022/05/20 01:20:29 [error] 31#31: *1 connect() failed (111: Connection refused) while connecting to upstream, client: x.x.x.x, server: x.x.x.x, request: "GET / HTTP/1.1", upstream: "http://172.19.0.2:8080/", host: "x.x.x.x"
Любые идеи, что я делаю неправильно? Если я удалю строку Volumes: из docker-compose.yml, то получу страницу nginx по умолчанию из контейнера обратного прокси. Это указывает на то, что он правильно слушает, принимает запрос, но не перенаправляет его в контейнер веб-сайта.
nginx docker обратный прокси docker-compose
1 ответ
port директива в docker-compose определяет, какой порт открыт снаружи. Ваш обратный прокси-контейнер может получить доступ к службам внутри static-website напрямую, когда они связаны друг с другом, поэтому здесь вы не используете открытый порт.
Поскольку ваш сайт внутри контейнера static-website прослушивает порт 80, вам нужно использовать его вместо открытых портов.
Сначала вам нужно связать контейнеры вместе, для этого вы добавляете в reverse-proxy блокировать:
links:
- static-website
Ваш proxy_pass директива должна быть:
proxy_pass http://sm_static_website;
Если вы не хотите на самом деле подвергать static-website контейнер наружу, вы можете удалить ports директива там.
Итак docker-compose.yml должно выглядеть так:
version: '3'
services:
reverse-proxy:
image: nginx:latest
container_name: reverse_proxy
depends_on:
- static-website
volumes:
- ./reverse_proxy/nginx.conf:/etc/nginx/nginx.conf
ports:
- 80:80
links:
- sm_static_website
static-website:
image: sm-static-website
build:
context: ./website
container_name: sm_static_website
ТБХ: Я никогда не находил полезным использовать container_name директива, я не уверен, нужно ли вам использовать определенное имя container_name sm_static_website или просто static-website в links и в proxy_pass директивы. Если вы оставите это, это будет просто static-website.
Джеральд Шнайдер
