Créer un serveur Web Nginx + PHP7 + Maria DB (Mysql) + PhpMyAdmin sous Debian 9 Stretch

Voici un tutoriel vous permettant d’installer un serveur web NGINX avec la compagnie de PHP 7 ainsi qu’une base de données MariaDB (« MySQL ») sous Debian 9 Stretch.

Un hébergement mutualisé chez OVH peut vite devenir obsolète si vous recevez beaucoup de trafic sur votre site Internet. En effet, ces systèmes sont souvent programmés pour accueillir seulement une dizaine de connexions simultanées. Ce qui est embêtant si votre projet Internet prend de l’ampleur.

Pour ce tutoriel, je vais me servir d’un VPS que j’ai loué chez mon hébergeur Scaleway, une nouvelle filiale du groupe ONLINE (appartenant à Iliad, qui détient aussi la marque Free).

Pour information, j’ai choisi le VPS C1 à 2,99 €/mois HT avec 4 cœurs dédiés, 2 GB de RAM ainsi que 50 Go d’espace disque en SSD. Le tout sous Debian 9 Stretch.

Présentation des outils

Tout d’abord, une rapide présentation des outils que nous allons utiliser

  • NGINX est un logiciel libre de serveur Web particulièrement adapté pour les sites Internet avec des forts trafics. Contrairement à Apache, il est léger et rapide mais comporte moins de modules qu’Apache (cela tend à s’infirmer au cours des années). NGINX est utilisé par environ 20 % du total des domaines français enregistrés (https://www.udomo.fr/statistiques-sur-linternet-francais).

  • PHP, ou plutôt le packet php-fpm qui est l’interface pour communiquer avec le serveur NGINX et PHP.

  • MariaDB est un fork du célèbre système MySQL racheté par Oracle. C’est un logiciel complètement libre et de plus en plus de sociétés et sites Internet migrent vers MariaDB.

  • phpMyAdmin est une application web permettant de gérer les bases de données MySQL.

Préparatifs

Pour bien commencer ce tutoriel, vous devez avoir :

  • Un serveur dédié ou un VPS avec un accès SSH ;
  • Un peu de temps et de patience ;
  • Un café ;
  • Une machine à jour avec le sources.list de base (https://wiki.debian.org/fr/SourcesList)
apt-get update
apt-get upgrade
Mise à jour de la bête

Très bien nous allons pouvoir commencer !

Installation de NGINX

Nous allons tout d’abord installer NGINX sur notre machine

apt-get install nginx
Installation de NGINX : Valider l'installation par O ou Y

Pour vérifier que tout fonctionne, essayez d’ouvrir l’IP (port 80) de votre serveur dans votre navigateur internet. Vous devriez tomber sur cette page :

Rien de bien compliqué pour l’instant.

Rendez-vous dans le dossier/etc/nginx afin de comprendre le contenu de NGINX :

cd /etc/nginx
ls
Affichage du dossier NGINX

Nous allons nous intéresser aux dossiers sites-enabled et sites-available.

Le dossier sites-available permet d’ajouter des sites dans notre NGINX et le dossier sites-enabled à pour but de les lancer en production.

Ajouter un site sous NGINX

Nous allons donc créer notre « premier site » sous NGINX. À l’instar d’Apache, il faut déclarer les paramètres de notre site que nous voulons héberger dans un fichier. Nous allons tout d’abord nous rendre dans le dossier sites-available, supprimer le fichier de configuration par défaut et créer le nôtre.

cd /etc/nginx/sites-available
rm default
nano VOTRESITE
Création du fichier de configuration

Et copier le fichier ci-dessous en modifiant les lignes nécessaires :

server {
#Permet d'écouter sur le port 80 de l'IPv4 de votre serveur
       listen 80;
#Permet d'écouter sur le port 80 de l'IPv6 de votre serveur
       listen [::]:80;

#Vous devez renseigner le nom de domaine de votre site internet
       server_name moniste.fr;

#Défini le répertoire qui va accueillir les fichiers de votre site internet
       root /var/www/VOTRESITE;

#Permet de définir l'ordre d'exécution de votre index. Ici, s'il y a deux index.php/html à la racine du site, index.php sera exécuté en priorité
       index index.php index.html;

#Ici, on donne l'ordre d'afficher une page 404 sur la totalité du site si un fichier n'existe pas   
       location / {
         try_files $uri $uri/ =404;
     }
}
CTRL+X pour enregistrer et fermer

Avant de redémarrer NGINX, nous allons créer un lien ln -s permettant d’activer notre site en production dans le dossier sites-enabled.

ln -s /etc/nginx/sites-available/VOTRESITE /etc/nginx/sites-enabled/VOTRESITE

Le lien est correctement créé. Il nous reste à créer notre dossier qui accueillera les fichiers de notre site :

cd /var/www
mkdir VOTRESITE

On va créer un fichier index.php pour voir si notre configuration est fonctionnelle une fois NGINX redémarré :

cd VOTRESITE/
nano index.php

Dans cet index.php, mettez « test ok ».

On test notre configuration sur NGINX :

nginx -t

Si c’est ok, on redémarre :

service nginx restart

Retournez sur votre serveur à l’aide de votre navigateur internet, si vous tombez sur votre page index.php avec le contenu « test ok », c’est bon !

Notre serveur Web NGINX est installé, ça va, non ? 🙂

Nous allons par la suite installer PHP-FPM pour dynamiser tout notre site !

Installation de PHP-FPM (PHP 7.0)

Il est l’heure d’installer notre PHP-FPM !

apt-get install php-fpm
Installation de PHP-FPM : Valider l'installation par O ou Y

Rien de bien compliqué, jusqu’ici. Maintenant nous allons devoir relier le module PHP-FPM à NGINX pour qu’ils puissent fonctionner ensemble.

cd /etc/php/7.0/fpm/pool.d
nano www.conf
Le dossier 7.0 peut différer en fonction de la version

Rendez-vous à la ligne listen, est remplacé là comme ceci :

listen = 127.0.0.1:9000

PHP-FPM est configuré, nous allons nous rendre sur le fichier de configuration NGINX précédent pour ajouter de nouveaux paramètres :

cd /etc/nginx/sites-available
nano VOTRESITE

Il vous suffit d’ajouter ces lignes à la fin de votre fichier :

       location ~ \.php$ {
               try_files $uri =404;
                fastcgi_index index.php;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }

Grâce à ces lignes, NGINX sait qu’il doit interpréter TOUS les fichiers PHP avec le module PHP-FPM qui est disponible sur 127.0.0.1:9000.

On va maintenant redémarrer nos deux modules pour valider la configuration :

service php7.0-fpm restart
service nginx restart
php7.0 peut différer en fonction de la version

Pour vérifier que PHP fonctionne, nous allons modifier notre index.php en y ajoutant la célèbre fonction phpinfo();

cd /var/www/VOTRESITE
nano index.php

Vous ajoutez :

<?php
phpinfo();
?>

Rendez-vous sur l’adresse IP de votre navigateur et si vous voyez la configuration PHP de votre serveur tout est ok !

Nous avons donc maintenant notre NGINX couplé avec PHP-FPM, nous allons installer notre base de données !

Installation de MariaDB (« MySQL »)

On lance notre installation MariaDB…

apt-get install mariadb-server
Installation de MariaDB : Valider l'installation par O ou Y

Et on exécute le script de sécurisation du serveur en production :

mysql_secure_installation
Script de sécurisation

Quand il vous demande un mot de passe, vous en créez un, quand il vous pose des questions, vous répondez Y (pour yes)… même pas drôle !

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

# set root password
Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.
# remove anonymous users
Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

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

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

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

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

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

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
Entrez votre mot de passe (2x) et Y partout

Maintenant que notre MariaDB est correctement initialisé, nous allons créer un utilisateur ayant tous les privilèges, cela évite d’utiliser l’utilisateur « root ». Pour cela :

mysql -u root -p

Faites entrer et saisissez le mot de passe que vous avez préalablement créé.

Il vous reste à créer une base de données avec un utilisateur et un mot de passe avec tous les privilèges

CREATE DATABASE VOTREBASE;

GRANT ALL ON VOTREBASE.* TO [email protected] IDENTIFIED BY 'VOTREMDP';

exit
A saisir ligne par ligne

Voilà notre base de données est créée. Pour vérifier visuellement que tout fonctionne, nous allons installer phpMyAdmin.

Installation de phpMyAdmin

apt-get install phpmyadmin
Installation de phpMyAdmin : Valider l'installation par O ou Y

Une fois installé, nous allons créer un nouveau fichier de configuration de site sous NGINX pour permettre d’accéder à phpMyAdmin.

cd /etc/nginx/sites-available
nano phpmyadmin

Vous pouvez y insérer la configuration suivante :

server {
#J'utilise le port 8080 pour bien séparer le site internet de l'interface phpMyAdmin
       listen 8080;
       listen [::]:8080;

       server_name VOTRESITE;

       root /usr/share/phpmyadmin;
       index index.php index.html;

       location / {
               try_files $uri $uri/ =404;
       }
       location ~ \.php$ {
                try_files $uri =404;
                fastcgi_index index.php;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }
}

On oublie pas de mettre le site en production :

ln -s /etc/nginx/sites-available/phpmyadmin /etc/nginx/sites-enabled/phpmyadmin

On redémarre le tout :

service mysql restart
service nginx restart

Vous pouvez accéder à phpMyAdmin depuis votre navigateur sous la forme suivante :

VOTRE.IP:8080

Voilà votre serveur web est fonctionnel ! Un bon petit tutoriel pour commencer la création d’un serveur web. Je ferai un article prochainement pour sécuriser sa machine ainsi que NGINX et PHP.

N’hésitez pas à poster un commentaire ci-dessous, si vous avez des questions ou problèmes !

A très vite !

  • Kilian Dabard

    J’adore !

  • Pingback: Installer Debian Server – Stretch (Debian 9) – Computer Vision()

  • http://www.maximelafarie.com/ Maxime Lafarie

    Super article, très utile ! Merci beaucoup à toi !

  • John Farell

    bonsoir
    c’est un super tuto, mais tous fonctionne bien après avoir installer nginx puis au moment de mettre sa propre page « index.php » avec le contenu « test ok » tu vas bien je test nginx avec la commande « nginx -t » aucune erreur je relance nginx et la ben j’ai pas la page index.php avec marquer « test ok » j’ai toujours la page « welcome to nginx » mais il me télécharge la page avec le texte . surprenant non ???

    Pourrai-je avoir un petit peu d’aide ? merci

    • https://beauvais.me/ Quentin Beauvais

      Bonjour John !
      Si tu renommes ton fichier en « index.html », as-tu le même problème ?

      Tiens moi au jus 😉

    • https://beauvais.me/ Quentin Beauvais

      Bonjour John !
      Merci pour ton commentaire !
      As-tu essayé de renommer ton fichier en index.html ? Si cela fonctionne, installe php-fpm puis renomme le en index.php avec le phpinfo();

      Tiens moi au courant !

      • John Farell

        bonjour
        merci pour toute vos réponses.
        je crois que la boulette viens de moi dans mon fichier default.conf je marqué pas la bonne adresse de la redirection de mon site du coup il ne trouver pas mon site. MDR. puis j’ai renommé le fichier default.conf en MONSITE.conf, la au moins il vas directement au bon dossier /var/www/MONSITE.

        erreur de ma part.

        en espérant que cela en aideras plus d’un aussi, NE pas faire les même que moi MDR.

        sinon mon fichier index était bien en index.php
        mais l’erreur n’était pas la.

        cordialement

    • BobRegMan

      Bonjour a tous

      Exactement le même problème même après l’installation de php-fpm et en essayant les deux solution html et php.

      Hors sujet :
      Beaucoup de tuto laisse au niveau du listen = quel est la différence entre les deux version ?

      Merci d’avance pour ton aide

    • BobRegMan

      j’avais le même problème que toi mais je suis reparti d’une installation neuve et ça marche bizarre.

  • Théauld Debureau

    Il vous suffit d’ajouter ces lignes à la fin de votre fichier :
    « location ~ .php$ { » etc
    ll faut tout de même que cela reste dans les accolades de server pour que cela puisse fonctionner chez moi