Evaluarea Dinamică a Variabilelor și Rutarea Curată cu Directiva map în Nginx

Blocuri de bază Standard Nginx

Ghid avansat pentru directiva map în Nginx: crearea și evaluarea eficientă a variabilelor bazate pe tabele hash, înlocuirea blocurilor riscante de tip if, rutarea dinamică a conexiunilor WebSocket și bypass-ul selectiv de cache.

Sintaxă
map $http_upgrade $connection_upgrade { default upgrade; '' close; }

În documentația oficială Nginx există un articol celebru intitulat „If is Evil”: folosirea instrucțiunii if în interiorul blocurilor location provoacă adesea comportamente imprevizibile, ignorarea directivelor de rutare și chiar segfault-uri de memorie. Soluția elegantă, sigură și extrem de rapidă recomandată de arhitectura Nginx este directiva map, care evaluează o variabilă sursă și produce o variabilă nouă folosind un tabel hash pre-compilat.

Exemplul #1: Negocierea corectă a conexiunilor WebSocket
# În contextul http din /etc/nginx/nginx.conf:
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 80;
    server_name socket.dexblog.ro;

    location /ws/ {
        proxy_pass http://localhost:4000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        # Dacă clientul nu trimite antet Upgrade, conexiunea este marcată 'close':
        proxy_set_header Connection $connection_upgrade;
    }
}
Exemplul #2: Bypass selectiv de Cache pentru utilizatori autentificați
# Dacă utilizatorul are cookie de login sau trimite antet Authorization, setăm variabila la 1:
map $http_cookie $no_cache {
    default 0;
    ~*wordpress_logged_in 1;
    ~*PHPSESSID 1;
}

server {
    location / {
        proxy_pass http://backend;
        # Ocolim cache-ul dacă variabila calculată este 1:
        proxy_cache_bypass $no_cache;
        proxy_no_cache $no_cache;
    }
}