Usine

Un wiki à l'usine !

Outils pour utilisateurs

Outils du site


frontal_web

Frontal web (reverse proxy) chiffrant avec nginx

On utilise nginx (du paquet Debian nginx-light).

Utilisé en parallèle avec 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.

/etc/nginx/usine/vhost.tpl
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 :

/etc/nginx/usine/gen.sh
#!/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

  1. ajouter le nouveau nom à la suite des noms du VHost déjà existants dans proxy-list
  2. relancer le script : ./gen.sh
  3. 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
}
frontal_web.txt · Dernière modification : le 22/12/2023 à 17h39 de john