Comment déployer une application Laravel avec Nginx sur Ubuntu 16.04

De Get Docs
Aller à :navigation, rechercher

Laravel est l'un des frameworks d'applications Web open source les plus populaires écrits en PHP. Il vise à aider les développeurs à créer des applications simples et complexes en facilitant les tâches d'application fréquemment utilisées (comme la mise en cache et l'authentification).

Dans ce didacticiel, nous allons déployer une application Laravel simple avec un environnement de production à l'esprit, ce qui nécessite quelques étapes courantes. Par exemple, les applications doivent utiliser un utilisateur de base de données dédié avec un accès limité uniquement aux bases de données nécessaires. Les autorisations de fichiers doivent garantir que seuls les répertoires et fichiers nécessaires sont accessibles en écriture. Les paramètres de l'application doivent être pris en compte pour s'assurer qu'aucune information de débogage n'est affichée à l'utilisateur final, ce qui pourrait exposer les détails de la configuration de l'application.

Ce didacticiel concerne le déploiement d'une application existante. Si vous souhaitez plutôt apprendre à utiliser le framework Laravel lui-même, la série Laravel from Scratch de Laravel est un bon point de départ.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de :

Étape 1 - Installation des dépendances de package

Pour exécuter des applications Laravel, vous aurez besoin de quelques extensions PHP et d'un gestionnaire de dépendances PHP appelé Composer en plus de la pile LEMP de base.

Commencez par mettre à jour le cache du gestionnaire de packages.

sudo apt-get update

Les extensions PHP dont vous aurez besoin concernent la prise en charge des chaînes multi-octets et la prise en charge XML. Vous pouvez installer ces extensions, Composer et unzip (qui permet à Composer de gérer les fichiers zip) en même temps.

sudo apt-get install php7.0-mbstring php7.0-xml composer unzip

Maintenant que les dépendances du package sont installées, nous allons créer et configurer une base de données MySQL et un compte utilisateur dédié pour l'application.

Étape 2 - Configuration de MySQL

Laravel prend en charge une variété de serveurs de base de données. Étant donné que ce didacticiel utilise la pile LEMP, MySQL stockera les données de l'application.

Dans une installation par défaut, MySQL crée uniquement le compte administratif root. C'est une mauvaise pratique de sécurité d'utiliser l'utilisateur de base de données root dans un site Web car il dispose de privilèges illimités sur le serveur de base de données. Au lieu de cela, créons un utilisateur de base de données dédié à l'application Laravel, ainsi qu'une nouvelle base de données à laquelle l'utilisateur Laravel sera autorisé à accéder.

Connectez-vous au compte administratif MySQL root.

mysql -u root -p

Vous serez invité à entrer le mot de passe que vous avez défini pour le compte MySQL root lors de l'installation.

Commencez par créer une nouvelle base de données appelée laravel, que nous utiliserons pour le site Web. Vous pouvez choisir un nom différent, mais assurez-vous de vous en souvenir car vous en aurez besoin plus tard.

CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Ensuite, créez un nouvel utilisateur qui sera autorisé à accéder à cette base de données. Ici, nous utilisons laraveluser comme nom d'utilisateur, mais vous pouvez également le personnaliser. N'oubliez pas de remplacer password dans la ligne suivante par un mot de passe fort et sécurisé.

GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';

Videz les privilèges pour informer le serveur MySQL des modifications.

FLUSH PRIVILEGES;

Et quittez MySQL.

EXIT;

Vous avez maintenant configuré une base de données dédiée et le compte d'utilisateur que Laravel doit utiliser. Les composants de la base de données sont prêts, alors nous allons ensuite configurer l'application de démonstration.

Étape 3 - Configuration de l'application de démonstration

L'application de démonstration quickstart, distribuée par Laravel sur GitHub, est une simple liste de tâches. Il vous permet d'ajouter et de supprimer des tâches et stocke ses tâches dans la base de données MySQL.

Tout d'abord, créez un répertoire dans la racine Web Nginx qui contiendra l'application. Étant donné que l'application de démonstration s'appelle quickstart, utilisons /var/www/html/quickstart.

sudo mkdir -p /var/www/html/quickstart

Ensuite, changez la propriété du répertoire nouvellement créé en votre utilisateur, afin que vous puissiez travailler avec les fichiers à l'intérieur sans utiliser sudo.

sudo chown sammy:sammy /var/www/html/quickstart

Déplacez-vous vers le nouveau répertoire et clonez l'application de démonstration à l'aide de Git.

cd /var/www/html/quickstart
git clone https://github.com/laravel/quickstart-basic .

Git téléchargera tous les fichiers du référentiel de l'application de démonstration. Vous verrez une sortie qui ressemble à ceci :

Git outputCloning into '.'...
remote: Counting objects: 263, done.
remote: Total 263 (delta 0), reused 0 (delta 0), pack-reused 263
Receiving objects: 100% (263/263), 92.75 KiB | 0 bytes/s, done.
Resolving deltas: 100% (72/72), done.
Checking connectivity... done.

Ensuite, nous devons installer les dépendances du projet. Laravel utilise Composer pour gérer la gestion des dépendances, ce qui facilite l'installation des packages nécessaires en une seule fois.

composer install

La sortie quelque peu longue montrera la progression de l'installation pour toutes les dépendances du projet :

Composer outputLoading composer repositories with package information
Installing dependencies (including require-dev) from lock file
. . .
Generating autoload files
> php artisan clear-compiled
> php artisan optimize
Generating optimized class loader

L'application elle-même est configurée, l'étape suivante consiste donc à configurer l'environnement de l'application. Cela implique de connecter l'application et la base de données et de personnaliser certains paramètres pour la production.

Étape 4 - Configuration de l'environnement d'application

Dans cette étape, nous allons modifier certains paramètres d'application liés à la sécurité, autoriser l'application à se connecter à la base de données et préparer la base de données pour son utilisation. Ce sont des étapes nécessaires pour toutes les applications Laravel soutenues par LEMP, pas seulement l'application de démonstration que nous utilisons ici.

Ouvrez le fichier de configuration de l'environnement Laravel avec nano ou votre éditeur de texte préféré.

sudo nano /var/www/html/quickstart/.env

Vous devrez apporter les modifications suivantes au fichier. Assurez-vous de mettre à jour les variables d'espace réservé, comme password et example.com, avec les valeurs appropriées.

/var/www/html/quickstart/.env

APP_ENV=production
APP_DEBUG=false
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://example.com

DB_HOST=127.0.0.1
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=password

. . .

Enregistrez le fichier et quittez.

Passons en revue ces changements plus en détail. Il y a deux blocs de configuration ici ; le premier est pour la configuration de l'application et le second pour la configuration de la base de données.

Dans la section de configuration de l'application :

  • La variable APP_ENV indique l'environnement système dans lequel l'application est exécutée. La valeur par défaut est local qui est utilisée pour les environnements de développement locaux. Pour le déploiement en production, il doit être remplacé par production, comme nous l'avons fait ici. La modification de cette variable contrôle la verbosité du journal, les paramètres de mise en cache et la façon dont les erreurs sont affichées (selon l'application). Avec les paramètres local, il est configuré pour faciliter le développement et le débogage, ce qui est pratique lorsque vous travaillez sur une application, mais ne doit pas être utilisé dans une configuration de production.
  • La variable APP_DEBUG complète APP_ENV et active ou désactive explicitement les informations de débogage et l'affichage détaillé des erreurs. Sur les configurations de production, cette valeur doit être définie sur false pour empêcher l'affichage des informations de débogage aux utilisateurs.
  • La variable APP_URL spécifie l'adresse IP ou le nom de domaine sous lequel le site doit être accessible. Nous avons utilisé le nom de domaine example.com ici, mais vous devez le remplacer par votre propre domaine avec lequel le site Web doit être accessible.

La section de configuration de la base de données est un peu plus simple :

  • DB_DATABASE est le nom de la base de données.
  • DB_USERNAME est le nom de l'utilisateur MySQL que l'application doit utiliser.
  • DB_PASSWORD est le mot de passe de la base de données pour cet utilisateur.

Ensuite, nous devons exécuter database migrations, qui remplira la base de données nouvellement créée avec les tables nécessaires au bon fonctionnement de l'application de démonstration.

php artisan migrate

Artisan demandera de confirmer si nous avons l'intention de l'exécuter en mode de production. Répondez y à la question. Il exécutera ensuite les tâches de base de données nécessaires.

Artisan output**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? [y/N] (yes/no) [no]:
 > y

Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrated: 2015_10_27_141258_create_tasks_table

Nous avons maintenant Laravel entièrement installé et configuré. Ensuite, nous devons configurer Nginx pour servir l'application.

Étape 5 - Configuration de Nginx

Le répertoire de l'application appartient à notre utilisateur système, sammy, et est accessible en lecture mais pas en écriture par le serveur Web. Ceci est correct pour la majorité des fichiers d'application, mais peu de répertoires nécessitent un traitement spécial. Plus précisément, partout où Laravel stocke les médias téléchargés et les données mises en cache, le serveur Web doit pouvoir non seulement y accéder, mais également y écrire des fichiers.

Changeons la propriété du groupe des répertoires storage et bootstrap/cache en www-data.

sudo chgrp -R www-data storage bootstrap/cache

Accordez ensuite de manière récursive toutes les autorisations, y compris l'écriture et l'exécution, au groupe.

sudo chmod -R ug+rwx storage bootstrap/cache

Nous avons maintenant tous les fichiers d'application de démonstration en place avec les autorisations appropriées. Ensuite, nous devons modifier la configuration de Nginx pour qu'elle fonctionne correctement avec l'installation de Laravel. Tout d'abord, créons un nouveau fichier de configuration de bloc de serveur pour notre application en copiant le fichier par défaut.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

Ouvrez le fichier de configuration nouvellement créé.

sudo nano /etc/nginx/sites-available/example.com

Vous devrez apporter quelques modifications nécessaires :

  • Suppression de la désignation default_server des directives listen,
  • Mise à jour de la racine web en changeant la directive root,
  • Mise à jour de la directive server_name pour pointer correctement vers un nom de domaine pour le serveur,
  • Mise à jour de la gestion de l'URI de requête en modifiant la directive try_files.

Le fichier de configuration Nginx modifié ressemblera à ceci :

/etc/nginx/sites-enabled/example.com

server {
    listen 80;
    listen [::]:80;
    
    . . .

    root /var/www/html/quickstart/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name example.com www.example.com;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    . . .
}

Expliquons ces changements plus en détail.

La directive listen dans le fichier de configuration par défaut a l'option default_server activée, qui spécifie que le bloc serveur doit répondre à une demande si aucun autre bloc serveur ne convient. Un seul des blocs de serveur activés peut avoir cette option activée. Comme nous avons laissé le bloc de serveur par défaut en place, nous supprimerons la désignation default_server de ce deuxième fichier de configuration.

La directive root spécifie où les fichiers d'application sont stockés. L'application Laravel est stockée dans /var/www/html/quickstart, mais seul le sous-répertoire /public doit être exposé à Internet ; tous les autres fichiers d'application ne doivent pas du tout être accessibles via le navigateur. Pour respecter ces bonnes pratiques, nous définissons la racine Web sur /var/www/html/quickstart/public.

La directive server_name spécifie la liste des noms de domaine auxquels le bloc serveur répondra. Nous avons utilisé example.com et www.example.com ici, mais vous devez les remplacer par le nom de domaine que vous souhaitez utiliser pour votre site Web.

Nous avons également modifié le traitement de l'URI de la demande. Les paramètres par défaut indiquent au serveur Web de trouver un fichier existant, puis un répertoire existant, ou enfin de générer une erreur 404 Not Found (en utilisant le paramètre =404 intégré). Pour que Laravel fonctionne correctement, toutes les requêtes doivent être acheminées vers Laravel lui-même. Cela signifie que nous supprimons le gestionnaire d'erreurs 404 par défaut de Nginx et le définissons sur /index.php?$query_string, qui transmet la requête de requête au fichier index.php, un fichier d'application principal de Laravel.

Lorsque vous avez effectué les modifications ci-dessus, vous pouvez enregistrer et fermer le fichier. Nous devons activer le nouveau fichier de configuration en créant un lien symbolique depuis ce fichier vers le répertoire sites-enabled.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Et enfin recharger Nginx pour prendre en compte les changements.

sudo systemctl reload nginx

Maintenant que Nginx est configuré pour servir l'application de démonstration Laravel, tous les composants sont configurés.

Il est facile de s'assurer que votre déploiement fonctionne à ce stade. Visitez simplement http://example.com dans votre navigateur préféré. Vous verrez une page avec l'application de tâche simple, et vous pouvez essayer d'ajouter ou de supprimer des tâches. Toutes les modifications que vous apportez seront enregistrées dans la base de données et conservées pour les visites ultérieures sur le site Web, ce que vous pourrez vérifier en fermant le navigateur et en ouvrant à nouveau le site.

Dans la prochaine et dernière étape, nous configurerons le cryptage TLS pour servir l'application via une connexion sécurisée.

Étape 6 - Sécuriser votre application avec TLS

Pour terminer la configuration de production, il est recommandé de servir l'application via HTTPS sécurisé à l'aide de TLS. Cela garantira que toutes les communications entre l'application et ses visiteurs seront cryptées, ce qui est particulièrement important si l'application demande des informations sensibles telles que l'identifiant ou le mot de passe.

Let's Encrypt est une autorité de certification gratuite qui facilite l'ajout de TLS à votre site Web. Pour activer HTTPS pour l'application fraîchement déployée, nous suivrons le tutoriel Comment sécuriser Nginx avec Let's Encrypt sur Ubuntu 16.04 avec quelques petites modifications pour s'adapter à la configuration de cette application Laravel spécifique.

Les seuls changements seront :

  • Utilisation de l'emplacement de l'application Laravel (/var/www/html/quickstart) au lieu de la racine Web par défaut (/var/www/html) lors de la demande d'un certificat SSL.
  • Modification du fichier de configuration /etc/nginx/sites-available/example.com au lieu du fichier de blocage du serveur par défaut.

Plus précisément, la commande pour obtenir le certificat sera :

sudo certbot certonly --webroot --webroot-path=/var/www/html/quickstart -d example.com -d www.example.com

Et la version finale du fichier de configuration /etc/nginx/sites-available/example.com ressemblera à ceci

/etc/nginx/sites-enabled/example.com

server {
        listen 80;
        listen [::]:80;

        server_name example.com www.example.com;
        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        include snippets/ssl-example.com.conf;
        include snippets/ssl-params.conf;

        root /var/www/html/quickstart/public;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }

        location ~ /.well-known {
                allow all;
        }
}

Assurez-vous de vérifier qu'il n'y a pas d'erreurs de syntaxe dans la configuration.

sudo nginx -t

Si toutes les modifications ont réussi, vous obtiendrez un résultat qui ressemble à ceci :

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

Si tel est le cas, vous pouvez redémarrer Nginx en toute sécurité pour appliquer les modifications.

sudo systemctl restart nginx

Le certificat Let's Encrypt TLS/SSL sera entièrement en place et l'application sera disponible via une connexion sécurisée. Pour vérifier si tout fonctionne comme prévu, visitez simplement https://example.com. Vous devriez voir le même formulaire de demande qu'avant, mais cette fois la connexion sera entièrement sécurisée.

Conclusion

Vous avez maintenant déployé avec succès une application de démonstration livrée avec Laravel dans un environnement de production à l'aide de la pile LEMP. Avec les applications du monde réel, la liste des tâches de configuration peut impliquer davantage d'étapes et d'actions spécifiques à l'application. En cas de doute, référez-vous toujours à la documentation de l'application que vous déployez, mais vous pouvez également trouver de nombreuses informations utiles dans la documentation officielle de Laravel.