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 :
/etc/portage/package.usewww-servers/nginxNGINX_MODULES_HTTP:fastcgi
USE flags
USE flags for www-servers/nginx Robust, small and high performance HTTP and reverse proxy server
+http
Enable core HTTP support
+http-cache
Enable HTTP cache support
+http2
Enable HTTP2 module support
+modules
Enable loadable module support
+pcre2
Enable support for pcre2
aio
Enable asynchronous I/O support
debug
Enable support for debugging log
http3
Enable HTTP3 module support
ktls
Enable Kernel TLS offload (kTLS)
libatomic
Use dev-libs/libatomic_ops instead of builtin atomic operations
mail
Enable POP3/IMAP4/SMTP mail proxy server
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.
stream
Enable generic TCP/UDP proxying and load balancing
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/nginxVé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 -p /var/www/localhost/htdocsThen, uncomment the root directive inside the server block:
/etc/nginx/nginx.confSetting the root directiveserver{ listen127.0.0.1; server_namelocalhost; # Substitute the directory below for the one you use. root/var/www/localhost/htdocs; }
You can copy a sample welcome page to the root directory. For example, if /var/www/localhost/htdocs was chosen, use the following command to copy the welcome page to the root:
root #cp /usr/share/nginx/index.html /var/www/localhost/htdocsLe 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 startIf using systemd, use the following command to start NGINX:
root #systemctl start nginx.servicePour 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://localhostConfiguration
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).
/etc/nginx/nginx.confConfiguration par défaut d'NGinx dans Gentoouser 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 :
/etc/nginx/nginx.confConfiguration pour plusieurs sitesuser 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;
}
/etc/nginx/conf.d/local.confHébergement simpleserver {
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;
}
/etc/nginx/conf.d/local-ssl.confHébergement simple avec du SSLserver {
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.
/etc/nginx/nginx.confActiver le support du PHP...
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.useRecompiler PHP avec l'USE flag fpm activé :
root #emerge --ask dev-lang/phpUtiliser 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 :
/etc/php/fpm-php7.1/fpm.d/www.confLancer PHP avec le support du socket UNIXlisten=/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 :
/etc/php/fpm-php5.5/php.iniParamétrer le fuseau horaire dans php.inidate.timezone=<METTRE_FUSEAU_HORAIRE_ICI>
Démarrer le démon php-fpm :
root #/etc/init.d/php-fpm startAjouter php-fpm dans le niveau d'exécution par défaut :
root #rc-update add php-fpm defaultRecharger nginx avec la modification de configuration :
root #/etc/init.d/nginx reloadAlternativement, pour systemd :
root #systemctl enable php-fpm@7.1
root #systemctl start php-fpm@7.1root #systemctl enable php-fpm@8.2
root #systemctl start php-fpm@8.2
root #systemctl restart nginx.serviceListe 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)
/etc/nginx/nginx.confActiver et configurer une liste d'accès par IP pour la page /nginx_statushttp {
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 :
/etc/nginx/nginx.confActiver et configurer une authentification par utilisateur pour l'emplacement /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 passwdThis will create the domain.htpasswd file, containing a row for the user 'foo'.
The string with the user name should end with ':', this is the separator field between the user name and the password.
user $openssl passwd >> domain.htpasswdThis will add the password to the line for the user 'foo'. The password will be asked on the standard input. Once it's over, the file could be opened and will contain something like this:
/etc/nginx/domain.htpasswdContent of the domain.htpasswd file, for user foo with a ciphered passwordfoo:1ドル$lpC3de5Y$dnh6jegS1qlfZVo7rGExz/
The password is not in plain text, rather it is encrypted with OpenSSL.
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/geoipupdateEntrer le compte et la clé de licence :
/etc/GeoIP.confEntrer les informations du compteAccountID 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 :
/etc/portage/package.use/nginxAjout du module dans Nginxwww-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/nginxUne fois qu'Nginx a été recompilé, pointer Nginx vers la base de données et les variables de GeoIP2 :
/etc/nginx/nginx.confPointer vers la base de données GeoIP2 et ses valeurshttp {
...
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 :
/etc/nginx/fastcgi.confAjout du support de GeoIP2 à PHP... 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;
Utilisation
Contrôle du service
OpenRC
Démarrer le serveur web nginx :
root #rc-service nginx startArrêter le serveur web nginx :
root #rc-service nginx stopAjouter 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 defaultRecharger la configuration d'Nginx sans abandonner des connexions (NdT: qui sont en cours) :
root #rc-service nginx reloadRedémarrer le service nginx :
root #rc-service nginx restartsystemd
Démarrer le serveur web nginx :
root #systemctl start nginxArrêter le serveur web nginx :
root #systemctl stop nginxVérifier l'état du service :
root #systemctl status nginxActiver le démarrage automatique du service au redémarrage du système :
root #systemctl enable nginxRecharger la configuration d'nginx sans abandonner les connexions (NdT: qui sont en cours) :
root #systemctl reload nginxRedémarrer le service nginx :
root #systemctl restart nginxDé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 #rc-service nginx configtestnginx | * Checking NGINX's configuration ... nginx |nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx |nginx: configuration file /etc/nginx/nginx.conf test is successful [ ok ]
Alternatively, if using systemd:
root #/usr/sbin/nginx -tnginx: 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 :80tcp 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.