Nginx

Updated 7 Mai 2021

Nginx

Installation et configuration de Nginx

Commencez par installer Nginx :

emerge -a www-servers/nginx

Configuration Nginx

Tous les paramètres de Nginx sont stockés dans /etc/nginx/nginx.conf. Les paramètres spécifiques de sites Internet sont stockés dans /etc/nginx/sites-enabled.

Lancez Nginx :

/etc/init.d/nginx start

Ajoutez Nginx à la liste de démarrage automatique :

rc-update add nginx

Exemples de configuration Nginx

Créez un fichier de configuration pour localhost :

/etc/nginx/sites-enabled/local.conf
server {
    listen 80;
    server_name localhost;
    access_log /var/log/nginx/localhost.access_log main;
    error_log /var/log/nginx/localhost.error_log info;
    root /var/calculate/www/localhost/htdocs;
} 

Créez un fichier index pour vérifier l'état du serveur :

mkdir -p /var/calculate/www/localhost/htdocs

echo 'Hello!' > /var/calculate/www/localhost/htdocs/index.html

Vérification des paramètres

Avant de redémarrer Nginx, pensez toujours à faire une vérification avec nginx -t.

Si c'est bon, le message suivant sera affiché :

nginx -t

nginx: le fichier de configuration /etc/nginx/nginx.conf syntax is ok
nginx: fichier de configuration /etc/nginx/nginx.conf test is successful 

Si cela a réussi, relisez la configuration de Nginx:

/etc/init.d/nginx reload

Pour vérifier que Nginx fonctionne, utilisez la console web curl :

curl http://localhost

Bonjour!

Configuration de HTTPS pour Nginx

Créez une clé DH :

openssl dhparam -out /etc/nginx/ssl-dhparams.pem 4096
Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time 

Créer un fichier décrivant les paramètres généraux de SSL :

/etc/nginx/ssl.conf
# This file contains important security parameters. If you modify this file
# manually, Certbot will be unable to automatically provide future security
# updates. Instead, Certbot will print and log an error message with a path to
# the up-to-date file that you will need to refer to when manually updating
# this file.

ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

ssl_dhparam /etc/nginx/ssl-dhparams.pem; 

Getting a Let's Encrypt certificate

Procurez-vous les certificats de domaine www.example.org et example.org~ pour Nginx, comme expliqué dans le manuel.

Exemple de configuration de l'HTTPS

Ajoutez les paramètres HTTPS pour example.org :

/etc/nginx/sites-enabled/example.org.conf
server {
    listen 80;
    listen 443 ssl;
    server_name www.example.org example.org;

    include ssl.conf;
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;

    access_log /var/log/nginx/example.org.access_log main;
    error_log /var/log/nginx/example.org.error_log info;

    include acme.conf;

    root /var/calculate/www/example.org/htdocs; 
} 

Redirection de HTTP vers HTTPS

Ajoutez la règle redirigeant de http://example.org vers https://example.org :

/etc/nginx/sites-enabled/example.org.conf
server {
    listen 80;
    listen 443 ssl;
    server_name www.example.org example.org;

    include ssl.conf;
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;

    access_log /var/log/nginx/example.org.access_log main;
    error_log /var/log/nginx/example.org.error_log info;

    include acme.conf;

    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }

    root /var/calculate/www/example.org/htdocs; 
} 

Installer et configurer PHP-FPM

PHP-FPM (FastCGI Process Manager) est une interface performante et modulable permettant de gérer l'interaction entre un serveur web et une application web. Il s'agit d'une évolution de la technologie CGI. Le principal avantage de FastCGI est de séparer le langage dynamique du serveur web. Cette technologie permet d'exécuter des serveurs Web et des processus CGI sur plusieurs hôtes, offrant une plus grande souplesse et une meilleure sécurité sans perte notable de performances.

Pour installer PHP-FPM, exécutez :

emerge -a dev-lang/php

Dès que toutes les informations nécessaires à l'installation sont affichées, vous pouvez valider la version par défaut de PHP. Vous pouvez annuler l'installation et spécifier la version requise de PHP lors du prochain essai d'installation Utilisez l'option php -m pour afficher toutes les extensions disponibles et en cours d'exécution.

Использование UNIX-сокета для взаимодействия Nginx c PHP является предпочтительным и рекомендуемым вариантом!

Indiquez le fuseau horaire en modifiant le fichier de configuration en conséquence :

/etc/php/fpm-php7.4/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Europe/Paris" 

Note

Dans l'exemple ci-dessus, le chemin d'accès est celui de PHP 7.4. Si vous utilisez une version différente de PHP, modifiez-le en conséquence.

Démarrez le service PHP-FPM :

/etc/init.d/php-fpm start

Mettez PHP-FPM sur la liste de démarrage automatique :

rc-update add php-fpm

Exemple de configuration de Nginx avec du code PHP

Pour fournir le support PHP, ajoutez ce qui suit à la configuration du site fonctionnant sous Nginx. Dans l'exemple ci-dessous, Nginx échange des informations avec le processus PHP via un socket UNIX. Dans le bloc serveur, ajoutez un bloc d'emplacement, réservé aux règles de fonctionnement de PHP.

Appliquer les réglages:

/etc/nginx/sites-enabled/example.org.conf
# localhost
server {
    listen 80;
    server_name www.example.org example.org;
    access_log /var/log/nginx/example.org.access_log main;
    error_log /var/log/nginx/example.org.error_log info;
    root /var/calculate/www/localhost/htdocs;
    location ~ \.php$ {
        # Checking for nonexistent scripts or 404 error
        # Without this line, nginx will send to php-fpm immediately all requests ending by .php
        try_files $uri =404;
        include /etc/nginx/fastcgi.conf;
        fastcgi_pass unix:/run/php-fpm.socket;
        }
} 

Créez un fichier et mettez le code pour la sortie d'informations sur PHP dans ce fichier :

echo '<?php phpinfo(); ?>' > /var/calculate/www/localhost/htdocs/info.php

Modifier les droits d'accès pour tous les fichiers du dossier racine du site :

chown -R nginx:nginx /var/calculate/www/localhost/htdocs

Ajoutez l'entrée correspondante au DNS. En l'absence de DNS, vous pouvez ajouter l'entrée à la table statique des noms de l'ordinateur à partir duquel le site sera accessible.

Pour les systèmes basés sur Linux, modifiez la liste des noms de domaine :

/etc/hosts
192.168.0.1  www.example.org example.org 

Vérifiez que Nginx a été configuré correctement et relisez le fichier :

nginx -t && /etc/init.d/nginx reload

Exécutez PHP-FPM :

/etc/init.d/php-fpm start

Tapez http://example.org/info.php dans votre navigateur Web. Si tout va bien, vous verrez une page avec des informations complètes sur PHP.

Configurer le serveur mandataire inverse sur Nginx

Un proxy inverse est généralement considéré comme un serveur qui reçoit une requête d'un client, mais qui ne la traite pas de manière indépendante, mais l'envoie en tout ou en partie à d'autres serveurs (en amont). En d'autres termes, il ne redirige pas le client, mais envoie une requête de son propre chef et renvoie ensuite la réponse au client.

Configurons un proxy inverse, exemple.org~ communiquant avec un service HTTP interne via le port 8080~ :

/etc/nginx/sites-enables/example.org.conf
server {
  listen 80;
  server_name www.example.org example.org;
  access_log /var/log/nginx/proxy.log;

  location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Nginx-Proxy true;

    proxy_redirect off;
  }
} 

Ne pas traiter les sites qui n'ont pas de description

Il est possible que Nginx refuse les requêtes contenant un nom de domaine aléatoire. Si c'est le cas, demandez à Nginx d'envoyer une réponse négative et d'interrompre la connexion avec les sites qui n'ont pas de description :

/etc/nginx/sites-enabled/_noname.conf
server {
    listen  80 default_server;
    server_name _;
    access_log /var/log/nginx/noname_80.access_log main;
    return      444;
}
server {
    listen 443 ssl default_server;
    ssl_ciphers aNULL;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_session_tickets off;
    server_name _;
    access_log /var/log/nginx/noname_443.access_log main;
    return      444;
} 

Actualiser les paramètres de Nginx :

/etc/init.d/nginx reload