// blog

Cum configurezi Nginx ca reverse proxy pentru containere Docker: ghid complet

August 14, 2026 · by CLIQHOST

Cum configurezi Nginx ca reverse proxy pentru containere Docker: ghid complet

Dacă rulezi mai multe aplicații web în containere Docker pe același server, ai nevoie de o metodă elegantă prin care să le expui publicului fără să deschizi zeci de porturi individuale. Soluția standard în industrie este Nginx ca reverse proxy — un strat care preia cererile HTTP/HTTPS și le direcționează către containerul potrivit.

În acest ghid vei învăța să configurezi Nginx ca reverse proxy pentru containere Docker pe un VPS NVMe sau VPS SSD, pas cu pas, cu exemple concrete de fișiere de configurare și HTTPS.


De ce ai nevoie de un reverse proxy?

Fără un reverse proxy, fiecare container Docker trebuie să asculte pe un port unic (ex. 3001, 3002, 8080). Asta înseamnă:

  • URL-uri urâte de tipul http://domeniu.md:3001
  • Dificultate în gestionarea certificatelor SSL per serviciu
  • Expunere directă a porturilor în firewall

Nginx ca reverse proxy rezolvă toate acestea: primește tot traficul pe porturile 80 și 443, apoi îl redirecționează intern către containerul corect pe baza numelui de domeniu sau a căii URL.


Cerințe preliminare

Înainte de a începe, asigură-te că ai:

  • Un VPS Linux (Ubuntu 22.04 sau Debian 12 recomandat) — dacă nu ai încă unul, poți comanda un VPS NVMe performant de la CLIQHOST
  • Docker și Docker Compose instalate
  • Nginx instalat pe host (nu în container, pentru acest ghid)
  • Acces root sau sudo
  • Un domeniu configurat să pointeze la IP-ul serverului
  • Un certificat SSL activ (sau Let's Encrypt)

Pasul 1: Instalează Nginx pe server

Dacă Nginx nu este instalat, rulează:

sudo apt update
sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx

Verifică că Nginx rulează:

sudo systemctl status nginx

Pasul 2: Lansează containerele Docker

Să presupunem că ai două aplicații:

  • App1 — o aplicație Node.js care ascultă pe portul intern 3000
  • App2 — o aplicație Python/Flask care ascultă pe portul intern 5000

Pornești containerele cu porturile mapate doar local (nu expuse public):

# App1
docker run -d --name app1 -p 127.0.0.1:3000:3000 myapp1:latest

# App2
docker run -d --name app2 -p 127.0.0.1:5000:5000 myapp2:latest

Important: Folosim 127.0.0.1:PORT pentru a lega containerul doar la interfața loopback — portul nu va fi accesibil din exterior, ci doar de pe server (unde rulează și Nginx).

Sau cu Docker Compose (docker-compose.yml):

version: '3.8'
services:
  app1:
    image: myapp1:latest
    ports:
      - "127.0.0.1:3000:3000"
    restart: unless-stopped

  app2:
    image: myapp2:latest
    ports:
      - "127.0.0.1:5000:5000"
    restart: unless-stopped
docker compose up -d

Pasul 3: Configurează Nginx ca reverse proxy

Creează câte un fișier de configurare pentru fiecare domeniu/aplicație în /etc/nginx/sites-available/.

Configurare pentru App1 (app1.domeniu.md)

sudo nano /etc/nginx/sites-available/app1.domeniu.md
server {
    listen 80;
    server_name app1.domeniu.md;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }
}

Configurare pentru App2 (app2.domeniu.md)

sudo nano /etc/nginx/sites-available/app2.domeniu.md
server {
    listen 80;
    server_name app2.domeniu.md;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Activează ambele configurări:

sudo ln -s /etc/nginx/sites-available/app1.domeniu.md /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/app2.domeniu.md /etc/nginx/sites-enabled/

Testează și reîncarcă Nginx:

sudo nginx -t
sudo systemctl reload nginx

Pasul 4: Adaugă HTTPS cu Let's Encrypt

Pentru a securiza traficul, instalează Certbot și obține certificate SSL gratuite:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d app1.domeniu.md -d app2.domeniu.md

Certbot va modifica automat fișierele Nginx pentru a adăuga blocurile SSL și redirecționarea HTTP → HTTPS.

După finalizare, configurarea pentru app1.domeniu.md va arăta similar cu:

server {
    listen 443 ssl;
    server_name app1.domeniu.md;

    ssl_certificate /etc/letsencrypt/live/app1.domeniu.md/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app1.domeniu.md/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen 80;
    server_name app1.domeniu.md;
    return 301 https://$host$request_uri;
}

Dacă preferi certificate comerciale (OV sau EV), verifică opțiunile de certificate SSL de la CLIQHOST pentru proiecte business.


Pasul 5: Gestionarea rețelelor Docker (abordare avansată)

O practică mai curată este să pui Nginx însuși într-un container Docker și să comunici cu celelalte containere printr-o rețea Docker internă, fără a expune niciun port pe host.

version: '3.8'
networks:
  webnet:
    driver: bridge

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./certbot/www:/var/www/certbot
      - ./certbot/conf:/etc/letsencrypt
    networks:
      - webnet
    restart: unless-stopped

  app1:
    image: myapp1:latest
    expose:
      - "3000"
    networks:
      - webnet
    restart: unless-stopped

  app2:
    image: myapp2:latest
    expose:
      - "5000"
    networks:
      - webnet
    restart: unless-stopped

În această configurare, proxy_pass din Nginx va folosi numele serviciului în loc de 127.0.0.1:

location / {
    proxy_pass http://app1:3000;
}

Docker DNS intern rezolvă automat numele app1 la IP-ul containerului — elegant și sigur.


Sfaturi de securitate și performanță

Limitează dimensiunea request-urilor

client_max_body_size 20M;

Adaugă timeout-uri rezonabile

proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;

Activează compresie Gzip

gzip on;
gzip_types text/plain application/json application/javascript text/css;
gzip_min_length 1000;

Rate limiting (protecție DDoS simplu)

limit_req_zone $binary_remote_addr zone=api:10m rate=30r/m;

location /api/ {
    limit_req zone=api burst=10 nodelay;
    proxy_pass http://app1:3000;
}

Pentru securitate avansată la nivel de server, consultă și serviciile de administrare server oferite de CLIQHOST.


Depanare rapidă

Problemă Soluție
502 Bad Gateway Containerul Docker nu rulează sau portul e greșit
404 Not Found server_name nu corespunde domeniului accesat
SSL_ERROR_RX_RECORD_TOO_LONG Nginx ascultă pe 443 dar fără bloc SSL
Nginx nu pornește Rulează sudo nginx -t pentru detalii eroare

Verifică logurile Nginx:

sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log

Verifică starea containerelor:

docker ps
docker logs app1

Concluzie

Nginx ca reverse proxy pentru containere Docker este o combinație puternică și flexibilă: poți rula zeci de aplicații pe același server, toate protejate cu HTTPS, accesibile prin domenii clare și izolate unele de altele.

Pentru rezultate optime, ai nevoie de un server cu resurse suficiente. Explorează planurile VPS NVMe sau serverele dedicate managed de la CLIQHOST — infrastructură locală din Moldova, cu suport tehnic inclus.

Ai întrebări sau vrei o configurare personalizată? Contactează echipa CLIQHOST — suntem gata să te ajutăm.

SHARE
// ce spun clienții

Ce spun clienții noștri

Recenzii reale de la clienți care au ales CLIQHOST pentru performanță, fiabilitate și suport tehnic.

★★★★★

"We moved our online shop from a foreign host and the difference is night and day — pages load instantly and support replies in minutes, in Romanian."

AM
Andrei M.
eCommerce owner · Chișinău
★★★★★

"Migrated 12 client sites to CLIQHOST. Free migration, zero downtime, and the cPanel setup is exactly what my team needed. Highly recommend."

EV
Elena V.
Web agency · Bălți
★★★★★

"Our NVMe VPS handles traffic spikes without a sweat. Full root, local datacenter, and billing in MDL — everything we wanted from a provider."

DC
Dmitri C.
SaaS founder · Chișinău