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

Laravel est l’un des frameworks d’application Web open source les plus populaires écrit en PHP. Son objectif est d’aider les développeurs à créer des applications simples et complexes en facilitant les tâches d’application fréquemment utilisées (telles que la mise en cache et l’authentification).

Dans ce didacticiel, nous allons déployer une application Laravel simple dans un environnement de production, ce qui nécessite quelques étapes communes. Par exemple, les applications doivent utiliser un utilisateur de base de données dédié dont l’accès est limité aux bases de données nécessaires. Les autorisations de fichiers doivent garantir que seuls les répertoires et les 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 tutoriel concerne le déploiement d’une application existante. Si vous souhaitez plutôt apprendre à utiliser le framework Laravel lui-même, la propre série Laravel from Scratch 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 paquet

Pour exécuter les applications Laravel, vous aurez besoin d’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 paquets.

sudo apt-get update

Les extensions PHP dont vous aurez besoin concernent la prise en charge des chaînes multi-octets et XML. Vous pouvez installer ces extensions, Composer et + unzip + (ce 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 paquet 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 supporte une variété de serveurs de base de données. Comme ce didacticiel utilise la pile LE M P, MySQL stocke les données de l’application.

Dans une installation par défaut, MySQL crée uniquement le compte administratif * root *. Il est déconseillé d’utiliser l’utilisateur * root * de la base de données sur un site Web, car il dispose de privilèges illimités sur le serveur de base de données. À la place, créons un utilisateur de base de données dédié pour 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 ++, ce que nous allons utiliser 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  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 le nom d’utilisateur «», mais vous pouvez également le personnaliser. N'oubliez pas de remplacer `` dans la ligne suivante par un mot de passe fort et sécurisé.

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

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 utilisateur que Laravel doit utiliser. Les composants de la base de données sont prêts, nous allons ensuite configurer l’application de démonstration.

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

La démo + quickstart +, distributed par Laravel sur GitHub, est une simple liste de tâches. Il vous permet d’ajouter et de supprimer des tâches et de stocker ses tâches dans la base de données MySQL.

Tout d’abord, créez un répertoire dans la racine Web de Nginx qui contiendra l’application. Comme l’application de démonstration s’appelle + quickstart +, utilisons + / var / www / html / quickstart +.

sudo mkdir -p /var/www/html/

Ensuite, changez la propriété du répertoire nouvellement créé sur votre utilisateur, de manière à pouvoir travailler avec les fichiers qu’il contient sans utiliser + sudo +.

sudo chown  /var/www/html/

Déplacez-vous dans 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 un 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 étant configurée elle-même, l’étape suivante consiste à configurer l’environnement de l’application. Cela implique la connexion de l’application à la base de données et la personnalisation de certains paramètres pour la production.

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

Au cours de cette étape, nous allons modifier certains paramètres d’application liés à la sécurité, permettre à l’application de se connecter à la base de données et préparer la base de données pour une utilisation. Ce sont des étapes nécessaires pour toutes les applications Laravel soutenues par LEMP, pas seulement pour 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 ` et `, avec les valeurs appropriées.

/var/www/html/quickstart/.env

APP_ENV=
APP_DEBUG=
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://

DB_HOST=127.0.0.1
DB_DATABASE=
DB_USERNAME=
DB_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 concerne la configuration de l’application et le second 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 +, utilisé pour les environnements de développement locaux. Pour le déploiement en production, remplacez-le 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 le mode d’affichage des erreurs (en fonction de 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’erreur détaillé. Dans les installations de production, cette valeur doit être définie sur + false + pour éviter que les informations de débogage ne soient affichées 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 ++ ici, mais vous devez le remplacer par votre propre domaine sur lequel le site Web doit être utilisé.

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]:
>

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 lisible mais non accessible en écriture pour 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, chaque fois que Laravel stocke les données téléchargées sur le support 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

Puis, accordez de manière récursive toutes les autorisations, y compris écriture et exécution, au groupe.

sudo chmod -R ug+rwx storage bootstrap/cache

Nous avons maintenant tous les fichiers de l’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. Commençons par créer un new 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/

Ouvrez le fichier de configuration nouvellement créé.

sudo nano /etc/nginx/sites-enabled/

Vous devez apporter quelques modifications nécessaires:

  • Suppression de la désignation + default_server + des directives + listen +,

  • Mise à jour de la racine Web en modifiant la directive + racine +,

  • Mise à jour de la directive + nom_serveur + pour qu’elle pointe correctement vers un nom de domaine du serveur,

  • Mise à jour de la gestion de l’URI de la demande en modifiant la directive + try_files +.

Le fichier de configuration Nginx modifié ressemblera à ceci:

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

server {
   listen
   listen

   . . .

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

   server_name  www.;

   location / {
       try_files $uri $uri/
   }

   . . .
}

Expliquons ces changements plus en détail.

L’option + default_server + est activée dans la directive + listen + du fichier de configuration par défaut, ce qui indique que le bloc serveur doit servir une demande si aucun autre bloc serveur ne convient. Cette option n’est activée que sur l’un des blocs de serveur activés. Comme nous avons laissé le bloc de serveur par défaut en place, nous allons supprimer la désignation + default_server + de ce deuxième fichier de configuration.

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

La directive + nom_serveur + spécifie la liste des noms de domaine auxquels le bloc serveur répondra. Nous avons utilisé ++ et + www. + Ici, mais vous devriez 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 rechercher un fichier existant, puis un répertoire existant, ou enfin de générer une erreur 404 Introuvable (à l’aide du paramètre + = 404 + intégré). Pour que Laravel fonctionne correctement, toutes les demandes doivent être acheminées vers Laravel 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 +, ce qui transmet la requête à le fichier + index.php +, un fichier d’application Laravel principal.

Lorsque vous avez apporté 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 de ce fichier vers le répertoire + sites-enabled +.

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

Et enfin, rechargez Nginx pour prendre en compte les modifications.

sudo systemctl reload nginx

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

S’assurer que votre déploiement fonctionne à ce stade est facile. Il suffit de visiter + http: // + 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, que vous pourrez vérifier en fermant le navigateur et en rouvrant le site.

Dans la prochaine et dernière étape, nous allons configurer le cryptage TLS pour desservir l’application via une connexion sécurisée.

Étape 6 - Sécurisation de votre application avec TLS

Pour terminer la configuration de la 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 le nom d’utilisateur 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 récemment déployée, nous suivrons le https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16. -04 [Comment sécuriser Nginx avec Let’s Encrypt sur Ubuntu 16.04] avec quelques petites modifications pour tenir compte de la configuration de cette application Laravel spécifique.

Les seuls changements seront:

  • Utilisation de l’emplacement de l’application Laravel (+ / var / www / html / +) 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 / + 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= -d  -d

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  www.;
       return 301 https://$server_name$request_uri;
}

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

       include snippets/ssl-.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  www.;

       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’erreur de syntaxe dans la configuration.

sudo nginx -t

Si toutes les modifications ont abouti, vous obtiendrez un résultat ressemblant à 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 +: // +. 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 utilisant 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, reportez-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.