15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți
09.10.2024

Cum să Configurați Nginx să Asculte pe Mai Multe Porturi

Nginx poate asculta pe mai multe porturi simultan prin adăugarea mai multor directive `listen` în interiorul unuia sau mai multor blocuri `server` din configurația sa. Fiecare directivă `listen` leagă Nginx de o combinație specifică IP/port, permițând unei singure instanțe de server să gestioneze traficul HTTP, HTTPS și al aplicațiilor personalizate pe porturi distincte fără a rula procese separate.

Această capacitate este esențială pentru mediile multi-tenant, separarea porturilor staging/producție, arhitecturile reverse proxy și rutarea microserviciilor — toate dintr-o singură instanță de VPS Hosting.

Cerințe preliminare

Înainte de a continua, confirmați următoarele:

  • Nginx este instalat și serviciul este activ (`systemctl status nginx`)
  • Aveți privilegii `root` sau `sudo` pe server
  • Înțelegeți diferența dintre `/etc/nginx/nginx.conf` (configurație globală) și `/etc/nginx/sites-available/` (blocuri de configurare per site)
  • Regulile de firewall (`ufw`, `iptables` sau un grup de securitate cloud) permit traficul pe porturile pe care intenționați să le deschideți
  • Certificatele SSL valide sunt disponibile dacă configurați porturi HTTPS (autosemnate sau emise de o CA)

Arhitectura de configurare Nginx: Ce trebuie să știți mai întâi

Nginx utilizează un model de configurare ierarhic: contextul `http` conține unul sau mai multe blocuri `server`, fiecare dintre acestea putând conține una sau mai multe directive `listen`. Înțelegerea acestei ierarhii previne cele mai frecvente greșeli de configurare.

Directive cheie implicate:

  • `listen [address:]port [ssl] [http2] [default_server]` — leagă blocul server de un port specific și un IP opțional
  • `server_name` — potrivește antetul `Host` pentru a direcționa cererile către blocul corect
  • `default_server` — desemnează care bloc server gestionează cererile care nu se potrivesc cu niciun alt `server_name`

Locațiile fișierelor de configurare în funcție de distribuție:

DistribuțieConfig principalConfigurații site
Ubuntu / Debian`/etc/nginx/nginx.conf``/etc/nginx/sites-available/`
CentOS / RHEL / AlmaLinux`/etc/nginx/nginx.conf``/etc/nginx/conf.d/`
Arch Linux`/etc/nginx/nginx.conf``/etc/nginx/sites-available/`
Docker (imagine oficială)`/etc/nginx/nginx.conf``/etc/nginx/conf.d/`

Pe sistemele bazate pe Debian, fișierele din `sites-available/` trebuie să fie legate simbolic în `sites-enabled/` pentru a intra în vigoare:

“`bash

sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/

“`

Pasul 1: Deschideți fișierul de configurare Nginx

Pentru o modificare globală care afectează toți gazdele virtuale:

“`bash

sudo nano /etc/nginx/nginx.conf

“`

Pentru o configurare specifică unui site (recomandată pentru producție):

“`bash

sudo nano /etc/nginx/sites-available/example.conf

“`

Utilizarea fișierelor specifice site-ului este puternic preferată. Aceasta izolează modificările, simplifică revenirea la versiunea anterioară și previne ca o singură configurare greșită să oprească toate serviciile găzduite.

Pasul 2: Configurați mai multe directive listen într-un singur bloc server

Cea mai simplă configurare multi-port leagă un bloc server de mai multe porturi. Nginx va aplica o logică de rutare identică indiferent de portul prin care s-a conectat clientul.

“`nginx

server {

listen 80;

listen 8080;

server_name example.com;

root /var/www/html;

index index.html index.htm;

location / {

try_files $uri $uri/ =404;

}

access_log /var/log/nginx/example_access.log;

error_log /var/log/nginx/example_error.log warn;

}

“`

Ce face aceasta:

  • `listen 80;` — acceptă trafic HTTP standard
  • `listen 8080;` — acceptă trafic pe portul HTTP alternativ (comun pentru mediile de dezvoltare, API-urile interne sau verificările de sănătate ale echilibratorului de sarcină)
  • Ambele porturi servesc conținut identic din `/var/www/html`

Caz limită — legarea la o adresă IP specifică: Pe un server cu mai multe interfețe de rețea (de exemplu, un IP public și un IP LAN privat), puteți restricționa interfața pe care ascultă Nginx:

“`nginx

listen 192.168.1.10:8080;

listen 0.0.0.0:80;

“`

Acest lucru este critic în configurațiile de server multi-homed pentru a preveni expunerea publică neintenționate a serviciilor interne.

Pasul 3: Configurați HTTPS pe mai multe porturi

HTTPS necesită parametrul `ssl` pe directiva `listen` și căi valide pentru certificat/cheie. Următorul exemplu leagă HTTPS atât la portul standard 443, cât și la un port personalizat 8443:

“`nginx

server {

listen 443 ssl;

listen 8443 ssl;

server_name example.com;

ssl_certificate /etc/nginx/ssl/example.com.crt;

ssl_certificate_key /etc/nginx/ssl/example.com.key;

Modern TLS hardening

ssl_protocols TLSv1.2 TLSv1.3;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:10m;

ssl_session_timeout 10m;

root /var/www/html;

index index.html;

location / {

try_files $uri $uri/ =404;

}

}

“`

De ce este utilizat frecvent portul 8443:

  • Permite traficul HTTPS în medii unde portul 443 este blocat de firewall-urile din amonte
  • Utilizat în dezvoltare/staging pentru a rula un server securizat fără a intra în conflict cu un serviciu de producție pe 443
  • Necesar de unele framework-uri de aplicații (Tomcat, proxy-uri Node.js) care expun HTTPS pe porturi non-standard

Capcană critică: Omiterea `ssl_protocols` și `ssl_ciphers` lasă Nginx să utilizeze valori implicite potențial slabe. Definiți întotdeauna explicit parametrii TLS, în special pe serverele care gestionează date sensibile. Dacă aveți nevoie de un certificat de încredere în loc de unul autosemnat, Certificatele SSL de la o CA recunoscută elimină avertismentele browserului și satisfac cerințele moderne HSTS.

Pasul 4: Serviți conținut diferit pe porturi diferite

Când porturile trebuie să servească aplicații distincte — de exemplu, un site web public pe portul 80 și un panou de administrare intern pe portul 8080 — utilizați blocuri `server` separate:

“`nginx

server {

listen 80;

server_name example.com;

root /var/www/public;

index index.html;

location / {

try_files $uri $uri/ =404;

}

}

server {

listen 8080;

server_name example.com;

root /var/www/admin;

index index.html;

Restrict admin panel to internal network only

location / {

allow 10.0.0.0/8;

allow 192.168.0.0/16;

deny all;

try_files $uri $uri/ =404;

}

}

“`

Cazuri de utilizare reale pentru separarea conținutului pe bază de port:

  • Portul 80/443: Site web public
  • Portul 8080: API REST intern sau endpoint de microserviciu
  • Portul 8443: Panou de administrare securizat restricționat prin lista de IP-uri permise
  • Portul 9000: Endpoint de metrici pentru colectarea Prometheus (niciodată expus public)
  • Portul 3000/5000: Reverse proxy către o aplicație Node.js sau Python

Pasul 5: Utilizarea Nginx ca reverse proxy pe mai multe porturi

Un tipar comun de producție este utilizarea Nginx pentru a face proxy pe porturi diferite către servere de aplicații backend diferite:

“`nginx

server {

listen 80;

server_name app.example.com;

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_cache_bypass $http_upgrade;

}

}

server {

listen 8080;

server_name app.example.com;

location / {

proxy_pass http://127.0.0.1:4000;

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;

}

}

“`

Acest tipar reprezintă baza implementărilor containerizate pe un Server Dedicat unde mai multe containere Docker rulează pe porturi interne diferite și Nginx acționează ca unic punct de intrare extern.

Pasul 6: Validați configurația

Nu reporniți niciodată Nginx fără a testa mai întâi sintaxa configurației. O eroare de sintaxă va face ca serviciul să nu se poată reîncărca, oprind toate site-urile găzduite.

“`bash

sudo nginx -t

“`

Rezultat așteptat în caz de succes:

“`

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

“`

Dacă apar erori, rezultatul va specifica fișierul și numărul liniei. Remediați toate problemele raportate înainte de a continua.

Pentru o reîncărcare fără întreruperi (preferată față de o repornire completă în producție):

“`bash

sudo systemctl reload nginx

“`

O repornire completă este necesară doar atunci când modificați `worker_processes`, `user` sau alte directive la nivelul procesului master:

“`bash

sudo systemctl restart nginx

“`

Pasul 7: Verificați că Nginx ascultă pe porturile corecte

După aplicarea configurației, confirmați că Nginx s-a legat la porturile așteptate folosind `ss` (preferat față de `netstat` care este depreciat):

“`bash

sudo ss -tlnp | grep nginx

“`

Exemplu de rezultat:

“`

LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))

LISTEN 0 511 0.0.0.0:8080 0.0.0.0:* users:(("nginx",pid=1234,fd=7))

LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1234,fd=8))

LISTEN 0 511 0.0.0.0:8443 0.0.0.0:* users:(("nginx",pid=1234,fd=9))

“`

Dacă un port nu apare, verificați:

  1. Sintaxa directivei `listen` din fișierul de configurare
  2. Dacă un alt proces ocupă deja acel port: `sudo ss -tlnp | grep :8080`
  3. Dacă `nginx -t` a trecut fără erori
  4. Politicile SELinux sau AppArmor care pot bloca legarea la porturi non-standard

Testarea cu curl din linia de comandă (mai fiabilă decât un browser pentru depanare):

“`bash

curl -I http://example.com

curl -I http://example.com:8080

curl -Ik https://example.com

curl -Ik https://example.com:8443

“`

Indicatorul `-I` preia doar antetele. Un răspuns `200 OK` sau `301 Moved Permanently` confirmă că portul este activ și Nginx răspunde corect.

Pasul 8: Deschideți porturile de firewall

Ascultarea pe un port în Nginx este insuficientă dacă firewall-ul gazdei blochează conexiunile de intrare. Asigurați-vă că porturile sunt permise:

UFW (Ubuntu/Debian):

“`bash

sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

sudo ufw allow 8080/tcp

sudo ufw allow 8443/tcp

sudo ufw reload

“`

firewalld (CentOS/RHEL/AlmaLinux):

“`bash

sudo firewall-cmd –permanent –add-port=8080/tcp

sudo firewall-cmd –permanent –add-port=8443/tcp

sudo firewall-cmd –reload

“`

iptables (direct):

“`bash

sudo iptables -A INPUT -p tcp –dport 8080 -j ACCEPT

sudo iptables -A INPUT -p tcp –dport 8443 -j ACCEPT

“`

Pe infrastructura cloud (AWS EC2, DigitalOcean, Hetzner), trebuie să actualizați și regulile grupului de securitate sau ale firewall-ului cloud la nivelul furnizorului — modificările firewall-ului la nivel de gazdă singure nu sunt suficiente.

Comparație: Configurații Nginx cu un singur port vs. mai multe porturi

FuncționalitateUn singur portMai multe porturi (același bloc)Mai multe porturi (blocuri separate)
Complexitatea configurațieiScăzutăScăzutăMedie
Izolarea conținutuluiNiciunaNiciunaCompletă
Control acces per portNu se aplicăNu este posibilComplet suportat
Caz de utilizareSite-uri web simpleOglinzi dev/stagingMicroservicii, panouri de administrare
Reverse proxy per portUn singur upstreamUn singur upstreamUpstream-uri independente
Terminare SSLPer blocCertificat partajatCertificate independente per bloc
Separarea jurnalelorUn singur jurnalUn singur jurnalFișiere jurnal per port

Capcane frecvente și cum să le evitați

Conflict de port cu servicii existente: Portul 80 poate fi deja utilizat de Apache. Rulați `sudo ss -tlnp | grep :80` înainte de configurare. Opriți serviciile conflictuale sau reconfigurați-le să utilizeze porturi diferite.

Conflicte `default_server`: Dacă mai multe blocuri server omit `default_server` sau mai multe blocuri îl revendică pentru același port, Nginx va utiliza primul bloc în ordinea fișierelor. Fiți explicit:

“`nginx

listen 80 default_server;

“`

IPv6 neacoperit: Adăugarea `listen 80;` leagă doar la IPv4. Pentru serverele dual-stack, adăugați:

“`nginx

listen [::]:80;

listen [::]:8080;

“`

SELinux blochează porturile non-standard: Pe RHEL/CentOS cu SELinux în modul enforcing, Nginx nu poate lega la porturi care nu se află în politica sa fără permisiune explicită:

“`bash

sudo semanage port -a -t http_port_t -p tcp 8080

sudo semanage port -a -t http_port_t -p tcp 8443

“`

Uitarea reîncărcării după modificări: Editările configurației nu au efect până când Nginx nu se reîncarcă. Automatizați acest lucru în pipeline-urile CI/CD cu un pas `nginx -t && systemctl reload nginx` post-implementare.

Matrice de decizie practică

Utilizați această listă de verificare pentru a determina tiparul de configurare multi-port potrivit pentru scenariul dvs.:

  • Același conținut, mai multe porturi — Utilizați mai multe directive `listen` într-un singur bloc `server`
  • Conținut diferit per port — Utilizați blocuri `server` separate cu directoare `root` distincte
  • Aplicații backend diferite per port — Utilizați blocuri `server` separate cu `proxy_pass` care indică adrese upstream diferite
  • Securizarea unui port non-standard — Adăugați `ssl` la directiva `listen` și referențiați căile certificatelor dvs.; asigurați-vă că SAN-ul certificatului acoperă domeniul
  • Restricționarea unui port la traficul intern — Adăugați directive `allow`/`deny` sau legați `listen` doar la un IP privat
  • Rularea pe un VPS cu cPanel — Verificați că configurația Apache/Nginx integrată a cPanel nu intră în conflict; utilizați „Include Editor” al cPanel sau un director dedicat de configurare Nginx drop-in
  • Gestionarea mai multor opțiuni de panou de control — Consultați Panourile de control VPS disponibile pentru a găsi unul care expune gestionarea porturilor Nginx printr-o interfață grafică

Întrebări frecvente

Poate Nginx asculta pe același port în mai multe blocuri server?

Da. Mai multe blocuri `server` pot partaja același port. Nginx le diferențiază folosind directiva `server_name`, care potrivește antetul HTTP `Host`. Dacă niciun `server_name` nu se potrivește, blocul `default_server` gestionează cererea.

Adăugarea mai multor porturi listen afectează performanța Nginx?

Suprasarcina este neglijabilă. Fiecare directivă `listen` adaugă un descriptor de fișier procesului master Nginx. Limita practică este plafonul descriptorilor de fișiere deschise al sistemului (`ulimit -n`), nu numărul de porturi. Pentru implementările cu trafic ridicat, ajustați `worker_rlimit_nofile` și `worker_connections` în `nginx.conf`.

Cum redirecționez tot traficul de pe portul 8080 către portul 80?

Utilizați un bloc server dedicat cu o directivă `return`:

“`nginx

server {

listen 8080;

server_name example.com;

return 301 http://example.com$request_uri;

}

“`

De ce Nginx nu ascultă pe un port chiar dacă configurația pare corectă?

Cele mai frecvente patru cauze sunt: (1) configurația nu a fost reîncărcată după editare, (2) un alt proces este deja legat la acel port, (3) o regulă de firewall blochează portul sau (4) SELinux/AppArmor împiedică legarea. Parcurgeți sistematic fiecare cauză folosind `ss -tlnp`, `nginx -t` și comenzile de stare ale firewall-ului.

Pot utiliza certificate SSL diferite pentru porturi HTTPS diferite pe același domeniu?

Da. Fiecare bloc `server` are propriile directive `ssl_certificate` și `ssl_certificate_key`. Două blocuri server pot asculta pe porturile 443 și respectiv 8443 și pot face referire la fișiere de certificate complet diferite, chiar și pentru același `server_name`. Acest lucru este util la rotirea certificatelor sau la rularea unui certificat vechi alături de unul nou în timpul unei perioade de tranziție.

15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți