Comment installer Nginx avec mysql et PHP7-FPM sur Debian

Je vais revenir durant cet article sur l’installation d’une debian 8 (Jessie) avec Nginx, PHP7-FPM et MySQL. Ceci ayant pour but de faire tourner dans un premier temps mon blog. Cela sert aussi de base pour des tests pour un déploiement sur un serveur avec plusieurs sites.

On va aborder notamment la configuration de « vhost », et bien entendu quelque aspect de la sécurité. Pour une installation sécurisée complète, je vous prépare un livre blanc sur le sujet et des articles par composant pour que cela soit plus digeste pour vous.

Les ingrédients de la recette !

De quoi avons-nous donc besoin ?

  • 1 serveur (dans mon cas un VPS-Cloud d’OVH)
  • 1 debian 8 (jessie) pré-installé
  • 1 logiciel pour se connecter en SSH (putty pour windows, Linux et Mac notre bon vieux terminal)
  • d’un bon tutoriel
  • une bonne tasse de café et de quoi grignoter

Ce que l’on va installer et pourquoi :

Nginx : il faut savoir que ce logiciel est configurable en serveur ou en proxy. Dans le cas présent vous allez l’installer en serveur web. C’est lui qui va permettre techniquement de diffuser votre site Internet. Les avantages de Nginx par rapport à apache sont, de ceux que j’ai pu constater, une meilleure performance global, une gestion des vhosts plus fine avec notamment des inclusions possibles de pré-configuration partagée directement dans le vhost pour que lui seul soit impacté.

Cela permet par exemple d’avoir une configuration spécifique pour wordpress et de l’inclure dans le vhost des blogs sans avoir à ressaisir/copier par blog et aussi d’éviter d’avoir cette configuration globale sur le serveur, vous trouverez un exemple plus loin dans cet article pour être plus précis.

Tout comme pour apache et ces .htaccess vous pouvez mettre en place un fichier nginx.conf  à la racine de votre site pour qu'il soit pris en compte par la configuration du serveur. Vous verrez dans cet article comment les mettre en place.

MySQL : étant un vieux de vielle, un peu quand même, je reste pour le moment fidèle à MySQL que vous allez donc installer en tant que serveur de base de données. Il permettra le stockage et la distribution des données pour les applications.

PHP 7 : tout simplement le langage de programmation pour la grande majorité des sites web. Et vu que l’objectif et de faire fonctionner un wordpress voir plusieurs en réalité, il est indispensable. Pour être exact, je vais vous faire installer PHP7-FPM (FastCGI Process Manager) qui est une dérivation du fast_cgi, que vous connaissez peut-être. PHP7-FPM va nous permettre d’améliorer encore vos performances de manière significatives.

fail2ban : cela va permettre de bloquer les attaques par brute force sur vos services notamment le SSH. On peut aussi le configurer pour bloquer les attaques sur les autres services tel que SMTP, FTP, HTTP, HTTPS etc.

Il ne manquerait pas quelques choses ???

Vous devez vous dire, si vous avez déjà installé des serveurs, qu’il manque deux éléments super importants. Que sont phpMyAdmin et un serveur FTP tel que proftpd. Etant fermement opposé à l’usage de phpMyAdmin sur les serveurs de production. Je trouve que d’un point de vue sécurité c’est une très grande pratique à risque et de plus c’est une mauvaise pratique dans la vie d'une application.

Dans l’état de l’art on a besoin d’accéder à MySQL en production que pour les choses suivantes :

  • Création de base de données / Utilisateurs
  • Dump (sauvegarde) de base de données / Utilisateurs
  • Restauration de sauvegarde

Ces trois actions sont tout à fait réalisables directement en ligne de commande car ça reste des actions rare pour la première ou automatisées pour les deux dernières.

Pas de FTP, car la connexion n’est pas chiffrée de manière native. Dans l’idée il faut créer un utilisateur SSH et vous connecter en SFTP, qui est en fait une connexion FTP au travers d’une connexion SSH qui est donc chiffrée. Sinon vous pouvez installer une connexion FTPS (semblable au HTTPS) mais je ne l'aborde pas dans l'article présent.

Installation des paquets

Ou que cela va vous être compliqué comme installation… Prenez donc une gorgez de café et on attaque le vif du sujet !

Tout d’abord on va mettre à jour le système d’exploitation par défaut je considère que vous êtes connecté en root (c’est mal je sais on y reviendra) :

Cette commande va mettre à jour la liste des paquets disponibles :

apt-get update

Celle-ci va mettre à jour votre système d’exploitation :

apt-get upgrade

Installation de Nginx :

apt-get install nginx

On a presque fait le plus dur, maintenant MySQL ! MySQL va vous demander notamment de saisir le mot de passe de l’utilisateur root, le root de MySQL pas celui de votre serveur, un conseil mettez un mot de passe le plus fort possible :

apt-get install mysql-server mysql-client mysql-common

Pour installer PHP7 sur debian elle n’est pas présente dans les paquets on va donc ajouter comme fournisseur de paquet dotdeb.org (link :https://www.dotdeb.org/instructions/)

Pour ce faire on va exécuter les commandes suivantes :

echo "deb http://packages.dotdeb.org jessie all" > /etc/apt/sources.list.d/dotdeb.list

wget --no-check-certificate https://www.dotdeb.org/dotdeb.gpg | apt-key add -

apt-get update

Une fois fait on va pouvoir installer notre paquet PHP7-FPM avec la commande qui suit :

apt-get install php7.0 php7.0-fpm php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-msgpack php7.0-memcached php7.0-intl php7.0-gmp php7.0-geoip php7.0-mbstring php7.0-xml php7.0-zip

Attention les paquets installés au-dessus sont un minimum vous pouvez bien entendu en ajouter d’autres par la suite. Vous avez peut-être remarqué un absent majeur qui est le suhosin patch. En effet il n’est pas encore disponible pour la version 7 de PHP, elle est toujours en cours de développement.

Configurer nginx pour utiliser PHP7-FPM :

Vous allez voir la partie un peu plus compliquée de cet article. En effet contrairement à une installation avec apache et PHP5, PHP7-FPM ne fonctionne pas tout de suite avec nginx. Pour qu'il soit pris en compte vous allez devoir modifier très légèrement votre configuration.

Armé de notre fidèle nano, ou vi pour les plus chevronnés, vous allez éditer votre fichier de configuration nginx du site par défaut via la commande : 

nano /etc/nginx/sites-available/default

Ajoutez une section "location" pour les fichiers PHP comme suit (en gras dans le code ci-dessous) : 

server {

listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

root /usr/share/nginx/html;
index index.html index.htm;

# Make site accessible from http://localhost/
server_name localhost;

location / {

# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ /index.html;
# Uncomment to enable naxsi on this location
# include /etc/nginx/naxsi.rules

}

location ~ .php$ {

include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;

}

}

Ce que vous venez de faire c'est d'ajouter une règle pour tous les fichiers PHP, ils devront utiliser le fastcgi_pass de PHP7. Car PHP7-FPM est un fastcgi avec un service qui tourne en permanence sur le serveur pour écouter les demandes qui lui sont adressés.

Vous avez presque terminé votre installation ! Vous allez maintenant modifier le fichier php.ini via la commande suivant :

nano /etc/php/7.0/fpm/php.ini

Il vous faut trouver dans le fichier le paramètre suivant : cgi.fix_pathinfo=0 si il y a un ; devant la ligne retirez le et assurez-vous que la valeur est bien de 0. Le but de le mettre à 0 va vous éviter beaucoup de soucis dans vos applications web car les chemins d'appels seraient différents avec une valeur à 1.

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0

Pour finir on va relancer nos deux services que sont PHP7-FPM et nginx pour qu'ils prennent en comptes les modifications :

service php7.0-fpm reload

service nginx reload

Petite explication de différence entre reload et restart. Reload va simplement recharger la configuration du service sans l'interrompre. Alors que restart va interrompre le service avant de le redémarrer. En production le restart va s'utiliser que dans des cas très rares.

Il nous reste plus cas tester que tout fonctionne pour cela on va créer le fichier suivant : 

nano /var/www/html/info.php

Dedans on va mettre le code qui suit (qui a simplement pour but d'afficher le phpinfo) :

<?php
phpinfo();

Si vous voyez apparaître ceci c'est que le serveur et PHP7 fonctionne : 

php7-info

Si jamais vous avez le code source qui s'affiche il y a une erreur quelque part n'hésitez pas à me demander !

Configuration pour l'envoie d'e-mail

En l'état votre serveur est incapable via PHP d'envoyer un e-mail... Vous remédiez à cela très facilement en installant sendmail via la commande suivante : 

apt-get install sendmail

Une fois que vous l'avez installé, il faut modifier le fichier php.ini via la commande suivante : 

nano /etc/php/7.0/fpm/php.ini

Cherchez la ligne [mail function] dans le fichier et renseignez-le comme suit : 

[mail function]
; For Win32 only.
; http://php.net/smtp
;SMTP = localhost
; http://php.net/smtp-port
;smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = votreadresseemail@domaine.tld

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = "sendmail -t -i"

Une fois fait il faut redémarrer le service PHP et Nginx comme suit : 

service php7.0-fpm reload

service nginx reload

Fail2ban notre meilleur ami

Vous allez maintenant installer le service fail2ban. Comme expliqué plus haut il est indispensable pour un strict minimum de sécurité. L'installation est des plus simples :

apt-get install fail2ban

On démarre le service : 

fail2ban-client -x start

Voila il est installé et va bloquer toutes les tentatives de brute force sur le SSH pour vous ! Dans l'article consacré à la sécurité des serveurs web je vous expliquerai plus en détail la configuration de fail2ban. Mais là c'est déjà un grand minimum car quand il est oublié c'est une catastrophe...

D'ailleurs pensé à changer votre mot de passe root de votre serveur en en mettant un vrai de plus de 12 caractères.

Nginx inclure un fichier de conf dans notre vhost

Vous l'avez lu dans cet article on peut inclure des fichiers conf dans nos vhost un peu comme les .htaccess d'apache. Pour ce faire c'est très simple il suffit dans votre vhost de l'ouvrir comme suit : 

nano /etc/nginx/site-avaible/demo.conf

Une fois ouvert d'aller dans la section "server" et de rajouter la ligne en gras : 

server {

access_log /var/log/nginx/access-demo.log;
error_log /var/log/nginx/error-demo.log;

listen 443 ssl;
listen [::]:443 ssl;

root /var/www/demo/web;
#ligne à rajouter
include /var/www/demo/web/nginx.conf;

[...]

Voila nginx ira chercher aussi dans ce fichier sa configuration de vhost, notamment pour le plugin iTheme Security quand on utilise wordpress.

Conclusion :

Vous avez donc un serveur fin prêt pour héberger et diffuser votre site Internet avec Nginx, MySQL et PHP7. Attention toute de fois même si cette configuration n'est pas une vraie passoire, elle reste non sécurisée. Je vous expliquerais d'ici peux comment sécuriser le tout.

A lire aussi : 

Pour aller plus loin :

Crédit photo : Designed by Freepik

Je vous propose pour aller plus loin :

Lien sponsorisé amazon

Je vous propose aussi :

Lien sponsorisé amazon