Nginx

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Nginx and the translation is 100% complete.


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 :

FILE /etc/portage/make.conf
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 :

FILE /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).

FILE /etc/nginx/nginx.confConfiguration par défaut d'NGinx dans Gentoo
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 :

FILE /etc/nginx/nginx.confConfiguration pour plusieurs sites
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;
}
FILE /etc/nginx/conf.d/local.confHébergement simple
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;
}
FILE /etc/nginx/conf.d/local-ssl.confHébergement simple avec du SSL
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.

FILE /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.use

Recompiler PHP avec l'USE flag fpm activé :

root #emerge --ask dev-lang/php
Remarque
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 :

FILE /etc/php/fpm-php7.1/fpm.d/www.confLancer PHP avec le support du socket UNIX
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 :

FILE /etc/php/fpm-php5.5/php.iniParamétrer le fuseau horaire dans php.ini
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)
FILE /etc/nginx/nginx.confActiver et configurer une liste d'accès par IP pour la page /nginx_status
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 :

FILE /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 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 :

FILE /etc/GeoIP.confEntrer les informations du compte
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 :

FILE /etc/portage/package.use/nginxAjout du module dans Nginx
www-servers/nginx NGINX_MODULES_HTTP: geo geoip2
Remarque
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 :

FILE /etc/nginx/nginx.confPointer vers la base de données GeoIP2 et ses valeurs
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 :

FILE /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;

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 :

FILE /etc/portage/make.confAjout du module tiers
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

Ressources externes