Installer Nginx, PHP 7.2 et MariaDB
Présentation
Pour monter un serveur Web LEMP sur une VM basée sur Debian Stretch, nous allons installer l’un des meilleurs serveurs Web qui soit : Nginx, ainsi que le serveur base de données MariaDB (dérivé de MySQL depuis que ce dernier a été racheté par Oracle) et PHP 7.2. Enfin nous installerons PhpMyadmin pour aider à la gestion de la base de données.
Puisque les dépôts officiels de Debian sont loin d’être à jour, nous allons utiliser les dépôts de contributeurs.
Commençons par vérifier la version de ces outils sur le dépôt officiel Debian Stretch :
1 2 3 4 5 6 7 8 9 |
$ apt update && apt-cache show php Package: php Source: php-defaults (49) Version: 1:7.0+49 Installed-Size: 12 Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org> Architecture: all Depends: php7.0 [...] |
1 2 3 4 5 6 7 |
$ apt-cache show nginx Package: nginx Version: 1.10.3-1+deb9u2 Installed-Size: 91 Maintainer: Debian Nginx Maintainers <pkg-nginx-maintainers@lists.alioth.debian.org> Architecture: all [...] |
A l’heure où je rédige cet article, les versions sur le dépôt officiel de PHP et de Nginx sont respectivement la version 7.0 et 1.10.3 alors que sur les sites officiels proposent les versions 7.2 et 1.15.8
Etant donné que PHP est très dépendant du serveur Web, nous allons commencer par installer le serveur Web Nginx.
Installation et configuration de Nginx
Comme pour tout dépôt que l’on souhaite ajouter, il faut commencer par importer les clés de signature du dépôt que nous allons préalablement télécharger
1 |
$ wget http://nginx.org/keys/nginx_signing.key && apt-key add nginx_signing.key && rm nginx_signing.key |
Et ajoutons le dépôt officiel de Nginx
1 |
$ sh -c 'echo "deb http://nginx.org/packages/debian/ stretch nginx" > /etc/apt/sources.list.d/nginx.list' |
Mettons à jours la liste des paquets
1 |
$ apt update |
Et recherchons quelle est la dernière version de Nginx proposée
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ apt-cache policy nginx nginx: Installé : (aucun) Candidat : 1.14.2-1~stretch Table de version : 1.14.2-1~stretch 500 500 http://nginx.org/packages/debian stretch/nginx amd64 Packages 1.14.1-1~stretch 500 500 http://nginx.org/packages/debian stretch/nginx amd64 Packages 1.14.0-1~stretch 500 500 http://nginx.org/packages/debian stretch/nginx amd64 Packages 1.12.2-1~stretch 500 500 http://nginx.org/packages/debian stretch/nginx amd64 Packages 1.12.1-1~stretch 500 500 http://nginx.org/packages/debian stretch/nginx amd64 Packages 1.12.0-1~stretch 500 500 http://nginx.org/packages/debian stretch/nginx amd64 Packages 1.10.3-1+deb9u2 500 500 http://security.debian.org stretch/updates/main amd64 Packages 1.10.3-1+deb9u1 500 500 http://deb.debian.org/debian stretch/main amd64 Packages Bingo, la 1.14.2 est disponible. Nous pouvons maintenant l'installer |
1 |
$ apt install nginx |
Vérifions la version installé
1 |
$ nginx -v |
Démarrons le serveur Nginx
1 |
$ systemctl start nginx.service |
Et vérifions enfin son statut
1 2 3 4 5 6 7 8 9 10 11 |
$ systemctl status nginx.service ● nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: Active: <span style="color: #339966;">active (running)</span> since Wed 2019-02-13 23:14:51 CET; 1s ago Docs: http://nginx.org/en/docs/ Process: 28623 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exit Main PID: 28624 (nginx) Tasks: 2 (limit: 4915) CGroup: /system.slice/nginx.service ├─28624 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.c └─28625 nginx: worker process |
Si le résultat est Active: active (running) cela signifie que les services sont opérationnels.
Sécuriser Nginx
Une des premières mesures que vous pouvez prendre est de masquer la version Nginx utilisée. Editez le fichier de configuration de Nginx et ajoutez la directive server_tokens
1 |
$ vi /etc/nginx/nginx.conf |
1 2 3 4 5 |
http { [...] server_tokens off; [...] } |
Installation et configuration de PHP 7.2
Officiellement le support actif de PHP 7.0 a pris fin en décembre 2017 et les correctifs de sécurité étaient garantis jusqu’en décembre 2018.
Ondřej Surý propose et maintient un dépôt pour la version 7.2. La dernière version stable de PHP proposée est la xxxx
Commencons par installer les paquets requis pour ajouter de nouveaux dépôts :
1 |
$ apt install apt-transport-https lsb-release ca-certificates |
Importons ensuite les clés de signature des paquets de son dépôt
1 |
$ wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg |
Puis ajoutons son dépôt dans nos sources
1 |
$ sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' |
Enfin mettons à jour la liste des paquets
1 |
$ apt update |
Vérifions maintenant quelle est la nouvelle version de PHP proposée :
1 2 3 4 5 6 7 8 9 |
$ apt-cache policy php php: Installé : (aucun) Candidat : 2:7.2+69+0~20190203094537.13+stretch~1.gbpfa617b Table de version : 2:7.2+69+0~20190203094537.13+stretch~1.gbpfa617b 500 500 https://packages.sury.org/php stretch/main amd64 Packages 1:7.0+49 500 500 http://deb.debian.org/debian stretch/main amd64 Packages |
Nous pouvons maintenant procéder à l’installation de PHP 7.2 et de certaines des extensions disponibles et utiles :
1 |
$ apt install php7.2 php7.2-fpm php7.2-cli php7.2-common php7.2-opcache php7.2-curl php7.2-mbstring php7.2-mysql php7.2-zip php7.2-xml php7.2-gd php7.2-json |
Quid de php7.2-fpm ? Utile ?
Si vous n’avez pas de serveur Web, il est possible que vous ayez des messages d’erreur car il essaie de redémarrer un serveur qui n’existe pas. Il n’y a rien d’inquiétant.
Si vous aviez déjà la version 7.0 et un serveur web comme Apache par exemple, il vous faut maintenant la désactiver :
1 2 |
$ a2dismod php7.0 $ systemctl restart apache2 |
Et activer PHP 7.2
1 2 |
$ a2enmod php7.2 $ systemctl restart apache2 |
PHP-FPM
PHP-FPM (FastCGI Process Manager) est un module qui permet la communication entre le serveur Nginx et PHP. Il est nécessaire de fournir le chemin complet vers le le process.
Puisque Nginx a été installé depuis le dépôt officiel, la configuration est légèrement différente.
- Les fichiers de configuration des sites Web (les Vhosts) sont stockés dans /etc/nginx/conf.d au lieu de /etc/nginx/sites-enabled. Les fichiers seront nommés site.fr.conf. Pour désactiver un site, il faudra nommer le fichier site.fr.conf.disabled.
- De plus les fichiers web sont par défaut dans /usr/share/nginx/html/ au lieu de /var/www/html/.
Nous allons modifier tout ca.
Editez le fichier de configuration par défaut qui se trouve dans /etc/nginx/conf.d/default
1 |
vi /etc/nginx/conf.d/default.conf |
et remplacez par le contenu suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
server { listen 80; server_name localhost; #access_log /var/log/nginx/host.access.log main; location / { root /var/www/html; index 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; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root /var/www/html; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$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; } } |
Redémarrez le service :
1 |
$ systemctl restart nginx.service |
Si vous souhaitez vérifier la configuration de PHP, vous pouvez créer un fichier phpinfo.php. Pensez à le supprimer ensuite car ce serait une mine d’informations pour un hacker.
1 2 |
$ mkdir -p /var/www/html/ $ vi /var/www/html/phpinfo.php |
Et ajoutez les lignes suivantes
1 2 3 |
<?php phpinfo(); ?> |
Lancez ensuite votre navigateur et allez sur http://[VOTRE_IP]/phpinfo.php et vous pourrez consulter la configuration.
Configuration de PHP
Commencons par identifier le fichier de configuration à modifier
1 2 3 |
$ php -i | grep php.ini Configuration File (php.ini) Path => /etc/php/7.2/cli Loaded Configuration File => /etc/php/7.2/cli/php.ini |
Editons le fichier /etc/php/7.2/fpm/php.ini et modifions les directives suivantes :
1 |
$ vi /etc/php/7.2/fpm/php.ini |
1 2 3 4 |
[...] post_max_size = 58M [...] upload_max_filesize = 52M |
Editons le fichier /etc/nginx/nginx.conf et ajoutons la directive client_max_body_size
1 |
$ vi /etc/nginx/nginx.conf |
1 2 3 |
[...] http { client_max_body_size 12m; |
Redémarrons les services
1 |
$ systemctl restart nginx.service php7.2-fpm.service |
Installation et configuration du serveur MariaDB
La dernière version disponible sur le dépôt Debian est la 10.1.37 mais nous allons installer celle du dépôt officiel de MariaDB, la 10.3.12
1 2 3 |
$ apt install software-properties-common dirmngr $ apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xF1656F24C74CD1D8 $ add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mariadb.mirrors.ovh.net/MariaDB/repo/10.3/debian stretch main' |
Lançons un Update et vérifions la version disponible :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ apt update $ apt-cache policy mariadb-server mariadb-server: Installé : (aucun) Candidat : 1:10.3.12+maria~stretch Table de version : 1:10.3.12+maria~stretch 500 500 http://mariadb.mirrors.ovh.net/MariaDB/repo/10.3/debian stretch/main i386 Packages 500 http://mariadb.mirrors.ovh.net/MariaDB/repo/10.3/debian stretch/main ppc64el Packages 500 http://mariadb.mirrors.ovh.net/MariaDB/repo/10.3/debian stretch/main amd64 Packages 10.1.37-0+deb9u1 500 500 http://security.debian.org stretch/updates/main amd64 Packages 10.1.26-0+deb9u1 500 500 http://deb.debian.org/debian stretch/main amd64 Packages |
Procédons à l’installation :
1 |
$ apt install mariadb-server |
Renseignez puis confirmez un mot de passe pour root
Executez ensuite ce script pour “sécuriser” le serveur.
Si vous supprimez l’accès distant pour root vous ne pourrez pas vous connecter à phpMyadmin.
1 2 3 4 5 6 7 8 9 10 11 |
$ mysql_secure_installation [...] Change the root password? [Y/n] <-- Y [...] Remove anonymous users? [Y/n] <--Y [...] Disallow root login remotely? [Y/n] <-- N [...] Remove test database and access to it? [Y/n] <-- Y [...[ Reload privilege tables now? [Y/n] <-- Y |
php7.2-fpm.sock failed : Permission denied
Mariadb-server :: connexion refusée lors de l'ajout de la clé
Si vous obtenez une erreur en essayant d’ouvrir la page phpinfo.php, consultez les logs Nginx sur /var/www/log/nginx
1
2
3
|
$ tail -f /var/log/nginx/error
==> error.log <==
2019/02/16 10:54:44 [crit] 13391#13391: *1 connect() to unix:/var/run/php/php7.2-fpm.sock failed (13: Permission denied) while connecting to upstream, client: 51.XXX.XX.XX, server: localhost, request: "GET /phpinfo.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "XXX"
|
La raison est que le groupe www-data ne contient pas l’utilisateur nginx et par conséquent nginx n’est pas autorisé à se connecter au socket PHP-FPM.
Pour résoudre cela, ajouter nginx au groupe www-data
1
|
$ usermod -a -G www-data nginx
|
et rechargez nginx
1
|
$ systemctl restart nginx
|