Background

Guide : Configurer un VPS pour déployer une application Symfony (partie 3)

Découvre mon guide complet pour configurer facilement un VPS : installation, sécurité, PHP, serveur web, SSL. Déploye sereinement ton application Symfony (même le vendredi) !

Ce guide fait partie d’une série d’articles où je te présente comment configurer un VPS pour déployer une application Symfony simplement et surtout en comprenant tout ce que tu vas faire. Le but est de démystifier la gestion d’un serveur en ligne de commande, pour te permettre de gagner en autonomie et de mieux comprendre comment fonctionne le niveau en dessous de ton application web.

1. Récap

Dans la partie 2, on a vu :

  • L’arborescence des dossiers dans Linux
  • Comment configurer la timezone de ton VPS Hostinger
  • Comment mettre à jour ton VPS
  • Comment installer tes premiers paquets
  • Comment faire le monitoring de ton VPS
  • Les permissions et les droits d’accès

Dans cet article, on touche enfin au but : on va installer PHP, configurer notre serveur web avec un certificat SSL, et installer un serveur de base de données.

Accroche ton slip, c’est partiiii !

alt text

2. Installation de PHP

Avant de faire quoi que ce soit, il y a quelques choses à ne surtout pas oublier ! Il faut mettre à jour notre système, tu commences à en avoir l’habitude maintenant.

$ sudo apt update
$ sudo apt upgrade

La première chose à faire est d’installer les dépendances nécessaires pour PHP.

$ sudo apt install apt-transport-https lsb-release ca-certificates software-properties-common

Ensuite, nous allons installer PHP, PHP-FPM et les extensions les plus courantes.

$ sudo apt install php8.2 php8.2-cli php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd php8.2-mbstring php8.2-common php8.2-xml php8.2-xmlrpc

Pour vérifier que tout s’est bien passé, tu peux entrer la commande suivante.

$ php -v

Output:
    PHP 8.2.0 (cli) (built: Dec  7 2022 15:11:20) (NTS)
    Zend Engine v4.2.0, Copyright (c) Zend Technologies
        with Zend OPcache v8.2.0, Copyright (c), by Zend Technologies

Astuce : pour vérifier quelles extensions sont installées sur PHP, tu peux entrer la commande suivante.

$ php -m

3. Installation du serveur web Caddy

Nous allons maintenant installer la brique essentielle qui nous permettra d’écouter les requêtes HTTP : un serveur web. Tu connais probablement déjà les deux principaux serveurs du marché : Nginx et Apache.

Eh bien, nous n’allons utiliser ni l’un ni l’autre. 😅

Non, je ne suis pas devenu fou, mais il y a un serveur web qui me semble beaucoup mieux adapté à nos besoins : Caddy. C’est le serveur web idéal pour les développeurs car il est très simple à configurer et très performant. Voici les trois raisons qui m’ont décidé à l’utiliser :

  1. Certificat SSL automatique, aucune configuration nécessaire
  2. HTTP/2 par défaut
  3. Configuration simple en JSON

Le rêve incarné en serveur web ! 🦄

Assez parlé, installons cette merveille !

$ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
$ sudo apt update
$ sudo apt install caddy

4. Création d’un utilisateur dédié au déploiement

Nous allons maintenant assembler tout ce que nous avons vu dans les articles précédents pour configurer notre serveur web avec PHP et pouvoir déployer nos applications Symfony en toute tranquillité.

Pour commencer, nous allons créer le répertoire dans lequel nous placerons les fichiers de nos projets Symfony (ou autre).

$ sudo mkdir -p /var/www/caddy

La deuxième chose à faire est de créer un utilisateur système qui sera uniquement dédié à la gestion de nos sites web. Pour cela, nous allons utiliser la commande useradd, mais nous allons lui ajouter quelques paramètres supplémentaires.

$ sudo useradd -d /var/www/caddy -s /bin/bash -g caddy deploy

Voici ce que la commande va faire :

  • Créer un nouvel utilisateur deploy
  • Lui attribuer le répertoire /var/www/caddy comme répertoire de base
  • Lui attribuer le shell /bin/bash comme shell par défaut
  • Lui attribuer le groupe caddy comme groupe par défaut

N’oublie pas de configurer un mot de passe pour ton utilisateur deploy !

$ sudo passwd deploy

Modifie les droits d’accès du répertoire caddy que nous venons de créer.

$ sudo chown -R deploy:caddy /var/www/caddy

Vérifions que tout s’est bien déroulé en nous connectant à ce nouvel utilisateur.

$ ssh -p5123 deploy@IP_DU_VPS

Après connexion, tu dois te retrouver dans le répertoire /var/www/caddy.

Astuce : Si tu veux aller plus loin, tu peux configurer la connexion via clé SSH pour ton utilisateur deploy.

⚠ Attention : L’utilisateur deploy ne va servir qu’à la gestion de nos sites web, il ne doit pas être utilisé pour autre chose. Pour continuer la modification de ton VPS, tu dois te reconnecter en tant que debian.

5. Configuration du serveur web Caddy avec PHP-FPM

Avant de mettre les mains dans le camboui, il faut que je t’explique comment Caddy fonctionne avec PHP-FPM. Un serveur web comme Caddy, en soi, c’est plutôt simple : il reste à l’écoute des requêtes HTTP sur les ports 80 ou 443, et il renvoie une réponse. Il peut très bien tourner sans PHP — d’ailleurs, la page que t’es en train de lire, c’est juste un fichier HTML classique servi par Caddy. On appelle ça un site statique.

Dans notre cas, on va venir “brancher” PHP à Caddy, histoire qu’il puisse aussi gérer les requêtes PHP.

Pour cela, nous allons commencer par configurer un processus PHP-FPM dédié à notre application. Nous allons créer un fichier de configuration dans le répertoire /etc/php/8.2/fpm/pool.d/ et l’appeler friday-deploy.conf (pour t’y retrouver, je te conseille de lui donner le nom de ton projet).

$ sudo nano /etc/php/8.2/fpm/pool.d/friday-deploy.conf

Nous allons modifier ce fichier et ajouter le contenu suivant.

[friday-deploy]
user = deploy
group = caddy
listen = 127.0.0.1:8000
listen.owner = deploy
listen.group = caddy
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = on
; Choose how the process manager will control the number of child processes.
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.process_idle_timeout = 10s

Voici ce que va faire ce fichier de configuration :

  1. Nous créons un processus PHP-FPM dédié à notre application, qui va tourner en local sur le port 8000.
  2. Nous attribuons les droits d’accès à notre utilisateur deploy et au groupe caddy, ce qui va permettre d’éviter les soucis lorsqu’on exécute un clear:cache.
  3. Nous désactivons certaines fonctionnalités de PHP qui sont dangereuses pour la sécurité de ton serveur.
  4. Nous configurons le process manager de PHP-FPM pour qu’il puisse gérer les requêtes PHP de manière optimale.

Pour aller plus loin, je te conseille l’excellent article pour optimiser PHP-FPM: à consulter ici

Avant de passer à la suite, il faut relancer PHP pour que nos modifications soient prises en compte.

$ sudo systemctl restart php8.2-fpm

Nous sommes enfin prêts à passer à la dernière étape : la configuration de Caddy.

Entre la commande suivante pour modifier la configuration du serveur web.

$ sudo nano /etc/caddy/Caddyfile

Copie/colle le contenu suivant dans le fichier en remplaçant le nom de domaine par le tien.


dummy.eddaoust.com {
    root * /var/www/caddy/dummy.eddaoust.com/public
    file_server
    encode gzip zstd
    php_fastcgi 127.0.0.1:8000
}

www.dummy.eddaoust.com {
    redir https://dummy.eddaoust.com{uri}
}

Voici ce que va faire ce fichier de configuration :

  1. La première ligne est très importante, elle représente le domaine (ou sous-domaine) pour lequel tu veux héberger ton application. Pour que ça fonctionne et que le certificat SSL soit automatiquement généré, tu dois avoir modifié ta zone DNS pour faire pointer ton nom de domaine au préalable.
  2. La ligne root représente le répertoire à partir duquel PHP va tenter de servir les fichiers. En l’occurrence, on va servir notre application Symfony via le fichier index.php du répertoire public.
  3. La directive file_server permet de servir les fichiers statiques (CSS, JS, images, etc.) sans passer par PHP.
  4. La directive encode permet de compresser les fichiers servis par Caddy pour améliorer les performances.
  5. La directive php_fastcgi permet de brancher PHP à Caddy pour qu’il puisse gérer les requêtes PHP. Ici, on fait référence au port qu’on a configuré plus haut dans le fichier de configuration de PHP-FPM.
  6. La dernière ligne est optionnelle, elle permet de rediriger les requêtes vers le nom de domaine sans le www.

C’est la configuration minimale pour faire tourner une application Symfony avec Caddy et PHP-FPM. Tu peux aller beaucoup plus loin en ajoutant des en-têtes HTTP, du cache, des logs, des règles de sécurité, etc. Mais pour l’instant, on va rester simple et s’en tenir à ça. Si tu veux creuser le sujet, je te recommande d’aller jeter un œil à la doc officielle de Caddy.

Maintenant, on va recharger Caddy et afficher son statut pour vérifier que tout s’est bien passé.

$ sudo systemctl reload caddy
$ sudo systemctl status caddy

Dans les logs, tu devrais voir apparaître cette ligne, elle confirme que le certificat SSL a bien été attribué à ton site web :
  certificate obtained successfully

On va se reconnecter à l’utilisateur deploy et on va créer le répertoire qui contiendra les fichiers de notre application Symfony.

$ mkdir -p /var/www/caddy/dummy.eddaoust.com/public

Pour vérifier que tout fonctionne correctement, on va créer un fichier index.php dans le répertoire public de notre application Symfony, en étant connecté avec l’utilisateur deploy.

Si tu as bien suivi, ici on simule une application Symfony, car le point d’entrée de toute appli Symfony, c’est le fichier index.php dans le répertoire public.

$ nano /var/www/caddy/dummy.eddaoust.com/public/index.php

Ajoute le contenu suivant.

<?php
echo "Deploy on friday is easy !";

Sauvegarde, puis rends-toi sur l’URL de ton site web : tu devrais voir s’afficher le message “Deploy on Friday is easy!”. Si tout s’est bien passé, ton site est désormais en ligne avec un certificat SSL valide!

alt text

Et voilà, tu sais maintenant comment configurer un VPS pour déployer des applications PHP… et même des sites statiques ! 🎉

6. Bonus : Installer un serveur de base de données

Pour la base de données, on va utiliser MariaDB. C’est un serveur open source qui fait office d’alternative à MySQL.

Pour l’installer et lancer l’utilitaire de configuration, entre la commande suivante et répond ensuite aux différentes questions selon tes besoins.

$ sudo apt install mariadb-server
$ sudo mysql_secure_installation

Par défaut, MariaDB est configuré pour écouter sur le port 3306 et n’est accessible que localement.

Pour te connecter à la base de données, entre la commande suivante :

sudo mariadb

Une bonne pratique de sécurité consiste à créer un utilisateur dédié pour chaque base de données.

Pour créer un utilisateur et une base de données, tu peux utiliser les commandes suivantes :

$ CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
$ CREATE DATABASE your_database_name;
$ GRANT ALL PRIVILEGES ON `your_database_name`.* TO 'username'@'localhost' WITH GRANT OPTION;
$ FLUSH PRIVILEGES;

Une fois tout ça en place, il ne te reste plus qu’à renseigner les identifiants de ta base de données dans le fichier .env de ton application Symfony !



Et voilà, cette série d’articles touche à sa fin !

Si ça t’a plu, n’hésite pas à m’encourager en partageant un max et en t’abonnant à mes réseaux sociaux 🚀

En ce moment, je fais un build in public d’un boilerplate Symfony sur X — viens suivre l’aventure 😃