RHEL et dérivées : Installer et utiliser NGINX

nginx
Cet article a été vérifié avec RedHat Enterprise Linux, CentOS et Alma Linux



Introduction



Nginx est un serveur HTTP, c'est le deuxième plus utilisé sur le web avec Apache.
Attention, si vous installez un serveur Web, les ports 80 (HTTP) et 443 (HTTPS) sont utilisés. Donc attention à ne pas installer apache et ngnix en même temps.

Prérequis



Sur Enterprise Linux 7, nginx se trouve dans les dépôts epel, ce dépôt doit être installé.

Installation



Dans Enterprise Linux 7, on procedera à l'installation via :

Code BASH :
yum install nginx


Dans Enterprise Linux 8, on utilisera :

Code BASH :
dnf install nginx


Dans Enterprise Linux 8, on pourra utiliser une version plus récente avec les modules :
Pour lister les versions :
Code BASH :
dnf module list nginx


Et pour installer une version spécifique (exemple version 1.18) :
Code BASH :
dnf module install nginx:1.18


On démarre le service et on l'active ensuite au démarrage :
Code BASH :
systemctl enable --now nginx


On autorise dans le pare-feu le protocole http (ici si la zone de l'interface est public) :

Code BASH :
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload


A ce stade, on peut tester d'afficher la page web en http par défaut pour vérifier que tout fonctionne.

Configuration de base



Les fichiers de configuration se trouvent dans /etc/nginx.
Le fichier de configuration central est nginx.conf :

Code BASH :
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        location / {
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }
}
 


On remarque que la partie HTTPS est commentée par défaut.

On peut ajouter des fichiers de configuration personnalisés dans conf.d. Par exemple, on créé un fichier avec l'extension .conf.

Exemple avec /etc/nginx/conf.d/linuxtricks.conf
Code BASH :
server_tokens off;
server_names_hash_max_size 512;
server_names_hash_bucket_size 128;
server_name_in_redirect off;


La documentation sur les différentes directives sont sur https://nginx.org/en/docs/ Chapitre modules references

Après chaque modifications, il est nécessaire de recharger le service nginx.
A noter que nginx dispose d'une option permettant de vérifier la cohérence du fichier de config :

Code BASH :
nginx -t -c /etc/nginx/nginx.conf


Si les tests sont OK :

Code :
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful


On peut recharger nginx :

Code BASH :
systemctl reload nginx


Nginx et PHP



Dans la plupart des distributions Linux, PHP installe en dépendance apache.
Dans le contexte nginx, on va utiliser PHP-FPM.

EL 7 :
Code BASH :
yum install php-fpm


EL 8 :
Code BASH :
dnf install php-fpm


Bien sûr, tous les modules php-* nécessaires sont installables, par exemple :

EL 7 :
Code BASH :
yum install php-mysql php-pdo php-gd


EL 8 :
Code BASH :
dnf install php-mysql php-pdo php-gd



Dans le fichier nginx.conf changer

Code :
location / {
}


par

Code :
location / {
root   /usr/share/nginx/html;
index index.php  index.html index.htm;
}


Et ajouter les informations suivantes pour traiter les requêtes des pages PHP :
Code :
 location ~ \.php$ {
    root           /usr/share/nginx/html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    include        fastcgi_params;
}


On édite ensuite la config de php-fpm pour indiquer nginx comme utilisateur :
Code BASH :
vi /etc/php-fpm.d/www.conf


Code :
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx


On démarre le service et on l'active ensuite au démarrage :

Code BASH :
systemctl enable --now php-fpm


Ngnix et HTTPS



Pour la génération des certificats, se reporter à l'article : https://www.linuxtricks.fr/wiki/openssl-creation-de-certificats-et-ca-autosignes

On décommentera ensuite la section qui écoute sur https, et on renseignera nos certificats :

Code TEXT :
    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        ssl_certificate "/etc/ssl/nginx/srvwww.linuxtricks.lan.crt";
        ssl_certificate_key "/etc/ssl/nginx/srvwww.linuxtricks.lan.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers PROFILE=SYSTEM;
        ssl_prefer_server_ciphers on;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        location / {
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }


NGINX et les Virtualhosts



Prenons un exemple simple, la machine répond aux noms :
vhost155-1.linuxtricks.lan
vhost155-2.linuxtricks.lan

La création de virtualhosts résulte dans le fait de créer autant de server block avec la valeur server_name :

Plaçons nos vhosts dans /etc/nginx/conf.d/vhost.conf :

Code BASH :
vi /etc/nginx/conf.d/vhost.conf


Code TEXT :
server {
    listen       80;
    server_name  vhost155-1.linuxtricks.lan;
 
    location / {
        root   /var/www/vhost155-1/;
        index  index.html index.htm;
    }
}
server {
    listen       80;
    server_name  vhost155-2.linuxtricks.lan;
 
    location / {
        root   /var/www/vhost155-2/;
        index  index.html index.htm;
    }
}
 


On redémarre le service nginx et c'est en place !

NGINX et redirection HTTP vers HTTPS



Je reprends un exemple avec mon virtualhost HTTP vhost155-2.linuxtricks.lan :

Code TEXT :
server {
    listen       80;
    server_name  vhost155-2.linuxtricks.lan;
 
    location / {
        root   /var/www/vhost155-2/;
        index  index.html index.htm;
    }
}


Et son bloc associé HTTPS :

Code TEXT :
server {
    listen       443 ssl http2;
 
    server_name  vhost155-2.linuxtricks.lan;
    ssl_certificate "/etc/ssl/nginx/vhost155-2.linuxtricks.lan.crt";
    ssl_certificate_key "/etc/ssl/nginx/vhost155-2.linuxtricks.lan.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers PROFILE=SYSTEM;
    ssl_prefer_server_ciphers on;
 
    location / {
        root   /var/www/vhost155-2/;
        index  index.html index.htm;
    }
}
 


Pour faire une redirection du HTTP vers HTTPS, on va modifier le bloc HTTP en indiquant juste un return 301 comme ceci :

Code TEXT :
server {
    listen       80;
    server_name  vhost155-2.linuxtricks.lan;
 
    return 301 https://$server_name$request_uri;
}