Ubuntu : installer un serveur Web – NGINX / PHP / MariaDB

Dans ce tutoriel, nous allons voir comment installer et configurer un serveur sous Ubuntu avec les composants suivants :

  • Nginx
  • PHP
  • MariaDB

Je vais aussi vous expliquer comment mettre phpmyadmin pour administrer le serveur MariaDB et comment configurer des vhosts.

Dans ce tuto, nous n’allons pas utiliser les dépôts officiels de la distribution, mais les dépôts des différents composants afin d’installer les dernières versions.


Cours : Configurer un serveur pour héberger des sites Internet

Un cours complet est disponible sur les serveurs Web avec Ubuntu si vous souhaitez en savoir plus.


Prérequis

Avoir un serveur Ubuntu fraichement installer et à jour avec un accès en root ou sudo et un accès à Internet.

Installation des différents composants

Dans cette partie, nous allons installer les différents composants du serveur Web et vérifier leur bon fonctionnement

Installer Nginx

Avant de faire l’installer, nous allons ajouter le dépôt office Nginx.

Entrer la commande suivante pour créer un fichier list où l’on va renseigner les url.

sudo nano /etc/apt/sources.list.d/nginx.list

Dans l’éditeur nano, entrer les lignes ci-dessous qui sont la configuration du depot :

deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx

Appuyer sur les touches du clavier Crtl+X et enregistrer les modifications.

Il faut adapter les sources du dépôt à la version d’Ubuntu, dans le tutoriel je suis sur la version 18.04.X , j’utilise donc bionic.

Ajouter les signatures du depot à l’aide des commandes ci-après :

wget http://nginx.org/keys/nginx_signing.key 
sudo apt-key add nginx_signing.key

Actualiser les paquets avec la commande :

sudo apt update

Sur la capture ci-dessous, on peut voir que le dépôt nginx a été interrogé :

Installer nginx avec la commande suivante :

sudo apt install nginx -y

L’option -y permet de ne pas avoir de demande de confirmation pour l’installation

Nginx est maintenant installé, nous allons maintenant faire quelques vérifications, configuration et voir quelques commandes avant de passer à l’installation de PHP.

Vérifier la configuration de nginx :

sudo nginx -t

Cette commande est très utile, notamment quand on fait un changement de configuration, elle permet de vérifier que celui-ci est bonne avant de la recharger.

Démarrer le service nginx :

sudo systemctl start nginx

Si tout se passe bien la commande retourne rien

Configurer le démarrage automatique du service :

sudo systemctl enable nginx
sudo systemctl enable nginx

Vérifier le service nginx :

systemctl status nginx
systemctl status nginx

Cette commande permet de vérifier l’état du service et depuis quand celui-ci est en fonctionnement.

Afficher la version de nginx

nginx -v

Configurer l’utilisateur nginx

Cette étape de la configuration est importante, surtout si vous souhaitez utiliser php (php-fpm) sur le serveur web.

Lors de l’installation de nginx par le dépôt officiel, le service est configuré pour être exécuté avec l’utilisateur nginx et php l’utilisateur www-data. Il est nécessaire de modifier la configuration nginx pour utiliser le même utilisateur que php.

Éditer le fichier /etc/nginx/nginx.conf :

sudo nano /etc/nginx/nginx.conf

Rechercher :

user nginx;

Remplacer par :

user www-data;

Sauvegarder le fichier de config.

Recharger la configuration :

sudo systemctl reload nginx

Tester le serveur Nginx

Depuis un ordinateur, ouvrir un navigateur Internet et entrer l’adresse IP ou le nom de la machine et vérifier que la page Welcome to nginx ! s’affiche.

Installer PHP

Maintenant que le serveur Web est en place, nous allons passer à l’installation de PHP, comme pour nginx, nous allons ajouter le dépôt ppa:ondrej/php qui permet d’avoir les dernières versions de PHP et d’avoir plusieurs versions simultanément.

Dans ce tutoriel, nous allons installer la version 7.3 et 7.4 de PHP et nous verrons comment par la suite configurer un vhost pour utiliser une version précise de PHP.

Ajouter le dépôt

Entrer les commandes suivantes :

sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php

Une confirmation est nécessaire lors de l’exécution de la commande : sudo add-apt-repository ppa:ondrej/php

Actualiser les paquets à l’aide de la commande :

sudo apt update

Afficher les versions de PHP disponible

Entrer la commande apt install php7. et faire une tabulation.

On peut voir l’ensemble des paquets PHP disponibles sur le dépôt.

Installer une version de PHP

Pour une installation sur nginx, il ne faut surtout pas entrer la commande sudo apt install php7.X car cette commande va installer des dépendances dont apache2.

Pour utiliser PHP avec NGINX, il faut installer PHP en mode FPM.

Pour installer PHP entrer la commande suivante (adapter en fonction de la version souhaitée) :

sudo apt install php7.x-fpm php7.x-mysql php7.x-opcache -y

Une fois l’installation terminée entrer la commande ci-après pour tester le bon fonctionnement :

php -v

PHP en mode FPM, fonctionne comme un service, il est possible de vérifier son état à l’aide de la commande ci-dessous en adaptant la version de php installée :

systemctl status php7.x-fpm
systemclt status php7.3-fpm

Pour installer une autre version de PHP simultanément, il suffit de répéter l ‘opération en changement la commande avec la version souhaitée.

Configurer NGINX et PHP

Maintenant nous allons configurer nginx pour utiliser PHP et tester le bon fonctionnement.

Éditer le fichier vhost par défaut :

sudo nano /etc/nginx/conf.d/default.conf

Ajouter avant } final les lignes suivantes en adaptant à la version de PHP de disponible :

location ~ \.php$ { 
     root /usr/share/nginx/html;
     fastcgi_index index.php;
     fastcgi_pass unix:/run/php/php7.3-fpm.sock; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     include fastcgi_params;
}

Vérifier la config à l’aide de la commande : sudo nginx -t

Recharger la config : sudo systemctl reload nginx

Pour tester le fonctionnement de php, on va créer un fichier phpinfo.php :

sudo nano /usr/share/nginx/html/phpinfo.php

Entrer le code PHP ci-dessous :

<?php
phpinfo();
?>

Enregistrer le fichier.

Depuis un navigateur Internet, appeler la page http://ip_server/phpinfo.php

Si la page phpinfo.php c’est tout est bon.

Installer MariaDB

Notre serveur Web est presque complet, il reste maintenant l’installation de MariaDB pour avoir une base de données.

Ajouter le dépot

Une fois de plus, il faut ajouter le dépôt afin d’avoir la dernière version. Aller sur l’url suivante : Download MariaDB Server – MariaDB.org et sélectionner la distribution et la version de MariaDB afin d’avoir l’url des sources.

Entrer les commandes ci-après pour ajouter le dépôt :

sudo apt-get install software-properties-common 
sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc' 
sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] https://ftp.igh.cnrs.fr/pub/mariadb/repo/10.5/ubuntu bionic main'

Mettre à jour la liste des paquets avec la commande :

sudo apt update

Installation MariaDB

Comme pour PHP entrer la commande apt install mariadb– + tabulation pour afficher les paquets disponibles.

Pour l’exemple, nous allons installer la version 10.5, entrer la commande ci-dessous pour effectuer l’installation :

sudo apt install mariadb-server-10.5 -y

Une fois l’installation terminée, entrer la commande ci-après pour vérifier le bon fonctionnement du serveur MariaDB :

sudo systemctl status mariadb

Création d’un compte d’administration

Par défaut, le compte root n’a pas de mot de passe et n’est accessible que par la console, pour éviter de modifier ce compte, on va créer un compte d’administration que l’on pourra utiliser avec d’autre outil comme phpmyadmin.

Entrer la commande suivante pour passer en mode mysql

sudo mysql

Entrer les lignes (requêtes) ci-après pour créer un compte adminsql, changer le mot de passe avant de passer les commandes.

CREATE USER 'adminsql'@'%' IDENTIFIED BY 'azerty';
GRANT ALL PRIVILEGES ON *.* TO 'adminsql'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;

Installer PHPMYADMIN

Cette étape est facultative, l’installation phpmyadmin permet d’administrer MariaDB.

Afin de ma facilité le travail, j’ai utilisé WinSCP pour le transfert sur le serveur en SSH.

Télécharger la dernière version de phpmyadmin.

Décompresser l’archive.

Sur le serveur Web créer un dossier pma à l’emplacement du vhost par défaut : /usr/share/nginx/html

Envoyer le contenu de l’archive dans le dossier pma :

Depuis un navigateur aller à l’adresse : http://ip_server/pma/index.php

Entrer les informations du compte créé précédemment (adminsql / le mot de passe) et cliquer sur Exécuter pour vous connectez.

Vous pouvez administrer le serveur MariaDB avec une interface Web.

Configurer des vhosts

Maintenant que le serveur Web est prêt, nous allons voir comment configurer des vhost également appelé virtual host qui permet d’héberger plusieurs sites sur un même serveur.

Pour le tutoriel, je vais créer deux vhost (site-a.lab.priv et site-b.lab.priv) qui vont tous les deux utiliser une version de php différente, le site-a sera sous php7.3 et le site-b sera avec php7.4

Au préalable j’ai créé les deux enregistrements DNS et il pointe sur le serveur

Avant de commencer, il faut créer les différents dossiers, dans le dossier /home je vais créer un dossier www-data et ensuite dans ce dossier je vais créer les sous dossiers des sites, site-a et site-b qui auront chacun deux sous-dossiers log et public_html.

sudo mkdir /home/www-data
sudo mkdir /home/www-data/site-a
sudo mkdir /home/www-data/site-a/log
sudo mkdir /home/www-data/site-a/public_html
sudo mkdir /home/www-data/site-b
sudo mkdir /home/www-data/site-b/log
sudo mkdir /home/www-data/site-b/public_html
sudo chown www-data /home/www-data -R

Maintenant que les dossiers sont prêts, nous allons passer au fichiers de configuration. Afin d’avoir un fonctionnement similaire à Apache, nous allons créer deux dossiers dans le dossier /etc/nginx.

  • sites-available : qui va contenir les fichiers de config des virtual host
  • sites-enabled : qui va contenir des liens symboliques vers les fichiers de configuration des virtual host qui seront actif.

Créer les dossiers avec les commandes suivantes :

sudo mkdir /etc/nginx/sites-available
sudo mkdir /etc/nginx/sites-enabled

Il faut maintenant modifier le fichier de configuration nginx pour lui indiquer de charger les fichiers de configuration qui seront dans le dossier site-enabled.

sudo nano /etc/nginx/nginx.conf

Rechercher :

include /etc/nginx/conf.d/*.conf;

Ajouter après :

include /etc/nginx/sites-enabled/*;

Sauvegarde le fichier de configuration.

Tester la config nginx :

sudo nginx -t

Recharger la configuration :

sudo systemctl reload nginx

On passe à la configuration du virtual host pour le site-a, on va utiliser le fichier par défaut comme base, on va copier le fichier default.conf dans le dossier site-available en le renommant site-a.conf

sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/sites-available/site-a.conf

Il faut maintenant modifier le fichier pour le faire correspondre à la configuration du site.

nano /etc/nginx/sites-available/site-a.conf

Ci-après le fichier de config :

server {
    listen       80;
    server_name  site-a.lab.priv;

    #charset koi8-r;
    access_log  /home/www-data/site-a/log/access.log  main;

    location / {
        root   /home/www-data/site-a/public_html;
        index  index.php index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}

    location ~ \.php$ {
        root           /home/www-data/site-a/public_html;
        #try_files      $uri =404;
        fastcgi_index  index.php;
        fastcgi_pass   unix:/run/php/php7.3-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;    
   }
}

Lignes modifiées :

Ligne 3 (server_name) : indiquer l’url
Ligne 6 : emplacement des logs
Ligne 9 : répertoire racine du site
Ligne 10 : ajout de index.php
Ligne 46 : répertoire racine du site

Il faut maintenant activer le site avec lien symbolique :

sudo ln -s /etc/nginx/sites-available/site-a.conf /etc/nginx/sites-enabled/

Tester la config nginx

sudo nginx -t

Recharger la config

sudo systemctl reload nginx

Pour tester le bon fonctionnement j’ai ajouté un fichier index.php dans le dossier public_html du site avec le code suivant :

<?php
echo "site a";
phpinfo();
?>

Depuis un navigateur entrer l’url du site :

Pour le site-b, j’ai reproduit la même configuration en modifiant le server_name, les emplacements et la configuration de php pour utiliser php7.4.

le fichier de config :

server {
    listen       80;
    server_name  site-b.lab.priv;

    #charset koi8-r;
    access_log  /home/www-data/site-b/log/access.log  main;

    location / {
        root   /home/www-data/site-b/public_html;
        index  index.php index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}

    location ~ \.php$ {
        root           /home/www-data/site-b/public_html;
        #try_files      $uri =404;
        fastcgi_index  index.php;
        fastcgi_pass   unix:/run/php/php7.4-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;    
   }
}

Voici le résultat :

Automatiser le déploiement avec Ansible

Vous souhaitez gagner du temps et automatiser le déploiement de votre serveur Web (Nginx, PHP, Mariadb) avec Ansible.

Un playbook reprenant l’installation des différents service est disponible ici :

Conclusion

Le tutoriel s’arrête ici, vous savez maintenant comment installer et configurer un serveur Web avec Nginx / PHP / MariaDB avec Ubuntu en utilisant des versions de PHP différentes et des virtuals hosts.

D’autre tutoriel vont arriver comme l’installation de WordPress et GLPI sur un serveur Web NGINX.



Start the discussion at community.rdr-it.io