Scopul meu este să am 2 containere docker:
- containerul nginx (bazat pe nginx:latest) pentru a funcționa ca proxy invers
- container cu site web static (bazat pe nginx:alpine)
Mai târziu voi adăuga 1+ servicii backend de bază .net (nu este important pentru moment). În prezent, când încerc să-mi accesez serverul web folosind adresa IP publică, primesc 502 Bad gateway. Iată configurația mea actuală:
docker-compose.yaml
versiunea: '3'
Servicii:
proxy invers:
imagine: nginx:latest
container_name: reverse_proxy
depinde de:
- static-site
volume:
- ./reverse_proxy/nginx.conf:/etc/nginx/nginx.conf
porturi:
- 80:80
site-ul static:
imagine: sm-static-website
construi:
context: ./site-ul web
container_name: sm_static_website
porturi:
- „8080:80”
nginx.conf pentru reverse-proxy:
worker_proceses auto;
includ /etc/nginx/modules-enabled/*.conf;
evenimente {
conexiuni_muncitor 1024;
}
http {
Server {
asculta 80 default_server;
asculta [::]:80 default_server;
nume_server x.x.x.x; # my_public_ip
Locație / {
proxy_pass http://sm_static_website:8080;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
Dockerfile pentru site-ul web static:
DIN nginx:alpin
WORKDIR /html
COPIE . /var/www/html
EXPUNERE 8080
Din containerul meu site-ul meu pot vedea că nginx rulează/ascultă pe 80:
netstat -tulpn | grep ASCULTĂ
tcp 0 0 127.0.0.11:41389 0.0.0.0:* ASCULTĂ -
tcp 0 0 0.0.0.0:80 0.0.0.0:* ASCULTĂ 1/nginx: master pro
tcp 0 0 :::80 :::* LISTE 1/nginx: master pro
De pe serverul meu pot vedea că atât containerele remote_proxy, cât și site-ul web ascultă 80/8080, respectiv:
netstat -tulpn | grep ASCULTĂ
tcp 0 0 0.0.0.0:80 0.0.0.0:* ASCULTĂ 13936/docker-proxy
tcp 0 0 0.0.0.0:8080 0.0.0.0:* ASCULTĂ 13797/docker-proxy
tcp6 0 0 :::80 :::* ASCULTĂ 13942/docker-proxy
tcp6 0 0 :::8080 :::* ASCULTĂ 13804/docker-proxy
ps -aux pe server returnează:
rădăcină 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
rădăcină 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
Jurnalul containerului site-ului web nu arată nicio eroare, procesele de lucru rulează. Cu toate acestea, jurnalul proxy invers arată:
2022/05/20 01:20:29 [eroare] 31#31: *1 connect() a eșuat (111: Conexiune refuzată) în timpul conectării la amonte, client: x.x.x.x, server: x.x.x.x, cerere: „GET / HTTP/1.1 ", în amonte: "http://172.19.0.2:8080/", gazdă: "x.x.x.x"
Aveți idee ce greșesc? Dacă elimin volumes: line din docker-compose.yml, atunci primesc pagina implicită nginx din containerul reverse-proxy. Aceasta indică faptul că ascultă corect, acceptă cererea, dar nu o redirecționează către containerul site-ului web.