resolver în Nginx

Reverse proxy și load balancing Toate versiunile Nginx (ipv6=off: 1.5.8+, valid=: 1.1.9+)

Setează serverele DNS folosite de Nginx când trebuie să rezolve nume în timpul funcționării: proxy_pass cu variabile, OCSP stapling, upstream cu resolve.

Sintaxă
resolver adresa [adresa ...] [valid=timp] [ipv4=on|off] [ipv6=on|off];
resolver_timeout timp;

Ce face resolver

Numele din proxy_pass http://api.exemplu.ro; sunt rezolvate o singură dată, la pornirea sau reîncărcarea lui Nginx. Dacă IP-ul se schimbă (servicii în cloud, containere), Nginx continuă să trimită cereri la adresa veche până la următorul reload.

Când proxy_pass conține o variabilă, Nginx rezolvă numele la cerere, folosind serverele DNS din resolver, și păstrează răspunsul cât spune TTL-ul DNS (sau cât spune valid=). Fără resolver, cererea eșuează cu eroarea no resolver defined. Tot resolver este necesar pentru ssl_stapling și, din Nginx 1.27.3, pentru parametrul resolve al serverelor din upstream.

În containere Docker, serverul DNS intern este 127.0.0.11; pe sistemele cu systemd-resolved, 127.0.0.53.

Parametri

Parametru Descriere
Context http, server, location (și upstream, din 1.27.3).
adresa IP-ul serverului DNS (portul opțional: 10.0.0.2:5353).
valid=timp Cât timp se păstrează răspunsul, în locul TTL-ului din DNS.
ipv6=off Nu cere adrese IPv6 (util dacă serverul nu are conectivitate IPv6).
resolver_timeout Implicit 30s. Cât așteaptă un răspuns DNS.

Ce returnează

Nimic direct; numele sunt rezolvate prin serverele DNS date.

Exemple

Exemplul 1: Proxy spre un serviciu cu IP care se schimbă

location /api/ {
    resolver 1.1.1.1 9.9.9.9 valid=60s ipv6=off;
    resolver_timeout 5s;

    set $api "https://api.furnizor-curierat.ro";
    proxy_pass $api;
    proxy_ssl_server_name on;
}

Exemplul 2: Nginx într-un container Docker

Containerul aplicatie poate fi recreat cu alt IP; Nginx îl găsește din nou fără restart.

resolver 127.0.0.11 valid=10s;

server {
    listen 80;
    location / {
        set $aplicatie http://aplicatie:3000;
        proxy_pass $aplicatie;
    }
}

Exemplul 3: proxy_pass cu variabilă, fără resolver

tail -n 1 /var/log/nginx/error.log

Ieșire în terminal

2026/10/25 12:20:31 [error] 813#813: *4410 no resolver defined to resolve api.furnizor-curierat.ro, client: 86.120.14.7, server: exemplu.ro, request: "GET /api/awb/1042 HTTP/2.0", host: "exemplu.ro"

Greșeli frecvente

  • Pui o variabilă în proxy_pass și uiți resolver: toate cererile dau 502 Bad Gateway.
  • Folosești un server DNS public în rețeaua internă și numele interne (db.intern) nu se rezolvă. Folosește serverul DNS al rețelei.

Comenzi înrudite

  • set: Creează sau schimbă o variabilă în configurația Nginx. Valoarea poate combina text și alte variabile.