Nginx ca API Gateway de Mare Viteză: Rutare Dinamică, CORS, Rate-Limiting per Cheie API și OpenResty / Lua în Nginx

Ghid de arhitectură API Gateway cu Nginx: configurarea rutării microserviciilor pe versiuni (/v1, /v2), gestionarea corectă a antetelor CORS (Cross-Origin Resource Sharing), rate limiting bazat pe chei API și introducere în scriptarea Lua cu OpenResty.

Sintaxă
limit_req_zone $http_x_api_key zone=api_clients:10m rate=100r/m; proxy_pass http://upstream_service;

În arhitecturile moderne de microservicii, expunerea fiecărui serviciu individual direct către clienți (aplicații mobile, front-end React/Vue) introduce o complexitate uriașă de autentificare, securitate și gestionare CORS. Utilizarea Nginx ca API Gateway centralizează toate aceste responsabilități: asigură rutarea inteligentă pe versiuni, aplică cote de utilizare pe baza cheilor API (API Keys), elimină problemele de CORS și poate chiar rula scripturi logice ultra-rapide în Lua (OpenResty).

Configurația completă pentru un API Gateway Nginx
# În contextul http:
# Rate limiting calculat în funcție de cheia API trimisă în antetul 'X-API-Key' (nu după IP!):
limit_req_zone $http_x_api_key zone=api_tier_basic:10m rate=60r/m;

upstream auth_service {
    server 10.0.2.10:4001;
}

upstream catalog_service {
    server 10.0.2.11:4002;
    server 10.0.2.12:4002;
    keepalive 32; # Reutilizează conexiunile TCP cu backend-ul pentru viteză maximă!
}

server {
    listen 443 ssl http2;
    server_name api.dexblog.ro;

    # GESTIONAREA COMPLETĂ ȘI CURATĂ A ANTETELOR CORS (Cross-Origin Resource Sharing):
    set $cors_origin "";
    if ($http_origin ~* "^https://(www\.)?dexblog\.ro$") {
        set $cors_origin $http_origin;
    }

    # Tratarea cererilor preflight OPTIONS:
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '$cors_origin' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, X-API-Key' always;
        add_header 'Access-Control-Max-Age' 86400; # 24 ore cache pentru preflight
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
    }

    # RUTA 1: Serviciul de Autentificare (/v1/auth/):
    location /v1/auth/ {
        proxy_pass http://auth_service/;
        include proxy_params;
    }

    # RUTA 2: Serviciul de Catalog Produse (/v1/catalog/):
    location /v1/catalog/ {
        # Verificăm prezența cheii API:
        if ($http_x_api_key = "") {
            return 401 '{"error": "Antetul X-API-Key lipseste din cerere."}';
        }

        # Aplicăm cota de 60 cereri/minut per cheie:
        limit_req zone=api_tier_basic burst=10 nodelay;

        proxy_pass http://catalog_service/;
        proxy_http_version 1.1;
        proxy_set_header Connection ""; # Menține keepalive activ către upstream
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;

        # Injectăm antetele CORS în răspunsul către client:
        add_header 'Access-Control-Allow-Origin' '$cors_origin' always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
    }
}

Extensibilitate Maximă cu OpenResty și Scripturi Lua

Dacă aveți nevoie de validare directă a token-urilor JSON Web Token (JWT) sau de citirea sesiunilor dintr-un cluster Redis înainte ca cererea să atingă microserviciul, OpenResty permite injectarea de cod Lua direct în fazele Nginx:

# Validarea unui token JWT în mai puțin de 0.5 milisecunde cu Lua:
location /v1/secure/ {
    access_by_lua_block {
        local jwt = require("resty.jwt")
        local auth_header = ngx.var.http_Authorization
        -- verifică semnătura criptografică a token-ului JWT ...
    }
    proxy_pass http://backend_cluster;
}