Tutorial

Comment installer et configurer Laravel avec Nginx sur Ubuntu 20.04

NginxUbuntuPHPPHP FrameworksLEMPUbuntu 20.04

Introduction

Laravel est un framework PHP open-source qui fournit un ensemble d'outils et de ressources pour construire des applications PHP modernes. Avec un écosystème complet tirant parti de ses fonctionnalités intégrées, la popularité de Laravel s'est rapidement accrue ces dernières années, de nombreux développeurs l'ayant adopté comme framework de choix pour un processus de développement rationalisé.

Dans ce guide, vous allez installer et configurer une nouvelle application Laravel sur un serveur Ubuntu 20.04, en utilisant Composer pour télécharger et gérer les dépendances du framework et Nginx pour servir l'application. Lorsque vous aurez terminé, vous aurez une application de démonstration Laravel fonctionnelle tirant le contenu d'une base de données MySQL 8.

Conditions préalables

Afin de compléter ce guide, vous devrez d'abord effectuer les tâches suivantes sur votre serveur Ubuntu 20.04 :

Étape 1 — Installation des modules PHP requis

Avant de pouvoir installer Laravel, vous devez installer quelques modules PHP qui sont requis par le framework. Nous utiliserons apt pour installer les modules PHP php-mbstring, php-xml et php-bcmath. Ces extensions PHP fournissent une aide supplémentaire pour traiter le codage des caractères, le XML et les mathématiques de précision.

Si c'est la première fois que vous utilisez apt dans cette session, vous devez d'abord exécuter la commande update pour mettre à jour le cache du gestionnaire de paquets :

  • sudo apt update

Vous pouvez maintenant installer les packages nécessaires avec :

  • sudo apt install php-mbstring php-xml php-bcmath

Votre système est maintenant prêt à exécuter l'installation de Laravel via Composer, mais avant cela, vous aurez besoin d'une base de données pour votre application.

Étape 2 — Création d'une base de données pour l'application

Pour démontrer l'installation et l'utilisation de base de Laravel, nous allons créer une application de liste de voyage pour montrer une liste des endroits où un utilisateur aimerait se rendre, et une liste des endroits qu'il a déjà visités. Cela peut être stocké dans un tableau de places avec un champ pour les lieux que nous appellerons name et un autre champ pour les marquer comme visités ou non visités, que nous appellerons visited. De plus, nous inclurons un champ id pour identifier chaque entrée de manière unique.

Pour se connecter à la base de données depuis l'application Laravel, nous allons créer un utilisateur MySQL dédié, et lui accorder tous les privilèges sur la base de données travellist.

Au moment de la rédaction du présent document, la bibliothèque MySQL PHP native mysqlnd ne prend pas en charge caching_sha2_authentification, la méthode d'authentification par défaut pour MySQL 8. Nous devrons créer un nouvel utilisateur avec le mot de passe mysql_native_password afin de pouvoir se connecter à la base de données MySQL à partir de PHP.

Pour commencer, connectez-vous à la console MySQL en tant qu'utilisateur de la base de données root avec :

  • sudo mysql

Pour créer une nouvelle base de données, exécutez la commande suivante depuis votre console MySQL :

  • CREATE DATABASE travellist;

Vous pouvez maintenant créer un utilisateur et lui accorder tous les privilèges sur la base de données personnalisée que vous venez de créer. Dans cet exemple, nous créons un utilisateur nommé travellist_user avec le mot de passe password, mais vous devez le changer pour un mot de passe sécurisé de votre choix :

  • CREATE USER 'travellist_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Nous devons maintenant donner à cet utilisateur une autorisation sur la base de données travellist :

  • GRANT ALL ON travellist.* TO 'travellist_user'@'%';

Cela donnera à l'utilisateur travellist_user tous les privilèges sur la base de données travellist, tout en empêchant cet utilisateur de créer ou de modifier d'autres bases de données sur votre serveur.

Ensuite, quittez le shell MySQL :

  • exit

Vous pouvez maintenant tester si le nouvel utilisateur a les bonnes autorisations en vous connectant à nouveau à la console MySQL, cette fois-ci en utilisant les identifiants personnalisés de l'utilisateur :

  • mysql -u travellist_user -p

Vous remarquerez l'indicateur -p dans cette commande, qui vous demandera le mot de passe utilisé lors de la création de l'utilisateur travellist_user. Après vous être connecté à la console MySQL, confirmez que vous avez accès à la base de données travellist :

  • SHOW DATABASES;

Cela donnera la sortie suivante :

Output
+--------------------+ | Database | +--------------------+ | information_schema | | travellist | +--------------------+ 2 rows in set (0.01 sec)

Ensuite, créez un tableau nommé places dans la base de données travellist. Depuis la console MySQL, lancez la déclaration suivante :

  • CREATE TABLE travellist.places (
  • id INT AUTO_INCREMENT,
  • name VARCHAR(255),
  • visited BOOLEAN,
  • PRIMARY KEY(id)
  • );

Maintenant, remplissez le tableau places avec quelques exemples de données :

  • INSERT INTO travellist.places (name, visited)
  • VALUES ("Tokyo", false),
  • ("Budapest", true),
  • ("Nairobi", false),
  • ("Berlin", true),
  • ("Lisbon", true),
  • ("Denver", false),
  • ("Moscow", false),
  • ("Olso", false),
  • ("Rio", true),
  • ("Cincinnati", false),
  • ("Helsinki", false);

Pour confirmer que les données ont bien été enregistrées dans votre tableau, exécutez :

  • SELECT * FROM travellist.places;

Vous obtiendrez une sortie semblable à ceci :

Output
+----+-----------+---------+ | id | name | visited | +----+-----------+---------+ | 1 | Tokyo | 0 | | 2 | Budapest | 1 | | 3 | Nairobi | 0 | | 4 | Berlin | 1 | | 5 | Lisbon | 1 | | 6 | Denver | 0 | | 7 | Moscow | 0 | | 8 | Oslo | 0 | | 9 | Rio | 1 | | 10 | Cincinnati| 0 | | 11 | Helsinki | 0 | +----+-----------+---------+ 11 rows in set (0.00 sec)

Après avoir confirmé que votre table de test contient des données valides, vous pouvez quitter la console MySQL :

  • exit

Vous êtes maintenant prêt à créer l'application et à la configurer pour vous connecter à la nouvelle base de données.

Étape 3 — Création d'une nouvelle application Laravel

Vous allez maintenant créer une nouvelle application Laravel en utilisant la commande composer create-project. Cette commande Composer est généralement utilisée pour démarrer de nouvelles applications basées sur des frameworks et des systèmes de gestion de contenu existants.

Tout au long de ce guide, nous utiliserons travellist comme exemple d'application, mais vous êtes libre de changer cela pour autre chose. L'application travellist affichera une liste d'emplacements tirée d'un serveur MySQL local, destinée à démontrer la configuration de base de Laravel et à confirmer que vous êtes en mesure de vous connecter à la base de données.

Tout d'abord, allez dans le répertoire d'accueil de votre utilisateur :

  • cd ~

La commande suivante créera un nouveau répertoire travellist contenant une application Laravel minimaliste basée sur les paramètres par défaut :

  • composer create-project --prefer-dist laravel/laravel travellist

Vous obtiendrez une sortie semblable à ceci :

Output
Installing laravel/laravel (v5.8.17) - Installing laravel/laravel (v5.8.17): Downloading (100%) Created project in travellist > @php -r "file_exists('.env') || copy('.env.example', '.env');" Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 80 installs, 0 updates, 0 removals - Installing symfony/polyfill-ctype (v1.11.0): Downloading (100%) - Installing phpoption/phpoption (1.5.0): Downloading (100%) - Installing vlucas/phpdotenv (v3.4.0): Downloading (100%) - Installing symfony/css-selector (v4.3.2): Downloading (100%) ...

Lorsque l'installation est terminée, accédez au répertoire de l'application et exécutez la commande artisan de Laravel pour vérifier que tous les composants ont été installés avec succès :

  • cd travellist
  • php artisan

Vous verrez une sortie semblable à celle-ci :

Output
Laravel Framework 7.11.0 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --env[=ENV] The environment the command should run under -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug ...

Ce résultat confirme que les fichiers d'application sont en place et que les outils de la ligne de commande Laravel fonctionnent comme prévu. Cependant, nous devons encore configurer l'application pour mettre en place la base de données et quelques autres détails.

Étape 4 — Configuration de Laravel

Les fichiers de configuration Laravel sont situés dans un répertoire appelé config, dans le répertoire root de l'application. De plus, lorsque vous installez Laravel avec Composer, il crée un fichier d'environnement. Ce fichier contient des paramètres spécifiques à l'environnement actuel de l'application, qui auront la priorité sur les valeurs définies dans les fichiers de configuration ordinaires situés dans le répertoire config. Chaque installation sur un nouvel environnement nécessite un fichier d'environnement personnalisé pour définir des éléments tels que les paramètres de connexion à la base de données, les options de débogage, l'URL de l'application, entre autres, qui peuvent varier en fonction de l'environnement dans lequel l'application est exécutée.

Attention : le fichier de configuration de l'environnement contient des informations sensibles sur votre serveur, notamment les informations d'identification de la base de données et les clés de sécurité. Par conséquent, ne partagez jamais ce fichier en public.

Nous allons maintenant éditer le fichier .env afin de personnaliser les options de configuration pour l'environnement d'application actuel.

Ouvrez le fichier .env en utilisant l'éditeur de ligne de commande de votre choix. Ici, nous utiliserons nano :

  • nano .env

Même s'il y a de nombreuses variables de configuration dans ce fichier, vous n'avez pas besoin de toutes les configurer maintenant. La liste suivante contient un aperçu des variables qui nécessitent une attention immédiate :

  • APP_NAME : nom de l'application, utilisé pour les notifications et les messages.
  • APP_ENV : environnement actuel de l'application.
  • APP_KEY : utilisée pour générer des salts et des hashes, cette clé unique est automatiquement créée lors de l'installation de Laravel via Composer, vous n'avez donc pas besoin de la modifier.
  • APP_DEBUG : affichage ou non des informations de débogage côté client.
  • APP_URL : URL de base de l'application, utilisée pour générer les liens de l'application.
  • DB_DATABASE : nom de la base de données.
  • DB_USERNAME : nom d'utilisateur pour se connecter à la base de données.
  • DB_PASSWORD : mot de passe pour se connecter à la base de données.

Par défaut, ces valeurs sont configurées pour un environnement de développement local qui utilise Homestead, un boîtier Vagrant pré-packagé fourni par Laravel. Nous modifierons ces valeurs pour refléter les paramètres de l'environnement actuel de notre exemple d'application.

Si vous installez Laravel dans un environnement de développement ou de test, vous pouvez laisser l'option APP_DEBUG activée, car elle vous donnera des informations de débogage importantes pendant que vous testez l'application à partir d'un navigateur. Dans ce cas, la variable APP_ENV doit être réglée sur développement ou test.

Dans le cas où vous installez Laravel dans un environnement de production, vous devez désactiver l'option APP_DEBUG, car elle montre à l'utilisateur final des informations sensibles sur votre application. Dans ce cas, l’APP_ENV doit être réglé sur production.

Le fichier .env suivant constitue notre exemple d'application pour le développement :

Note : la variable APP_KEY contient une clé unique qui a été générée automatiquement lorsque vous avez installé Laravel via Composer. Vous n'avez pas besoin de changer cette valeur. Si vous souhaitez générer une nouvelle clé sécurisée, vous pouvez utiliser la commande php artisan key:generate.

/var/www/travellist/.env
APP_NAME=TravelList
APP_ENV=development
APP_KEY=APPLICATION_UNIQUE_KEY_DONT_COPY
APP_DEBUG=true
APP_URL=http://domain_or_IP

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password

...

Ajustez vos variables en conséquence. Lorsque vous avez terminé l'édition, enregistrez et fermez le fichier pour conserver vos modifications. Si vous utilisez nano, vous pouvez sortir en tapant CTRL+X, puis Y et ENTER pour confirmer.

Votre application Laravel est maintenant configurée, mais nous devons encore configurer le serveur web afin de pouvoir y accéder à partir d'un navigateur. Dans l'étape suivante, nous allons configurer Nginx pour qu'il serve votre application Laravel.

Étape 5 — Configuration de Nginx

Nous avons installé Laravel sur un dossier local du répertoire personnel de votre utilisateur distant, et bien que cela fonctionne bien pour les environnements de développement locaux, ce n'est pas une pratique recommandée pour les serveurs web qui sont ouverts à l'internet public. Nous allons déplacer le dossier d'application vers /var/www, qui est l'emplacement habituel des applications web fonctionnant sur Nginx.

Tout d'abord, utilisez la commande mv pour déplacer le dossier d'application avec tout son contenu vers /var/www/travellist :

  • sudo mv ~/travellist /var/www/travellist

Nous devons maintenant donner à l'utilisateur du serveur web un accès en écriture aux dossiers storage et cache, où Laravel stocke les fichiers générés par les applications :

  • sudo chown -R www-data.www-data /var/www/travellist/storage
  • sudo chown -R www-data.www-data /var/www/travellist/bootstrap/cache

Les fichiers d'application sont maintenant en ordre, mais nous devons encore configurer Nginx pour servir le contenu. Pour ce faire, nous allons créer un nouveau fichier de configuration de l'hôte virtuel à l'adresse /etc/nginx/sites-available:

  • sudo nano /etc/nginx/sites-available/travellist

Le fichier de configuration suivant contient les paramètres recommandés pour les applications Laravel sur Nginx :

/etc/nginx/sites-available/travellist
server {
    listen 80;
    server_name server_domain_or_IP;
    root /var/www/travellist/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm 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_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Copiez ce contenu dans votre fichier /etc/nginx/sites-available/travellist et, si nécessaire, ajustez les valeurs mises en évidence pour les aligner sur votre propre configuration. Enregistrez et fermez le fichier lorsque vous avez fini de le modifier.

Pour activer le nouveau fichier de configuration de l'hôte virtuel, créez un lien symbolique vers travellist dans les sites activés :

  • sudo ln -s /etc/nginx/sites-available/travellist /etc/nginx/sites-enabled/

Note : si vous avez un autre fichier d'hôte virtuel qui a été précédemment configuré pour le même server_name utilisé dans l'hôte virtuel travellist, vous devrez peut-être désactiver l'ancienne configuration en supprimant le lien symbolique correspondant dans /etc/nginx/sites-enabled/.

Pour confirmer que la configuration ne contient aucune erreur de syntaxe, vous pouvez utiliser :

  • sudo nginx -t

Vous devriez voir une sortie comme celle-ci :

Output
  • nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
  • nginx: configuration file /etc/nginx/nginx.conf test is successful

Pour appliquer les modifications, rechargez Nginx avec :

  • sudo systemctl reload nginx

Allez maintenant dans votre navigateur et accédez à l'application en utilisant le nom de domaine ou l'adresse IP du serveur, tel que défini par la directive server_name dans votre fichier de configuration :

http://server_domain_or_IP

Vous verrez une page comme ceci :

Page d'accueil de Laravel

Cela confirme que votre serveur Nginx est correctement configuré pour servir Laravel. À partir de ce point, vous pouvez commencer à construire votre application sur le squelette fourni par l'installation par défaut.

Dans la prochaine étape, nous modifierons l'itinéraire principal de l'application pour rechercher des données dans la base de données en utilisant la façade DB de Laravel.

Étape 6 — Configuration de la page principale

En supposant que vous ayez suivi toutes les étapes de ce guide jusqu'à présent, vous devriez disposer d'une application Laravel fonctionnelle et d'un tableau de base de données nommé places contenant quelques exemples de données.

Nous allons maintenant modifier l'itinéraire principal de l'application pour interroger la base de données et retourner le contenu à l’affichage de l'application.

Ouvrez le fichier de l'itinéraire principal, routes/web.php :

  • nano routes/web.php

Ce fichier est livré par défaut avec le contenu suivant :

routes/web.php
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

Les itinéraires sont définis dans ce fichier en utilisant la méthode statique Route::get, qui reçoit un chemin et une fonction de rappel comme arguments.

Le code suivant remplace la fonction de rappel de l'itinéraire principal. Il effectue 2 requêtes dans la base de données en utilisant le drapeau visited pour filtrer les résultats. Il renvoie les résultats dans une vue appelée travellist, que nous allons créer ensuite. Copiez ce contenu dans votre fichier routes/web.php, en remplaçant le code qui s'y trouve déjà :

routes/web.php
<?php

use Illuminate\Support\Facades\DB;

Route::get('/', function () {
  $visited = DB::select('select * from places where visited = ?', [1]); 
  $togo = DB::select('select * from places where visited = ?', [0]);

  return view('travellist', ['visited' => $visited, 'togo' => $togo ] );
});

Enregistrez et fermez le fichier lorsque vous avez fini de le modifier. Nous allons maintenant créer la vue qui rendra les résultats de la base de données à l'utilisateur. Créez un nouveau fichier de vue à l'intérieur de resources/views :

  • nano resources/views/travellist.blade.php

Le modèle suivant permet de créer deux listes de lieux en fonction des variables visited et togo. Copiez ce contenu dans votre nouveau fichier de vue :

resources/views/travellist/blade.php
<html>
<head>
    <title>Travel List</title>
</head>

<body>
    <h1>My Travel Bucket List</h1>
    <h2>Places I'd Like to Visit</h2>
    <ul>
      @foreach ($togo as $newplace)
        <li>{{ $newplace->name }}</li>
      @endforeach
    </ul>

    <h2>Places I've Already Been To</h2>
    <ul>
          @foreach ($visited as $place)
                <li>{{ $place->name }}</li>
          @endforeach
    </ul>
</body>
</html>

Enregistrez et fermez le fichier lorsque vous avez fini de le modifier. Maintenant, rendez-vous dans votre navigateur et rechargez l'application. Vous verrez une page comme celle-ci :

application de démonstration Laravel

Vous disposez maintenant d'une application Laravel fonctionnelle qui extrait le contenu d'une base de données MySQL.

Conclusion

Dans ce tutoriel, vous avez mis en place une nouvelle application Laravel sur une pile LEMP (Linux, Nginx, MySQL et PHP), fonctionnant sur un serveur Ubuntu 20.04. Vous avez également personnalisé votre itinéraire par défaut pour interroger le contenu de la base de données et afficher les résultats dans une vue personnalisée.

À partir de là, vous pouvez créer de nouveaux itinéraires et de nouvelles vues pour toutes les pages supplémentaires dont votre application a besoin. Consultez la documentation officielle de Laravel pour plus d'informations sur les itinéraires, les vues et le support de la base de données. Si vous déployez votre application en production, vous devriez également consulter la section d'optimisation pour connaître les différentes façons d'améliorer les performances de votre application.

Creative Commons License