Votre application Laravel tourne très bien en local, elle est belle et optimisée et c’est enfin l’heure de la passer en production ? Alors vous êtes au bon endroit.
Dans ce guide je vais détailler pas à pas les étapes pour déployer une application Laravel sur un VPS (Serveur Virtuel Privé) Ubuntu.
Ma configuration :
- Laravel : 8.44
- Ubuntu : 20.10 (Groovy)
Pré-requis :
- Un VPS (Pris chez OVH pour ma part)
- Un accès SSH au serveur
- Option : Un projet utilisant git
1 – Préparation du serveur
Nous allons dans un premier temps préparer le serveur sur lequel nous allons déployer l’application. Connectez-vous en SSH à votre serveur puis mettez à jour les paquets :
sudo apt-get update
sudo apt-get upgrade
A – Installation de NGINX
Nous allons ensuite installer NGINX
sudo apt install nginx
Si votre système vous le demande appuyez sur “Y” et “enter” pour confirmer l’installation.
Vérifions ensuite les paramètres du pare-feu :
sudo ufw app list
Vous devriez avoir cet output :
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Nous allons activer un pare-feu resctrictif qui permettra tout de même de renvoyer le traffic du port 80 vers NGINX :
sudo ufw allow 'Nginx HTTP'
[...]
#Output :
Rules updated
Rules updated (v6)
Vous pouvez vérifier le fonctionnement du pare-feu en utilisant :
sudo ufw status
Vous devriez avoir cet output :
Status: active
To Action From
-- ------ ----
Nginx HTTP ALLOW Anywhere
Nginx HTTP (v6) ALLOW Anywhere (v6)
Pensez également à autoriser la connection SSH :
sudo ufw allow ssh
Et si vous souhaitez utiliser un certificat HTTPS (Ce qui me semble évident) pensez également à activer le https avec :
sudo ufw allow https
Si vous avez “Status : inactive” à la place c’est qu’il faut simplement activer le pare-feu avec :
sudo ufw enable
Une fois que c’est bon vous pouvez vérifier que votre serveur est opérationnel en vous rendant sur l’adresse IP de votre serveur précédée de http:// ou bien sur un nom de domaine qui pointe vers votre serveur.
Si vous ne savez pas comment faire pointer un nom de domaine sur votre serveur rendez-vous sur notre guide dédié.
B – Installation MySQL
Nous allons maintenant installer MySQl pour gérer nos bases de données :
sudo apt install mysql-server
Si votre système vous le demande appuyez sur “Y” et “enter” pour confirmer l’installation.
Lorsque l’installation est terminée nous allons lancer le script de configuration de MySQL :
sudo mysql_secure_installation
Il vous est demandé si vous souhaitez activer “VALIDATE PASSWORD COMPONENT”, c’est une sécurité en plus qui empéche d’utiliser des mots de passes que le système juge trop simple.
Output :
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Je vais pour ma part l’activer, vous êtes libres ou non de le faire. Si vous souhaitez l’actvier tapez “Y” puis “enter” il vous demandera ensuite le niveau de sécurité que vous souhaitez utiliser, je vais choisir “Low” soit “0”; sinon faites juste “enter”.
Vous choisissez ensuite le mot de passe du compte administrateur de MySQL (Root) et le confirmer.
S’en suit une série de questions de sécurité, je vous laisse choisir les paramètres qui vous conviennent, voici ce que j’ai mis :
- Remove anonymous users : Yes
- Disallow root login remotely : Yes
- Remove test database and access to it : Yes
- Reload privileges tables now : Yes
Une fois l’installation terminée vous pouvez accéder à MySQL en utilisant :
sudo mysql
Output :
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.25-0ubuntu0.20.10.1 (Ubuntu)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
Pour sortir de Mysql tapez “quit
“
Mysql est maintenant prêt et opérationnel.
C – Installation de PHP
NGINX fonctionne différement d’Apache avec PHP, c’est pourquoi nous avons besoin d’installer des dépendances spéciales, pour faire ceci :
sudo apt install php-fpm php-mysql php7.4-xml php7.4-mbstring
Si votre système vous le demande appuyez sur “Y” et “enter” pour confirmer l’installation.
D – Configuration de NGINX pour utiliser PHP
Le fonctionnement de NGINX est similaire à Apache dans le fait qu’il utilise des blocs serveurs; ces blocs sont l’équivalent des VHOST d’Apache.
Nous allons configurer un bloc serveur pour un nom de domaine.
Sous Ubuntu NGINX vient pré-installé avec un bloc serveur activé, c’est ce dernier qui renvoie la page “Welcome to nginx!”.
Il est configuré pour aller chercher le contenu du dossier /var/www/html
Plutôt que de modifier ce bloc serveur nous allons en créer un autre afin de permettre la création de plusieurs blocs en parallèle plutôt qu’un seul GROS bloc serveur. (C’est plus propre).
Nous allons commencer par créer le répertoire qui recevra notre application Laravel :
sudo mkdir /var/www/votre_domaine
Puis nous attribuons ce dossier à notre utilisateur actuel :
sudo chown $USER:$USER /var/www/votre_domaine
($USER
correspond à l’utilisateur qui est actuellement en train d’exécuter la commande)
Ouvrons ensuite un fichier texte correspondant à notre domaine dans le dossier site-available de NGINX :
sudo nano /etc/nginx/sites-available/votre_domaine
Dans ce dernier nous allons mettre la configuration recommandée de Laravel :
server {
listen 80;
server_name votre_domaine;
root /var/www/votre_domaine/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Source : https://laravel.com/docs/8.x/deployment
Pour valider votre fichier texte et l’enregistrer faites “CTRL + X” puis tapez “Y” et “Enter”
Une fois que le fichier est enregistrer il faut créer un lien symbolique entre la configuration que vous venez de faire et la liste des sites actifs de NGINX, pour ce faire :
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
Note : Pour supprimer un lien symbolique il suffit d’utiliser RM, par exemple ‘sudo rm /etc/nginx/site-available/your_domain
‘
Pour vérifier que votre configuration est OK et valide utilisez :
sudo nginx -t
S’il y a des erreurs de syntax nginx vous indiquera où elles se trouvent et vous devrez modifier votre fichier en utilisant à nouveau :
sudo nano /etc/nginx/sites-available/votre_domaine
Lorsque tout est OK vous pouvez relancer NGINX pour qu’il utilise ses nouveaux paramètres :
sudo systemctl reload nginx
Votre nom de domaine / serveur pointe désormais vers le dossier (vide) de votre application Laravel. Vous devriez voir “file not found” en vous y rendant.
Si vous voulez vérifier que tout fonctionne bien vous pouvez créer un fichier PHP (PHP et non HTML car Laravel necessite l’utilisation d’un fichier PHP) dans /var/www/votre_domaine/public
en faisant :
mkdir /var/wwww/votre_domaine/public
nano /var/www/votre_domaine/public/index.php
Et en mettant du contenu :
<html>
<head>
<title>Salut c'est cool</title>
</head>
<body>
<h1>Nginx pointe bien au bon endroit!</h1>
<p>Bientôt nous aurons une belle application <strong>LARAVEL</strong> ici.</p>
</body>
</html>
<?php
phpinfo();
En rechargeant votre navigateur avec comme URL votre domaine vous verrez le nouveau contenu et pourrez vérifier dans le même la configuration de votre PHP.
Il est préférable de ne pas laisser les informations PHP à la vue de tous donc vous pouvez retirer les deux dernière ligne de votre fichier avant de passer à la suite.
E – Création de la base de donnée MYSQL
Nous allons maintenant créer la base de donnée MySQL qui servira à notre Laravel, pour cela connectons-nous à MYSQL :
sudo mysql
Puis créons notre BDD :
mysql> CREATE DATABASE exemple_bdd;
Nous allons maintenant créer un utilisateur dédié et lui donner les droits à cette BDD.
Utilisez la commande suivante pour créer un nouvel utilisateur nommé laravel
avec le mot de passe laravel_mdp
, mais vous devez remplacer cette valeur par un mot de passe sécurisé de votre choix.
Pensez à bien conserver ces informations elles seront nécessaires lors du déploiement de Laravel.
mysql> CREATE USER 'laravel'@'%' IDENTIFIED WITH mysql_native_password BY 'laravel_mdp';
Puis nous donnons accès à la BDD crée à cet utilisateur :
mysql> GRANT ALL ON exemple_bdd.* TO 'laravel'@'%';
Une fois que c’est OK nous quittons mysql :
mysql> quit
Pour tester l’accès à la base de donnée avec ces informations :
mysql -u laravel -p
Puis saisissez le mot de passe choisi et tapez ensuite
mysql> SHOW DATABASES;
Vous devriez avoir :
+--------------------+
| Database |
+--------------------+
| information_schema |
| exemple_bdd |
+--------------------+
2 rows in set (0.01 sec)
Vous pouvez ensuite quitter mysql
mysql> quit
F – Installation de Composer
Pour installer Composer utilisez simplement :
sudo apt install composer
Puis testez son installation en utilisant :
composer
Output :
G – (Facultatif) Installation de NVM pour utiliser NodeJS & NPM avec Laravel mix
J’utilise NVM qui permet de télécharger et d’utiliser plusieurs versions de NodeJS et NPM simultanément.
Si vous n’en avez pas besoin vous pouvez simplement installer NodeJS (et NPM) en utilisant :
sudo apt install nodejs
Sinon utilisez :
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
Puis pour vérifier la présence de NVM faites
nvm
Si vous obtenez :
Command 'nvm' not found, but there are 13 similar ones.
Utilisez : source ~/.bashrc
ou bien déconnectez-vous de votre session (logout).
Une fois que vous avez NVM d’installé, installez nodeJS avec :
nvm install node
Ceci installera la dernière version de nodeJS et l’utilisera par défaut, vous pouvez vous en assurer en utilisant :
node -v
2 – Installation de l’application Laravel
A – Fichiers et dépendances
Nous allons maintenant mettre en place votre application Laravel sur le serveur, je vais pour ma part utiliser git mais vous êtes libre de faire comme vous le souhaitez.
L’objectif étant d’avoir les fichiers de votre projet Laravel dans le dossier créé précédemment /var/ww/votre_domaine
Avec git je fais :
git clone adresse-de-votre-repository.git /var/www/votre_domaine
Si vous avez créé le dossier public précédemment, précédez cette commande de :
rm -rf /var/www/votre_domaine/public
Lorsque votre clonage sera terminé, placez-vous dans le dossier de votre application :
cd /var/www/votre_domaine
Puis installez les dépendances avec :
composer install
Composer va alors installer toute une liste de dépendances dont Laravel a besoin pour fonctionner.
Nous allons également installer les dépendances de nodeJS avec :
npm install
B – Mise en place du .env
Maintenant créons notre fichier d’environnement (.env).
nano .env
Nous allons partir du .env d’exemple de Laravel :
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=exemple_bdd
DB_USERNAME=laravel
DB_PASSWORD=laravel_mdp
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=memcached
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
Ces paramètres sont propres à votre application, pensez bien à utiliser la base de données que nous avons créé, et je vous suggère dans un premier temps de laisser APP_DEBUG=true pour vérifier que tout fonctionne bien. Attendez d’être sûr que tout est OK pour le passer à False.
Il faut maintenant donner les droits aux dossier de l’application à NGINX, pour réaliser ceci :
sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache
Une fois que ces commandes ont été réalisées, vous pouvez construire vos assets (Si besoin) avec :
npm run prod
Il se peut qu’il vous manque certaines dépendances de nodeJS notamment pour le traitement des images. Si vous obtenez l’erreur :
[webpack-cli] Error: spawn /var/www/votre_domaine/node_modules/gifsicle/vendor/gifsicle ENOENT
Vous pouvez utiliser :
npm rebuild gifsicle optipng-bin jpegtran-bin
Pour installer les dépendances manquantes.
Pensez à migrer vos bases de données pour les préparer au fonctionnement de votre application :
php artisan migrate
Ensuite nous allons lancer les commandes d’optimisation recommandées par Laravel à savoir :
composer install --optimize-autoloader --no-dev
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan optimize
Voici ces commandes en une seule ligne, plus simple à utiliser :
php artisan config:cache && php artisan route:cache && php artisan view:cache && php artisan optimize
Les commandes inverses si jamais vous souhaitez vider le cache de l’application :
php artisan config:clear
php artisan route:clear
php artisan cache:clear
Et voici également ces commandes en une ligne :
php artisan config:clear && php artisan route:clear && php artisan cache:clear
Et si vous utiliser du stockage :
php artisan storage:link
Commandes supplémentaires :
sudo apt-get install php7.4-gd
C – (Facultatif) Installation de Meilisearch :
Se déplacer dans un dossier “normal”
cd ~
Installer Meilisearch
curl -L https://install.meilisearch.com | sh
Déplacer Meilisearch avec les binaires
sudo mv ./meilisearch /usr/bin/
Pour lancer Meilisearch en même temps que le serveur il faut le créer en tant que service
sudo nano /etc/systemd/system/meilisearch.service
Insérer le contenu suivant dans le fichier créé :
[Unit]
Description=MeiliSearch
After=systemd-user-sessions.service
[Service]
Type=simple
ExecStart=/usr/bin/meilisearch --http-addr 127.0.0.1:7700 --env production --master-key Y0urVery-S3cureAp1K3y
[Install]
WantedBy=default.target
Ensuite il faut activer le service :
systemctl enable meilisearch
Puis pour le démarrer tout de suite :
systemctl start meilisearch
On peut vérifier que le processus fonctionne bien avec :
systemctl status meilisearch
Vous pouvez ensuite mettre en place vos certificats SSL (https), pour faire ça rendez-vous sur notre guide dédié !