Puncte:1

connect() a eșuat (111: Conexiune refuzată) în timpul conectării la amonte cu site-ul web static

drapel cn

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.

Puncte:0
drapel in

The port directiva din docker-compose definește ce port este expus la exterior. Containerul dvs. de proxy invers poate accesa serviciile din interiorul static-site direct atunci când sunt conectate împreună, astfel încât să nu utilizați portul expus aici.

Din moment ce site-ul dvs. este în interiorul containerului static-site ascultă pe portul 80, trebuie să-l folosești în loc de porturile expuse.

Mai întâi trebuie să legați containerele împreună, pentru a face asta, adăugați la proxy invers bloc:

link-uri:
  - static-site

Ta proxy_pass directiva ar trebui să fie:

proxy_pass http://sm_static_website;

Dacă nu doriți să expuneți de fapt static-site recipientul spre exterior puteți îndepărta porturi directivă acolo.

Asa ca docker-compose.yml ar trebui sa arate asa:

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
    link-uri:
      - sm_static_website
  site-ul static:
    imagine: sm-static-website
    construi:
      context: ./site-ul web
    container_name: sm_static_website

TBH: Nu mi s-a părut niciodată util să folosesc container_name directivă, nu sunt sigur dacă trebuie să utilizați container_name definit sm_static_website sau doar static-site în link-uri iar în proxy_pass directive. Dacă o lași deoparte, ar fi doar static-site.

drapel cn
Mulțumesc Gerald, schimbarea la portul 80 a funcționat. Prima dată când am de-a face cu Linux și Coker, de aceea această întrebare pentru începători. P.S. Link-uri utilizări , asa de

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.