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; }
http core
Ceux sont les directives du moteur http Nginx.
- Autorisez les Entrée/Sorties asynchrones, aio(4) et sendfile(2):
- /usr/local/etc/nginx/nginx.conf
http { sendfile on; aio on; }
- activez l'option
TCP_NOPUSH
des sockets de FreeBSD, pour éviter de pousser de trop petits paquets dans le réseau:
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; … }
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:
- ACCEPT_FILTER_HTTP
- ACCEPT_FILTER_DATA
Ou de charger les modules:
- accf_http
- 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; … }
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.
http
pour les propager à tous les serveurs.