Nginx
nginx est un serveur web robuste, de petite taille, hautement performant mais aussi un serveur reverse proxy. C'est une bonne alternative aux autres serveurs populaires tel qu'Apache et lighttpd.
Installation
Avant d'installer immédiatement le paquet www-servers/nginx, d'abord regarder attentivement les USE flags pour Nginx.
Expanded USE flags (NdT: drapeaux USE 'étendues')
Nginx utilise des modules pour étendre ses fonctionnalités. Pour simplifier la maintenance de cette approche modulaire, l'ebuild d'Nginx utilise des drapeaux USE étendus (USE_EXPAND) qui indiquent quels modules sont à installer.
- Les modules liés à HTTP peuvent être activés à travers la variable NGINX_MODULES_HTTP
- Les modules liés aux mails peuvent être activés à travers la variable NGINX_MODULES_MAIL
- Les modules-tiers peuvent être activé à travers la variable NGINX_ADD_MODULES
Ces variables doivent être paramétrés dans /etc/portage/make.conf. Leurs descriptions se situe dans /var/db/repos/gentoo/profiles/desc/nginx_modules_http.desc et /var/db/repos/gentoo/profiles/desc/nginx_modules_mail.desc.
Par exemple, pour activer le module fastcgi
:
NGINX_MODULES_HTTP="fastcgi"
Ci-dessus écrasera la valeur par défaut pour NGINX_MODULES_HTTP et paramètre fastcgi
. Pour activer le module fastcgi
sans écraser la valeur par défaut de NGINX_MODULES_HTTP, l'USE flag suivant peut être ajouté dans /etc/portage/package.use :
www-servers/nginx NGINX_MODULES_HTTP: fastcgi
USE flags
USE flags for www-servers/nginx Robust, small and high performance http and reverse proxy server
+http
|
Enable HTTP core support |
+http-cache
|
Enable HTTP cache support |
+http2
|
Enable HTTP2 module support |
+pcre2
|
Enable support for pcre2 |
aio
|
Enables file AIO support |
debug
|
Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces |
http3
|
Enable HTTP3 module support |
ktls
|
Enable Kernel TLS offload (kTLS) |
libatomic
|
Use libatomic instead of builtin atomic operations |
pcre
|
Add support for Perl Compatible Regular Expressions |
pcre-jit
|
Enable JIT for pcre |
rtmp
|
NGINX-based Media Streaming Server |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
ssl
|
Enable HTTPS module for http. Enable SSL/TLS support for POP3/IMAP/SMTP for mail. |
test
|
Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently) |
threads
|
Add threads support for various packages. Usually pthreads |
vim-syntax
|
Pulls in related vim syntax scripts |
Emerge
Avec les USE flags définit, installer www-servers/nginx :
root #
emerge --ask www-servers/nginx
Vérification de l'installation
La configuration par défaut de Nginx définit un serveur virtuel avec comme répertoire racine paramétré vers /var/www/localhost/htdocs. Cependant du au bug #449136, l'ebuild d'Nginx créera seulement le répertoire /var/www/localhost et sans fichier index. Pour avoir une configuration par défaut fonctionnelle, créer le répertoire /var/www/localhost/htdocs et un simple fichier index :
root #
mkdir /var/www/localhost/htdocs
root #
echo 'Bonjour, tout le monde !' > /var/www/localhost/htdocs/index.html
Le paquet Nginx install un script d'initialisation de service que les administrateurs peuvent utiliser pour arrêter (NdT: 'stop'), démarrer (NdT: 'start'), ou redémarrer (NdT: 'restart') le service :
root #
/etc/init.d/nginx start
Pour vérifier qu'Nginx fonctionne normalement, depuis un navigateur web se rendre sur l'adresse http://localhost ou utiliser un outil en ligne de commande tel que curl :
user $
curl http://localhost
Configuration
La configuration d'Nginx est géré à travers le fichier /etc/nginx/nginx.conf.
Accès à un site unique
L'exemple qui suit montre l'accès à site unique, sans fonctionnalités dynamiques (tel qu'on retrouve avec PHP).
user nginx nginx;
worker_processes 1;
error_log /var/log/nginx/error_log info;
events {
worker_connections 1024;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
client_header_timeout 10m;
client_body_timeout 10m;
send_timeout 10m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 4 2k;
request_pool_size 4k;
gzip off;
output_buffers 1 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 75 20;
ignore_invalid_headers on;
index index.html;
server {
listen 127.0.0.1;
server_name localhost;
access_log /var/log/nginx/localhost.access_log main;
error_log /var/log/nginx/localhost.error_log info;
root /var/www/localhost/htdocs;
}
}
Accès à différents sites
Il est possible de forcer la directive include
pour séparer la configuration (NdT: des sites) dans différents fichiers :
user nginx nginx;
worker_processes 1;
error_log /var/log/nginx/error_log info;
events {
worker_connections 1024;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
client_header_timeout 10m;
client_body_timeout 10m;
send_timeout 10m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 4 2k;
request_pool_size 4k;
gzip off;
output_buffers 1 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 75 20;
ignore_invalid_headers on;
index index.html;
include /etc/nginx/conf.d/*.conf;
}
server {
listen 127.0.0.1;
server_name localhost;
access_log /var/log/nginx/localhost.access_log main;
error_log /var/log/nginx/localhost.error_log info;
root /var/www/localhost/htdocs;
}
server {
listen 443 ssl;
server_name host.tld;
ssl_certificate /etc/ssl/nginx/host.tld.pem;
ssl_certificate_key /etc/ssl/nginx/host.tld.key;
}
Support du PHP
Ajouter les lignes qui suivent à la configuration d'Nginx pour activer le support de PHP. Dans cet exemple NGinx échange des informations avec le processus PHP via le socket UNIX.
...
http {
...
server {
...
location ~ \.php$ {
# Test les scripts non-existant ou renvoi une erreur 404
# Sans cette ligne, nginx enverra aveuglement toutes les requêtes terminant par .php vers php-fpm
try_files $uri =404;
include /etc/nginx/fastcgi.conf;
fastcgi_pass unix:/run/php-fpm.socket;
}
}
}
Pour supporter cette configuration, PHP a besoin d'être compilé avec le support de FastCGI Process Manager (NdT: Gestionnaire de processus de FastCGI, ou FPM en anglais) pour (dev-lang/php), qui est activable à travers l'USE flag fpm
:
root #
echo "dev-lang/php fpm" >> /etc/portage/package.use
Recompiler PHP avec l'USE flag fpm
activé :
root #
emerge --ask dev-lang/php
Utiliser le socket de communication d'UNIX est la configuration de préférence et celle qui est recommandée
Pour les versions de PHP 7.0 et supérieur de PHP utiliser cette configuration :
listen = /run/php-fpm.socket
listen.owner = nginx
Paramétrer le fuseau horaire dans le ficher php.ini de php-fpm. Substituer le texte <METTRE_FUSEAU_HORAIRE_ICI>
dans la boîte de dialogue ci-dessous avec les informations appropriés du fuseau horaire :
date.timezone = <METTRE_FUSEAU_HORAIRE_ICI>
Démarrer le démon php-fpm :
root #
/etc/init.d/php-fpm start
Ajouter php-fpm dans le niveau d'exécution par défaut :
root #
rc-update add php-fpm default
Recharger nginx avec la modification de configuration :
root #
/etc/init.d/nginx reload
Alternativement, pour systemd :
root #
systemctl enable php-fpm@7.1
root #
systemctl start php-fpm@7.1
Liste d'accès par IP
L'exemple suivant montre comment autoriser l'accès à une URL particulière (dans ce cas /nginx_status) seulement vers :
- Certains hôtes (par exemple: 192.0.2.1 127.0.0.1)
- et certains réseaux d'IP (par exemple: 198.51.100.0/24)
http {
server {
location /nginx_status {
stub_status on;
allow 127.0.0.1/32;
allow 192.0.2.1/32;
allow 198.51.100.0/24;
deny all;
}
}
}
Authentification basique
nginx autorise l'accès limité à ses ressources par validation du nom d'utilisateur et du mot de passe :
http {
server {
location / {
auth_basic "Authentification échouée";
auth_basic_user_file conf/htpasswd;
}
}
}
Le fichier htpasswd peut être généré en utilisant :
user $
openssl passwd
La géolocalisation en utilisant GeoIP2
Le module GeoIP2 utilise la base de donnée de GeoIP2 via Maxmind ou similaire. Utiliser Maxmind est déjà supporté dans Gentoo à travers net-misc/geoipupdate. Cependant, la création d'un compte est requis pour pouvoir obtenir une clé de licence et télécharger la base de donnée 'gratuitement' et 'librement' (NdT: en anglais, le terme 'free' ici peut designer gratuit ou libre, je n'ai pas su le déterminer et vous invite à en discuter sur la page de discussion).
Télécharger la base de données Maxmind pour GeoIP2
Une fois qu'un compte est crée, installer et configurer geoipupdate :
root #
emerge --ask net-misc/geoipupdate
Entrer le compte et la clé de licence :
AccountID VOTREIP
LicenseKey VOTRECLÉ
EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country
Ensuite, il est nécessaire de télécharger la base de données :
root #
geoipupdate
Pour pouvoir recevoir automatiquement les mises à jours à l'avenir, ajouter cette commande pour une tâche hebdomadaire cron ou le minuteur de systemd :
Ajouter le support de GeoIP2 à Nginx
Pour activer le module et recompiler Nginx :
www-servers/nginx NGINX_MODULES_HTTP: geo geoip2
Le module geoip ne supporte que les bases de données GeoIP dites 'legacy' (NdT: désignant une méthode, ici, ancienne, pas la dernière en date et existante).
Recompiler nginx avec les modules tiers activés :
root #
emerge --ask www-servers/nginx
Une fois qu'Nginx a été recompilé, pointer Nginx vers la base de données et les variables de GeoIP2 :
http {
...
geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
auto_reload 5m;
$geoip2_metadata_city_build metadata build_epoch;
$geoip2_data_city_name city names en;
$geoip2_data_city_geonameid city geoname_id;
$geoip2_data_continent_code continent code;
$geoip2_data_continent_geonameid continent geoname_id;
$geoip2_data_continent_name continent names en;
$geoip2_data_country_geonameid country geoname_id;
$geoip2_data_country_code iso_code;
$geoip2_data_country_name names en;
$geoip2_data_country_is_eu is_in_european_union;
$geoip2_data_location_accuracyradius location accuracy_radius;
$geoip2_data_location_latitude location latitude;
$geoip2_data_location_longitude location longitude;
$geoip2_data_location_metrocode location metro_code;
$geoip2_data_location_timezone location time_zone;
$geoip2_data_postal_code postal code;
$geoip2_data_rcountry_geonameid registered_country geoname_id;
$geoip2_data_rcountry_iso registered_country iso_code;
$geoip2_data_rcountry_name registered_country names en;
$geoip2_data_rcountry_is_eu registered_country is_in_european_union;
$geoip2_data_region_geonameid subdivisions 0 geoname_id;
$geoip2_data_region_iso subdivisions 0 iso_code;
$geoip2_data_region_name subdivisions 0 names en;
}
geoip2 /usr/share/GeoIP/GeoLite2-ASN.mmdb {
auto_reload 5m;
$geoip2_data_autonomous_system_number autonomous_system_number;
$geoip2_data_autonomous_system_organization autonomous_system_organization;
}
...
}
L'option auto_reload
vas autoriser les mises à jours de la base sans redémarrer Nginx.
Pour que les valeurs de GeoIP2 soient visibles dans les applications PHP, les assigner en tant que valeur fastcgi_param
:
...
fastcgi_param GEOIP2_CITY_BUILD_DATE $geoip2_metadata_city_build;
fastcgi_param GEOIP2_CITY $geoip2_data_city_name;
fastcgi_param GEOIP2_CITY_GEONAMEID $geoip2_data_city_geonameid;
fastcgi_param GEOIP2_CONTINENT_CODE $geoip2_data_continent_code;
fastcgi_param GEOIP2_CONTINENT_GEONAMEID $geoip2_data_continent_geonameid;
fastcgi_param GEOIP2_CONTINENT_NAME $geoip2_data_continent_name;
fastcgi_param GEOIP2_COUNTRY_GEONAMEID $geoip2_data_country_geonameid;
fastcgi_param GEOIP2_COUNTRY_CODE $geoip2_data_country_code;
fastcgi_param GEOIP2_COUNTRY_NAME $geoip2_data_country_name;
fastcgi_param GEOIP2_COUNTRY_IN_EU $geoip2_data_country_is_eu;
fastcgi_param GEOIP2_LOCATION_ACCURACY_RADIUS $geoip2_data_location_accuracyradius;
fastcgi_param GEOIP2_LATITUDE $geoip2_data_location_latitude;
fastcgi_param GEOIP2_LONGITUDE $geoip2_data_location_longitude;
fastcgi_param GEOIP2_LOCATION_METROCODE $geoip2_data_location_metrocode;
fastcgi_param GEOIP2_LOCATION_TIMEZONE $geoip2_data_location_timezone;
fastcgi_param GEOIP2_POSTAL_CODE $geoip2_data_postal_code;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_GEONAMEID $geoip2_data_rcountry_geonameid;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_ISO $geoip2_data_rcountry_iso;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_NAME $geoip2_data_rcountry_name;
fastcgi_param GEOIP2_REGISTERED_COUNTRY_IN_EU $geoip2_data_rcountry_is_eu;
fastcgi_param GEOIP2_REGION_GEONAMEID $geoip2_data_region_geonameid;
fastcgi_param GEOIP2_REGION $geoip2_data_region_iso;
fastcgi_param GEOIP2_REGION_NAME $geoip2_data_region_name;
fastcgi_param GEOIP2_ASN $geoip2_data_autonomous_system_number;
fastcgi_param GEOIP2_ASN_ORG $geoip2_data_autonomous_system_organization;
Les modules tiers
Télécharger les sources des modules tiers et les déplacer vers /usr/src. Compiler manuellement les modules Nginx sélectionnés, puis ajouter la ligne qui suit dans /etc/portage/make.conf :
NGINX_ADD_MODULES="/usr/src/nginxmodule"
Recompiler nginx avec le module tiers activé :
root #
emerge --ask www-servers/nginx
Utilisation
Contrôle du service
OpenRC
Démarrer le serveur web nginx :
root #
rc-service nginx start
Arrêter le serveur web nginx :
root #
rc-service nginx stop
Ajouter nginx au niveau d'exécution par défaut pour que le service démarre automatiquement à l'amorçage du système :
root #
rc-update add nginx default
Recharger la configuration d'Nginx sans abandonner des connexions (NdT: qui sont en cours) :
root #
rc-service nginx reload
Redémarrer le service nginx :
root #
rc-service nginx restart
systemd
Démarrer le serveur web nginx :
root #
systemctl start nginx
Arrêter le serveur web nginx :
root #
systemctl stop nginx
Vérifier l'état du service :
root #
systemctl status nginx
Activer le démarrage automatique du service au redémarrage du système :
root #
systemctl enable nginx
Recharger la configuration d'nginx sans abandonner les connexions (NdT: qui sont en cours) :
root #
systemctl reload nginx
Redémarrer le service nginx :
root #
systemctl restart nginx
Dépannage
En cas de problèmes, les commandes suivantes peuvent aider à résoudre la situation.
Valider la configuration
Vérifier que la configuration en cours ne contient pas d'erreurs :
root #
/usr/sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
NdT: Ce qui signifie en français:
nginx: la syntaxe du fichier de configuration /etc/nginx/nginx.conf est ok nginx: le test du fichier de configuration /etc/nginx/nginx.conf est un succès
En lançant nginx avec l'option -t
, cela validera la configuration sans avoir à réellement lancer le démon nginx. Utiliser l'option -c
avec le chemin complet vers le fichier de test dans les emplacements qui ne sont pas ceux par défaut.
Vérifier que les processus sont en cours d'exécutions
Vérifier si les processus d'nginx sont lancés :
user $
ps aux | egrep 'nginx|PID'
PID TTY STAT TIME COMMAND 26092 ? Ss 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 26093 ? S 0:00 nginx: worker proces
Vérifier les adresses de connexions et les ports
Vérifier que le démon nginx écoute sur le bon port TCP (tel que 80 pour HTTP ou 443 pour HTTPS) :
root #
ss -tulpn | grep :80
tcp LISTEN 0 0 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=6253,fd=52),("nginx",pid=6252,fd=52))
Voir aussi
- Apache — un serveur web efficient et extensible. C'est l'un des serveurs web les plus populaires utilisés sur l'Internet.
- Lighttpd — a fast and lightweight web server.
Ressources externes
- https://nginx.org/en/docs/beginners_guide.html - Un guide du débutant pour nginx. Utile pour celles et ceux qui n'en savent que peu à propos d'nginx.
- https://nginx.com/resources/admin-guide/ - Le guide d'administration d'ngnix. Utile pour les administrateurs webs qui ont déjà travaillé dans le milieu.
- https://wiki.nginx.org/Main - Le wiki d'nginx.
- https://github.com/h5bp/server-configs-nginx - Configuration H5BP pour nginx.