====== Nginx le serveur WEB ======
[[https://www.freshports.org/www/nginx|nginx]] est un serveur web qui a longtemps été développé sur et pour FreeBSD.
Lorsque vous installerez ce [[https://www.freebsd.org/doc/handbook/ports.html|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 [[https://www.freshports.org/www/apache24|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).
events {
worker_connections 1024;
use kqueue;
}
----
[[http://nginx.org/en/docs/events.html|events du contexte main]].
==== http core ====
Ceux sont les directives du [[http://nginx.org/en/docs/http/ngx_http_core_module.html|moteur http Nginx]].
* Autorisez les Entrée/Sorties asynchrones, aio(4) et sendfile(2):
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:
http {
tcp_nopush on;
}
==== serveur ====
Il s'agit des directives des [[http://nginx.org/en/docs/http/ngx_http_core_module.html|hôtes virtuels de Nginx]].
En particulier la directive [[http://nginx.org/en/docs/http/ngx_http_core_module.html#listen|listen]], qui permet de paramétrer une socket en utilisant par exemple [[http://nginx.org/en/docs/http/ngx_http_v2_module.html|http2]] sur ''ssl''.
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 [[https://www.freebsd.org/cgi/man.cgi?accf_http|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 [[http://en.wikipedia.org/wiki/TCP_Fast_Open|TCP FASTOPEN]] si vous l'avez activé dans votre système.
sysctl net.inet.tcp.fastopen.server_enable=1
Ajoutez le à une directive ''listen'':
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:
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:
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 [[http://nginx.org/en/docs/http/configuring_https_servers.html|protocole HTTPS]], outre le chiffrement en lui même,vous allez devoir demander des certificats à une autorité de certification.
La plus connue est [[https://letsencrypt.org/fr/|letsencrypt]], qui est gratuite.
Un outil de certification dédié à //Nginx// existe pour cela, [[https://www.freshports.org/security/py-certbot-nginx|certbot-nginx]].
Par contre, pour certains services, il vous faudra un chiffrement plus solide, voici ceux conseillés par [[https://wiki.mozilla.org/Security/Server_Side_TLS|Mozilla]]:
openssl dhparam -out /usr/local/etc/nginx/dhparam.pem 2048
Que vous allez donner à votre serveur virtuel:
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.
[[https://www.ssllabs.com/ssltest|Tester le]] !
Mis à part les certificats, vous pouvez placer ces directives sous ''http'' pour les propager à tous les serveurs.