Proxy și Load Balancing pentru Trafic TCP/UDP Brut cu Modulul Stream în Nginx

Reverse proxy și load balancing Nginx Stream Module

Ghid complet pentru modulul ngx_stream_core_module: utilizarea Nginx ca proxy și load balancer de nivel 4 (Layer 4) pentru protocoale non-HTTP, baze de date (MySQL, PostgreSQL, Redis), DNS UDP și conexiuni SSH securizate.

Sintaxă
stream { server { listen 3306; proxy_pass mysql_cluster; } }

Deși majoritatea utilizatorilor asociază Nginx exclusiv cu traficul HTTP/HTTPS (Layer 7), Nginx include un modul extrem de puternic numit Stream (ngx_stream_core_module) care operează la nivelul 4 al modelului OSI (Layer 4 – nivel de transport). Cu modulul Stream, Nginx poate acționa ca load balancer și proxy transparent de mare viteză pentru conexiuni TCP și UDP arbitrare: baze de date (MySQL, PostgreSQL), clustere Redis, servere de e-mail (IMAP/SMTP) sau servere DNS.

Configurarea unui Load Balancer TCP pentru MySQL în /etc/nginx/nginx.conf
# Atenție: Blocul 'stream' se definește la nivel rădăcină (NU în interiorul blocului 'http'!):
stream {
    upstream mysql_backend {
        # Algoritm de distribuire pe conexiunile cel mai puțin ocupate:
        least_conn;
        server 10.0.1.10:3306 weight=3 max_fails=2 fail_timeout=10s;
        server 10.0.1.11:3306 weight=2;
        server 10.0.1.12:3306 backup; # Folosit doar dacă primele două noduri cad
    }

    server {
        # Nginx ascultă pe portul 3306 al serverului de gateway:
        listen 3306;
        proxy_pass mysql_backend;

        # Timeout-uri de conectare:
        proxy_connect_timeout 2s;
        proxy_timeout 10m;
    }

    # Exemplu de proxy UDP pentru servere DNS:
    server {
        listen 53 udp;
        proxy_pass 1.1.1.1:53;
        proxy_timeout 1s;
    }
}