Symfony 4 : Mise en production (avec Apache HTTPD)

Symfony 4 : Mise en production (avec Apache HTTPD)
3.5 (69.09%) 22 vote[s]

Mettre sur un serveur de production une application PHP Symfony 4 avec Apache HTTPD

Comment mettre une application Symfony 4 en production sans erreur

Vous venez de terminer votre application Symfony et vous souhaitez la mettre en production ? Rien de plus simple, à condition de savoir comment le framework fonctionne en mode dev / prod et globalement comment fonctionne un serveur web.

Symfony : Deux types de mode

Sur Symfony par défaut vous disposez de deux modes :

  • Le mode dev : Il comporte des modules spécifiques (comme le WebProfiler (la barre d’outils en bas de votre écran lorsque vous êtes sur le front)), logue certaines informations…
  • Le mode prod : Il ne comporte que les modules dont vous avez besoin

Vous pouvez facilement trouver les modules de dev (require-dev) ou de prod (require) dans votre fichier composer.json.

Utilisation de DotEnv

Utilisation de .env ou %env()% dans une application Symfony 4

Utilisation de %env()% dans les fichiers de configuration YML

A partir de Symfony 4.2, DotEnv est utilisé de manière différente, mais grosso-modo voici comment cela fonctionne.

Ces deux modes utilisent le fichier .env. Cependant certaines informations peuvent être réécrites depuis les fichiers .env.local ou .env.test. Attention si vous utilisez DotEnv en production, la dépendance symfony/dotenv doit se trouver dans require et non pas require-dev) sous peine de se retrouver avec un message d’erreur comme celui-ci :

Fatal error: Uncaught RuntimeException: The "APP_ENV" environment variable is not set to "prod". Please run "composer require symfony/dotenv" to load the ".env" files configuring the application. in /home/alex/Projects/my-project/config/bootstrap.php:13 Stack trace: #0 /home/alex/Projects/my-project/public/index.php(10): require() #1 {main} thrown in /home/alex/Projects/my-project/config/bootstrap.php on line 13

Pour ma part j’utilise le .env pour stocker les informations de mon application en production. J’utilise le .env.local pour réécrire les informations de mon fichiers .env avec mes informations de dev (base de données, serveur de mail…).

There are no commands defined in the « server » namespace.

Si vous avez le message d’erreur ci-dessus à la suite par exemple d’une commande php bin/console server:start, vous avez probablement la ligne suivante dans votre fichier .env :

APP_ENV=prod

Remplacez-là par :

APP_ENV=dev

Etape 1 : Optimiser son application Symfony en mode production

Voici une partie de mon script pour envoyer mon application Symfony sur mon serveur de production.

rm -rf var/cache
composer install --no-dev --optimize-autoloader
php bin/console cache:clear --env=prod --no-debug
yarn run build

Etape 2 : Mettre ses fichiers en ligne sur un serveur web

Fichiers Symfony visible à la racine du serveur web Apache HTTPD

Liste des fichiers à la racine d’une application Symfony 4.2.1

Nous allons prendre ici exemple avec Apache Web Server (HTTP). Suivant votre hébergement, vous devez déposer vos fichiers dans www ou /var/www, je ne dois rien vous apprendre jusqu’ici ;-).

Si jamais vous tenter d’accéder à vos fichiers une fois téléversé, vous obtiendrez la liste de vos fichiers sur le serveur, c’est normal : il faut dire au serveur web d’aller taper dans le dossier public/ pour pouvoir exécuter votre application Symfony.

Vous devrez sans doute supprimer le fichier .env.local s’il contient vos informations locales, car il risque de poser conflit avec .env si jamais des informations similaires s’y trouvent (notamment l’accès à la base de données).

ClassNotFoundException

Attempted to load class "WebProfilerBundle" from namespace "Symfony\Bundle\WebProfilerBundle".Did you forget a "use" statement for another namespace?

Pour éviter de se retrouver avec cette erreur, pensez à mettre votre fichier de configuration en mode production pour que Symfony n’aille pas chercher les bundle de dev.

Il faut également penser à mettre l’application en mode production dans le fichier .env :

APP_ENV=prod

Etape 3 : Configurer le serveur web d’Apache

Voici mon fichier .htaccess dans www. Il est personnalisé mais facilement compréhensible et adaptable.

<IfModule mod_rewrite.c>

    RewriteEngine On

    # remove "www" from URI
    RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
    RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]

    # force HTTPS
    RewriteCond %{HTTPS} !on
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # use public as starting point
    RewriteRule ^$ public/ [L]
    RewriteRule (.*) public/$1 [L]

</IfModule>

Il vous faudra ensuite créer un second fichier .htaccess, celui-ci à placer dans public/.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

Ce fichier .htaccess stipule que si vous ne demandez pas explicitement un fichier ou un dossier (comme une image qui serait accessible via domaine.fr/public/images/mon-logo.png par exemple), alors on redirige sur index.php (notre application Symfony).

Conclusion

Vous venez de mettre votre application Symfony 4 + en production, félicitations ! Si jamais vous avez des interrogations, la documentation (en anglais) est disponible ici : https://symfony.com/doc/current/deployment.html

Symfony est un outil formidable, faites en bonne usage !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.