Credit : Illustration backtotheweb.fr
Mettre en place un reverse proxy Nginx avec SSL
Mettre en place un reverse proxy Nginx avec SSL
Un reverse proxy Nginx permet d'exposer sur Internet des applications qui tournent sur des ports internes (Node.js sur 3000, Python sur 8000, etc.) tout en gerant le SSL, la compression et les headers de securite. Configuration complete pour un serveur IONOS.
Principe du reverse proxy
Le client se connecte a Nginx sur le port 443 (HTTPS). Nginx transmet la requete a l'application interne et renvoie la reponse au client. L'application n'est jamais exposee directement.
Client --> Nginx (443/SSL) --> App Node.js (localhost:3000)
Configuration de base
Creez /etc/nginx/sites-available/app.monsite.fr :
upstream backend_app {
server 127.0.0.1:3000;
keepalive 32;
}
server {
listen 80;
server_name app.monsite.fr;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name app.monsite.fr;
# SSL sera configure par Certbot
ssl_certificate /etc/letsencrypt/live/app.monsite.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.monsite.fr/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# Headers de securite
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
# Logs
access_log /var/log/nginx/app.monsite.fr.access.log;
error_log /var/log/nginx/app.monsite.fr.error.log;
location / {
proxy_pass http://backend_app;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
# Timeouts
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Buffering
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
}
Support WebSocket
Si votre application utilise des WebSockets (Socket.io, etc.), ajoutez un bloc location dedie :
location /socket.io/ {
proxy_pass http://backend_app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
Les headers Upgrade et Connection "upgrade" sont essentiels pour le passage du protocole HTTP au protocole WebSocket.
Obtenir le certificat SSL avec Certbot
apt install certbot python3-certbot-nginx -y
certbot --nginx -d app.monsite.fr
Certbot configure automatiquement le renouvellement. Verifiez avec :
certbot renew --dry-run
systemctl list-timers | grep certbot
Proxifier plusieurs applications
Retour d'expérience : on utilise cette config sur tous nos serveurs clients.
Un seul serveur Nginx peut proxifier de nombreuses applications :
# api.monsite.fr -> Node.js sur 3000
# admin.monsite.fr -> Python sur 8000
# grafana.monsite.fr -> Grafana sur 3001
Chaque sous-domaine a son propre fichier de configuration et son propre certificat SSL (ou utilisez un certificat wildcard).
Optimisations supplementaires
Compression gzip
Dans /etc/nginx/nginx.conf :
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
Rate limiting
Protegez votre application contre les abus :
# Dans le bloc http
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
# Dans le bloc location
limit_req zone=api burst=20 nodelay;
Tester et activer
ln -s /etc/nginx/sites-available/app.monsite.fr /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
Testez le bon fonctionnement :
curl -I https://app.monsite.fr
Verifiez la presence des headers de securite et le certificat SSL dans la reponse. Votre application est desormais accessible de maniere securisee derriere Nginx.
Si vous avez des questions, n'hésitez pas à nous écrire. On répond à tout le monde.