server{listen80;server_nameexample.com;# API vers Node.jslocation/api/{proxy_passhttp://127.0.0.1:3000/;proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}# Admin vers Python/Djangolocation/admin/{proxy_passhttp://127.0.0.1:8000/admin/;proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}# Fichiers statiques servis par Nginxlocation/static/{alias/var/www/static/;expires30d;add_headerCache-Control"public,immutable";}# Frontend par défautlocation/{proxy_passhttp://127.0.0.1:8080;proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;}}
upstreamapp_backend{# Least connections - envoie au serveur le moins chargéleast_conn;server192.168.1.10:3000;server192.168.1.11:3000;}upstreamapp_backend_weighted{# Weighted - poids différentsserver192.168.1.10:3000weight=3;# 3x plus de traficserver192.168.1.11:3000weight=1;}upstreamapp_backend_ip{# IP Hash - même client → même backend (sessions)ip_hash;server192.168.1.10:3000;server192.168.1.11:3000;}
Health checks et failover
upstreamapp_backend{server192.168.1.10:3000max_fails=3fail_timeout=30s;server192.168.1.11:3000max_fails=3fail_timeout=30s;server192.168.1.12:3000backup;# Utilisé si les autres sont down}
6. Proxy WebSocket
upstreamwebsocket_backend{server127.0.0.1:3001;}server{listen80;server_namews.example.com;location/{proxy_passhttp://websocket_backend;proxy_http_version1.1;# Headers WebSocketproxy_set_headerUpgrade$http_upgrade;proxy_set_headerConnection"upgrade";proxy_set_headerHost$host;# Timeout long pour WebSocketproxy_read_timeout3600s;proxy_send_timeout3600s;}}
7. Cache Proxy
# Définir zone de cache (dans http{})proxy_cache_path/var/cache/nginxlevels=1:2keys_zone=my_cache:10mmax_size=1ginactive=60muse_temp_path=off;server{listen80;server_namecached.example.com;location/{proxy_passhttp://127.0.0.1:3000;# Activer le cacheproxy_cachemy_cache;proxy_cache_valid20030210m;proxy_cache_valid4041m;proxy_cache_use_staleerrortimeoutupdatinghttp_500http_502http_503http_504;# Headers de debugadd_headerX-Cache-Status$upstream_cache_status;proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;}# Bypass cache pour certains cheminslocation/api/{proxy_passhttp://127.0.0.1:3000;proxy_cacheoff;proxy_set_headerHost$host;}}
# Créer le dossier cachemkdir-p/var/cache/nginx
chownnginx:nginx/var/cache/nginx
8. Sécurité
Rate limiting
# Définir zone de limite (dans http{})limit_req_zone$binary_remote_addrzone=api_limit:10mrate=10r/s;server{listen80;server_nameapi.example.com;location/api/{limit_reqzone=api_limitburst=20nodelay;proxy_passhttp://127.0.0.1:3000;proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;}}
Headers de sécurité
server{listen80;server_namesecure.example.com;# Headers de sécuritéadd_headerX-Frame-Options"SAMEORIGIN"always;add_headerX-Content-Type-Options"nosniff"always;add_headerX-XSS-Protection"1;mode=block"always;add_headerReferrer-Policy"strict-origin-when-cross-origin"always;location/{proxy_passhttp://127.0.0.1:3000;proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;# Cacher la version du backendproxy_hide_headerX-Powered-By;}}
# Autoriser Nginx à se connecter au réseausetsebool-Phttpd_can_network_connect1# Si proxy vers un port non-standardsemanageport-a-thttp_port_t-ptcp3000
10. Fichier de configuration réutilisable
Snippet proxy
vim/etc/nginx/conf.d/proxy_params.conf
# Inclure dans les locations avec: include /etc/nginx/conf.d/proxy_params.conf;proxy_http_version1.1;proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerX-Forwarded-Proto$scheme;proxy_set_headerUpgrade$http_upgrade;proxy_set_headerConnection"upgrade";proxy_connect_timeout60s;proxy_send_timeout60s;proxy_read_timeout60s;