upstream în Nginx

Definește un grup de servere backend între care Nginx distribuie traficul (load balancing) și gestionează conexiunile keepalive.

Sintaxă
upstream nume { server adresă [parametri]; ... }

Ce face upstream

Blocul upstream definește un grup numit de servere backend în contextul http. Numele grupului poate fi folosit apoi în proxy_pass http://nume; sau fastcgi_pass nume;, iar Nginx distribuie automat cererile între serverele din grup.

Algoritmul implicit este round-robin (pe rând, proporțional cu ponderea weight). Alte strategii disponibile în ediția open-source sunt least_conn (trimite cererea la serverul cu cele mai puține conexiuni active — ideal când cererile au durate diferite), ip_hash (același IP de client ajunge la același server) și hash pe o cheie aleasă de tine.

Dacă un server din grup nu răspunde de max_fails ori în intervalul fail_timeout, Nginx îl marchează temporar ca indisponibil și trimite traficul doar către celelalte. Chiar și cu un singur server backend, un bloc upstream cu directiva keepalive merită folosit: păstrează conexiuni TCP deschise către backend și reduce latența.

Opțiuni și argumente

Opțiune / Parametru Descriere
Context: http Blocul upstream se scrie în http, în afara blocurilor server.
server adresă IP:port, nume:port sau unix:/cale/socket.
weight=N Ponderea serverului în distribuție (implicit 1; un server cu weight=3 primește de 3 ori mai multe cereri).
max_fails=N / fail_timeout=T După N încercări eșuate în T secunde (implicit 1 în 10s), serverul este ocolit timp de T secunde.
backup Serverul este folosit doar când toate serverele principale sunt indisponibile.
down Marchează permanent serverul ca oprit (util când îl scoți temporar pentru mentenanță).
least_conn / ip_hash Schimbă algoritmul de distribuție din round-robin în „cele mai puține conexiuni” sau „hash după IP-ul clientului”.
keepalive N Păstrează în cache până la N conexiuni inactive către backend pentru fiecare worker.

Exemple

Exemplul 1: Load balancing între trei instanțe ale aplicației

Distribuție după numărul de conexiuni active, cu un server de rezervă:

upstream app_cluster {
    least_conn;

    server 10.0.1.11:3000 weight=2 max_fails=3 fail_timeout=15s;
    server 10.0.1.12:3000 weight=2 max_fails=3 fail_timeout=15s;
    server 10.0.1.13:3000 backup;

    keepalive 32;
}

server {
    listen 80;
    server_name example.com;

    location / {
        include proxy_params;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_pass http://app_cluster;
    }
}

Exemplul 2: Upstream pentru PHP-FPM

Numele grupului este folosit în fastcgi_pass:

upstream php_workers {
    server unix:/run/php/php8.3-fpm.sock;
}

# În blocul server:
location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass php_workers;
}

Greșeli frecvente

  • Declararea keepalive 32; în upstream fără proxy_http_version 1.1; și proxy_set_header Connection ""; în location: în mod implicit, Nginx vorbește cu backend-ul pe HTTP/1.0 și trimite Connection: close, deci conexiunile nu sunt refolosite.
  • Scrierea upstream în interiorul unui bloc server: este permis doar în contextul http.

Comenzi înrudite

  • proxy_pass: Trimite cererea către un server backend (Node.js, Python, Go, Docker) și returnează răspunsul clientului.
  • proxy_set_header: Setează sau modifică antetele HTTP trimise către backend (Host, X-Real-IP, X-Forwarded-For, X-Forwarded-Proto).
  • Proxy pentru WebSocket: Configurează antetele Upgrade și Connection pe HTTP/1.1 pentru ca conexiunile WebSocket să treacă prin Nginx.
  • fastcgi_pass: Trimite scripturile .php către PHP-FPM prin protocolul FastCGI (socket Unix sau port TCP).
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: upstream

Ai o nelămurire despre utilizarea comenzii upstream sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.