Table des matières

Nginx le serveur WEB

nginx est un serveur web qui a longtemps été développé sur et pour FreeBSD.

Lorsque vous installerez ce ports, consultez bien la longue liste des options.

Configuration

Toute la configuration ou presque se fait sous /usr/local/etc/nginx/nginx.conf, il n'y a pas de sites-available/sites-enable comme sous Linux ou comme sous Apache.

FreeBSD

Certains réglages, uniquement (ou presque) valides sous FreeBSD sont à prendre en compte.En premier lieu, demandez à Nginx d'utiliser les kqueue(2). C'est une interface non-bloquante pour écouter les sockets(2) plus performantes que les ancêtres poll(2) ou select(2).

/usr/local/etc/nginx/nginx.conf
events {
        worker_connections  1024;
        use kqueue;
}

events du contexte main.

http core

Ceux sont les directives du moteur http Nginx.

/usr/local/etc/nginx/nginx.conf
http {
        sendfile        on;
        aio            on;
}
/usr/local/etc/nginx/nginx.conf
http {
        tcp_nopush     on;
}

serveur

Il s'agit des directives des hôtes virtuels de Nginx.

En particulier la directive listen, qui permet de paramétrer une socket en utilisant par exemple http2 sur ssl.

/usr/local/etc/nginx/nginx.conf
server {
                http2 on;
                listen [::]:443 ssl;}
Attention, comme toutes les directives qui sont des options appliquées aux sockets, elles ne sont valides et acceptées qu'une seule fois, c'est à dire pour un seul couple adresse:port.

Filtres

Le noyau de FreeBSD permet de définir des filtres qui vont vérifier le contenu du flux avant de la passer à une socket.

Nginx comprend accept_filter=httpready et accept_filter=dataready. Assuez vous d'avoir activé les options suivantes dans le noyau:

  1. ACCEPT_FILTER_HTTP
  2. ACCEPT_FILTER_DATA

Ou de charger les modules:

  1. accf_http
  2. accf_data

Pour pouvoir définir ces filtres derrière la directive listen.

Fast open

Votre serveur peut utiliser le paramètre TCP FASTOPEN si vous l'avez activé dans votre système.

sysctl net.inet.tcp.fastopen.server_enable=1 

Ajoutez le à une directive listen:

/usr/local/etc/nginx/nginx.conf
server {
                http2 on;
                listen [::]:443 ssl fastopen=256;}
Mais faites attention avec celle là, ne l'activez pas sans raison.

Rangement

Pour éviter de vous répéter, ou pour ranger vos serveurs dans des fichiers séparés, utiliser la directive include.

Par exemple, pour rejeter d'office les requêtes louches:

/usr/local/etc/nginx/drop.conf
location = /robots.txt  { access_log off; log_not_found off; }
location = /favicon.ico { access_log off; log_not_found off; }
location ~ /\.          { access_log off; log_not_found off; deny all; }
location ~ ~$           { access_log off; log_not_found off; deny all; }

Il suffit ensemble de le préciser dans les serveurs concernés:

/usr/local/etc/nginx/nginx.conf
 server {
                listen [::]:80 ;
                listen 80 ;
                server_name popeye.lapinbilly.eu;
                root /usr/local/www/popeye;
                index index.html;
                include drop.conf;
        }

Vous pouvez de la même manière mettre la configuration d'un serveur dans un fichier à part.

Chiffrement

Lorsque vous voulez fournir le protocole HTTPS, outre le chiffrement en lui même,vous allez devoir demander des certificats à une autorité de certification. La plus connue est letsencrypt, qui est gratuite. Un outil de certification dédié à Nginx existe pour cela, certbot-nginx.

Par contre, pour certains services, il vous faudra un chiffrement plus solide, voici ceux conseillés par Mozilla:

openssl dhparam -out /usr/local/etc/nginx/dhparam.pem 2048

Que vous allez donner à votre serveur virtuel:

/usr/local/etc/nginx.conf
server {
		ssl_dhparam /usr/local/etc/nginx/dhparam.pem;
		ssl_protocols TLSv1.2 TLSv1.3;
		ssl_ecdh_curve X25519:P-521:P-384:P-256;
		ssl_prefer_server_ciphers on;
 
		ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384";
		ssl_session_cache shared:SSL:10m;
		ssl_session_timeout 15m;
		ssl_session_tickets off;
 
		ssl_certificate /usr/local/etc/letsencrypt/live/popeye.lapinbilly.eu/fullchain.pem;
		ssl_certificate_key /usr/local/etc/letsencrypt/live/popeye.lapinbilly.eu/privkey.pem;
TLSv1.3 est disponible en base sous FreeBSD 12, puisque la version de ssl(3) est au moins 1.1.1.
TLSV1.1 n'est pas considéré comme sûr.

Tester le !

Mis à part les certificats, vous pouvez placer ces directives sous http pour les propager à tous les serveurs.