Serveur LEMP CentOS 7 (Nginx, MariaDB10.4, PHP7.3)

Nous allons voir dans cet article comment installer et configurer le serveur web NGINX sous CentOS 7. NGINX (pronocé Engine X) est une alternative à Apache et est considéré comme l’un des serveurs web le plus populaire au monde. Contrairement à Apache, NGINX consomme moins de ressources et plus rapide.

Serveur LEMP Stack : Linux, Nginx, MySQL/MariaDB, PHP
Serveur LAMP Stack : Linux, Apache, MySQL/MariaDB, PHP  voir l’article

Ce qu’il vous faut :

  • Machine virtuelle CentOS 7 :machine-virtuelle-centos-7/
  • Par défaut, après l’installation de CentOS 7, le firewall et le SELinux sont activés. Ne pas les désactiver.
    • Configuration RéseauInstall LEMP Server
    • Installation Tools
    • Activer SELinux
    • Activer le Firewall
    • Installer les VMtools
    • Changer le Hostname

[root@pixelabs ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@pixelabs ~]#

Installation MariaDB 10.4

Commençons par l’installation d’un serveur de base de données. J’ai opté pour MariaDB. N’oubliez pas d’ajouter EPEL Release et de mettre à jour votre système. 

Ajouter la repo pour MariaDB 10.4

[root@pixelabs ~]# nano /etc/yum.repos.d/mariadb.repo
[mariadb] 
name = MariaDB 
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB 
gpgcheck=1

Enregistrer et quitter : Ctrl + o + Enter et Ctrl + x

[root@pixelabs ~]# yum makecache fast

Lancer l’installation :

[root@pixelabs ~]# yum install -y MariaDB-server MariaDB-client

Une fois les dépendances résolues, répondre : Y 

Une fois terminé, démarrer MariaDB :

[root@pixelabs ~]# systemctl start mariadb
[root@pixelabs ~]# systemctl enable mariadb
[root@pixelabs ~]# systemctl status mariadb

Start MariaDB Server

A la racine de votre serveur, lancer le script suivant pour sécuriser MariaDB : mysql_secure_installation

  • Enter current password for root (enter for none): Entrée

Secure MariaDB Server

  • Ajouter un mot de passe et Entrée.
  • Si vous avez des erreurs de ce type :
ERROR 1146 (42S02) at line 1: Table 'mysql.global_priv' doesn't exist
Failed!
Cleaning up...

[ERROR] Missing system table mysql.roles_mapp...te it
[ERROR] Incorrect definition of table mysql.e...'POST
[ERROR] mysqld: Event Scheduler: An error occ...uler.
[Warning] Failed to load slave replication st...exist

Lancer la commande suivante :

[root@pixelabs ~]# mysql_upgrade -u root --force

Relancer le script : mysql_secure_installation

  • Répondre « Y » pour le reste.
Remove anonymous users? [Y/n]# y
 ... Success!

Disallow root login remotely? [Y/n]# y
 ... Success!

Remove test database and access to it? [Y/n]# y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reload privilege tables now? [Y/n]# y
 ... Success!

Thanks for using MariaDB!

Tester en se connectant à la base de données :Check MariaDB Version

Installation PHP7.3 FPM

Passons à l’installation de PHP. Nous allons installer la version PHP7.3 depuis le dépôt Remi.

[root@pixelabs ~]# yum install yum-utils -y

Ajouter le dépôt :

[root@pixelabs ~]# yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

Activer la repo pour PHP7.3

[root@pixelabs ~]# yum-config-manager --enable remi-php73
Modules complémentaires chargés : fastestmirror
=================== repo: remi-php73 ===========================
[remi-php73]
async = True
bandwidth = 0
base_persistdir = /var/lib/yum/repos/x86_64/7
baseurl =
cache = 0
cachedir = /var/cache/yum/x86_64/7/remi-php73
check_config_file_age = True
compare_providers_priority = 80
cost = 1000
deltarpm_metadata_percentage = 100
deltarpm_percentage =
enabled = 1
enablegroups = True
...
...

Lancer l’installation de PHP et les modules :

[root@pixelabs ~]# yum install php php-cli php-fpm php-mysqlnd php-zip php-opcache php-xml php-xmlrpc php-gd php-mbstring php-json php-curl php-devel php-mcrypt php-pear php-bcmath

Installation PHP 7.3 CentOS 7

Afficher la version, activer et démarrer PHP-FPM :

[root@pixelabs ~]# php -v
[root@pixelabs ~]# systemctl enable php-fpm
[root@pixelabs ~]# systemctl start php-fpm
[root@pixelabs ~]# systemctl status php-fpm

Check PHP FPM Version

Installation NGINX Server

Pour finir notre serveur LEMP Stack, nous allons installer Nginx.

Ajouter le dépôt Nginx :

[root@pixelabs ~]# nano /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

Enregistrer et quitter : Ctrl + o + Enter et Ctrl + x

[root@pixelabs ~]# yum makecache fast

Lancer l’installation de Nginx :

[root@pixelabs ~]# yum install nginx

Installation NGINX 1.15 CentOS 7

tout ça pour 2 Mo… comme quoi, c’est une petite bête 🙂

Activer, Lancer Nginx :

[root@pixelabs ~]# systemctl enable nginx
[root@pixelabs ~]# systemctl start nginx
[root@pixelabs ~]# systemctl status nginx

Start Nginx Server

Pour afficher la version :

[root@pixelabs ~]# nginx -v
nginx version: nginx/1.15.10
[root@pixelabs ~]#

Notre serveur LEMP Stack est installé. Nous allons maintenant passer à la configuration.

Configuration PHP-FPM

PHP est configuré par défaut pour fonctionner avec l’utilisateur/groupe apache/apache, mais comme nous avons installé Nginx, cet utilisateur doit donc correspondre à l’utilisateur et au groupe utilisé par Nginx. C’est à dire nginx/nginx.

Editer le fichier suivant :

[root@pixelabs ~]# nano /etc/php-fpm.d/www.conf

Remplacer les paramètres suivant :

user = apache
; RPM: Keep a group allowed to write in log dir.
group = apache
...
...
listen = 127.0.0.1:9000

Par :

user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
...
...
listen = /var/run/php-fpm/php-fpm.sock

Configuration PHP-FPM for Nginx

Et juste un peu plus bas, décommenter et modifier également ces 3 lignes :

listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Pour finir avec ce fichier, décommenter ces deux lignes :

Astuce : avec l’éditeur nano, effectuer une recherche avec CTRL+ W, taper le mot clé pm.status et entrer.

pm.status_path = /status
ping.path = /ping

Ces deux paramètres vont nous permettre de vérifier le PHP-FPM via la navigateur.

PHP-FPM Monitoring Nginx

Pour plus de sécurité, éditer le fichier suivant :

[root@pixelabs ~]# nano /etc/php.ini

Modifier la ligne suivante :

;cgi.fix_pathinfo=1
en :
cgi.fix_pathinfo=0

Remarque : l’activation de ce paramètre permet à PHP de n’accepter que les URI qui existent réellement sur le serveur. Source : nginx.com/…/tutorials/config_…#passing-uncontrolled-requests-to-php

Vérifier la syntaxe et relancer le PHP :

[root@pixelabs ~]# php-fpm -t
[04-Apr-2019 19:05:12] NOTICE: configuration file /etc/php-fpm.conf test is successful

[root@pixelabs ~]# systemctl restart php-fpm

Autoriser HTTP/HTTPS

Nous avons laissé le firewall activé. Il faut donc autoriser le trafic HTTP/80 et HTTPS/443

[root@pixelabs ~]# systemctl status firewalld
[root@pixelabs ~]# firewall-cmd --zone=public --permanent --add-service=http
[root@pixelabs ~]# firewall-cmd --zone=public --permanent --add-service=https
[root@pixelabs ~]# firewall-cmd --reload

Allow HTTPS Firewalld

Vous pouvez maintenant vérifier le bon fonctionnement du serveur NGINX depuis votre navigateur :

Welcone to Nginx

La configuration de base est terminée. Nous allons maintenant configurer un hôte virtuel (site web) sous Nginx.

Ajouter un hôte virtuel

Nous allons copier et sauvegarder le fichier de configuration par défaut afin de revenir en arrière en cas de besoin.

[root@pixelabs ~]# cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/pixelabs.conf.old
[root@pixelabs ~]# mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/pixelabs.conf

Editer le fichier pixelabs.conf :

Rmarque : la définition correctement des blocs serveur est expliqué ici : #root-inside-location-block

Voici un exemple de configuration pour installer le CMS WordPress. Il manque bien sûr des paramètres pour la sécurité et l’optimisation, mais ce n’est qu’un test.

Adaptez par rapport à votre configuration :

server {
    listen         80;
    server_name    pixelabs.net www.pixelabs.net;
    root          /usr/share/nginx/html/pixelabs.net;
    index          index.php index.html index.htm;
    location / {
      try_files $uri $uri/ /index.php?$args;
    }

    error_page  404              /404.html;
    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
    
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires max;
        log_not_found off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    
    location ~ /\.ht {
        deny all;
    }
  location ~ ^/(status|ping)$ {
        allow 172.16.1.12;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
  }
}
  • Ligne 3 : si vous n’avez pas de serveur DNS, mettez directement l’adresse IP de votre serveur.
  • Ligne 39 : normalement c’est localhost (127.0.0.1), mais comme je suis en SSH (depuis une VM Windows 10 sur le même réseau), j’ai dû mettre l’adresse IP du serveur pour tester le PHP-FPM.

Il manque deux blocs serveur dans ce fichier :

  • HTTPS pour www.pixelabs.net
  • HTTPS pour pixelabs.net

Sans un certificat valide ce n’est pas la peine…

Vérifier la syntaxe de votre configuration :

[root@pixelabs ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@pixelabs ~]#

Si tout va bien, recharger la configuration NGINX :

[root@pixelabs ~]# systemctl reload nginx

Tester le FPM depuis votre navigateur : http://172.16.1.12/status

FPM Status Nginx

En cas de problème voir les logs :

[root@pixelabs ~]# tail -f /var/log/nginx/access.log

Ctrl+c pour arrêter.

Installation de WordPress

Télécharger WordPress et uploader le dossier dans le répertoire suivant : /usr/share/nginx/html/pixelabs.net

[root@pixelabs ~]# cd /usr/share/nginx/html/
[root@pixelabs html]# mkdir pixelabs.net
[root@pixelabs html]# wget https://fr.wordpress.org/latest-fr_FR.tar.gz
[root@pixelabs html]# tar xvf latest-fr_FR.tar.gz
[root@pixelabs html]# cd wordpress
[root@pixelabs wordpress]# mv * /usr/share/nginx/html/pixelabs.net/

Modifier les permissions :

[root@pixelabs ~]# chown -R nginx:nginx /usr/share/nginx/html/pixelabs.net
[root@pixelabs ~]# sudo chmod -R 755 /usr/share/nginx/html/pixelabs.net

Création de la base de données pour WordPress :

[root@pixelabs ~]# mysql -u root -p

MariaDB [(none)]> CREATE DATABASE wpdb;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]>
MariaDB [(none)]> GRANT ALL ON wpdb.* TO 'wpuser'@'localhost' IDENTIFIED BY 'wppassword';
Query OK, 0 rows affected (0.045 sec)

MariaDB [(none)]>
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]>
MariaDB [(none)]> exit
Bye

WordPress Database MariaDB

Allez dans votre navigateur pour lancer l’installation : http://172.16.1.12

Installation WordPress Nginx CentOS

Installation WordPress Database

Remarque : si WordPress n’arrive pas à créer le fichier de configuration, il va la générer. Il suffit de copier la conf générée et la coller dans le fichier wp-config.php.

Exemple :

[root@pixelabs pixelabs.net]# cp wp-config-sample.php wp-config.php
[root@pixelabs pixelabs.net]# nano wp-config.php 
//Effacer le contenu de ce fichier et remplacez par les données générées par WordPress.

WordPress Nginx

WordPress Install Nginx

LEMP Server WordPress

C’est terminé les amis. Vous venez d’installer le serveur LEMP Stack sous Sentos 7 et WordPress avec. La configuration des hôtes virtuels dépend de ce que vous voulez mettre en place sur votre serveur. Pour un CMS comme WordPress par exemple, la configuration doit se faire via Nginx/php/htaccess et la liste est longue :

  • Forcer le SSL/HTTPS
  • Sécuriser le .htaccess
  • Activer la compression gzip
  • Activer l’URL Rewriting
  • Activer la mise en cache
  • Expire headers
  • Protéger l’accès à certains fichiers
  • Redirection des URLs (301,302…etc)
  • …etc.

Bonne journée et à bientôt.

1 Response

  1. sysadmin dit :

    Mise à jour de l’article.

    ERROR 1146 (42S02) at line 1: Table 'mysql.global_priv' doesn't exist
    Failed!
    Cleaning up...
    
    [ERROR] Missing system table mysql.roles_mapp...te it
    [ERROR] Incorrect definition of table mysql.e...'POST
    [ERROR] mysqld: Event Scheduler: An error occ...uler.
    [Warning] Failed to load slave replication st...exist

    to fix, run :

    mysql_upgrade -u root --force

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *