====== Frontal web (reverse proxy) chiffrant avec nginx ====== On utilise nginx (du paquet Debian ''nginx-light''). Utilisé en parallèle avec [[lets_encrypt|Let's Encrypt]]. ===== Modifications de configuration ===== Décommenter ''server_names_hash_bucket_size 64;'' car très vite nécessaire. Problèmes de buffering : # buffering causes issues, disable it # increase buffer size. still useful even when buffering is off proxy_buffering off; proxy_buffer_size 4k; ===== VHosts reverse-proxy ===== On utilise un petit script qui va générer les fichiers de configuration à partir d'un template. Comme cela, une modification du template sera bien répercutée partout. Au cas où un site aurait besoin d'une configuration spécifique, le template inclue des paramétrages supplémentaires (dans un nouveau dossier ''/etc/nginx/sites-customizations/'') si existants. Nous avons mis notre partie spécifique dans ''/etc/nginx/usine''. server { listen 80; listen [::]:80; server_name %SERVERS%; include conf.d/acme.inc; include conf.d/redirect_https.inc; access_log /var/log/nginx/vhosts/%FIRST_SERVER%/access.log main; error_log /var/log/nginx/vhosts/%FIRST_SERVER%/error.log error; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name %SERVERS%; ssl_certificate /etc/letsencrypt/live/%FIRST_SERVER%/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/%FIRST_SERVER%/privkey.pem; include /etc/nginx/conf.d/ssl-params.inc; # SSL parameters location / { include conf.d/proxy_set_headers.inc; proxy_pass %PROXY%; } access_log /var/log/nginx/vhosts/%FIRST_SERVER%/access.log main; error_log /var/log/nginx/vhosts/%FIRST_SERVER%/error.log error; include /etc/nginx/sites-customizations/%FIRST_SERVER%.*.conf; } Et le petit script de génération : #!/bin/sh cat proxy-list | while read p; do proxy=$(echo $p | cut -d ' ' -f1) servers=$(echo $p | cut -d ' ' -f2-) first_server=$(echo $p | cut -d ' ' -f2) conf=/etc/nginx/sites-available/$first_server.conf cp vhost.tpl $conf sed -i "s~%PROXY%~$proxy~g" $conf sed -i "s~%SERVERS%~$servers~g" $conf sed -i "s~%FIRST_SERVER%~$first_server~g" $conf mkdir -p /var/log/nginx/vhosts/$first_server/ done Exemple de ligne de la liste des proxy dans le fichier ''/etc/nginx/usine/proxy-list'' : http://192.168.1.71:80 wiki.usine.michalon.eu ==== Ajout d'un nouveau VHost ==== Procédure : sudo certbot --rsa-key-size 4096 --nginx -d mon-super-domaine.rocks,www.mon-super-domaine.rocks cd /etc/nginx/usine sudo nano proxy-list => rajouter le proxy sudo ./gen.sh (/!\ réécrit tous les vhost, attention s'il y a des modifications temporaires…) sudo ln -s /etc/nginx/sites-available/mon-super-domaine.rocks.conf /etc/nginx/sites-enabled/ sudo service nginx reload ==== Ajout d'un nouveau nom de domaine à un VHost existant ==== Il peut arriver qu'on veuille ajouter un autre nom de domaine comme alias à un VHost existant. Plutôt que de tout recommencer on peut juste - ajouter le nouveau nom à la suite des noms du VHost déjà existants dans ''proxy-list'' - relancer le script : ''./gen.sh'' - rajouter le nom au certificat : ''certbot --expand -d premier-nom -d deuxième-nom etc.'' Attention à bien garder le premier nom intact, dans le fichier, et en premier à certbot, c'est celui qui identifie le VHost partout. ==== Rotation des logs des VHosts ==== Puisqu'on a configuré les VHost pour envoyer leurs logs dans des sous-dossiers, il faut faire suivre ces dossiers aussi par logrotate. On peut simplement réutiliser la configuration par défaut et l'appliquer aux vhost : sudo cp /etc/logrotate.d/nginx /etc/logrotate.d/nginx-vhosts et changer le motif de suivi par ''/var/log/nginx/vhosts/*/*.log''. Pour vérifier que tout se passe comme on voudrait, on peut interroger logrotate sur ce qu'il a compris et compte faire : sudo /usr/sbin/logrotate --debug /etc/logrotate.conf ===== VHost par défaut (catch-all) ===== Il s'agit d'un VHost qui sera utilisé pour toutes les requêtes qui n'appartiennent pas à un autre VHost (accès direct par l'IP, nom de domaine inconnu du serveur, …). Sans cela nginx utilisera le premier VHost (par ordre lexicographique) configuré. On peut utiliser le certificat snakeoil créé par le paquet ssl-cert car de toutes façons il sera invalide. Exemple de configuration : server { listen 80 default_server; listen [::]:80 default_server; listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; include /etc/nginx/conf.d/ssl-params.inc; # SSL parameters return 404; # or whatever }