Î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).
# Î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;
}