====== 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.