Symfony 4 : Mise en production (avec Apache HTTPD)

Utilisation de Symfony 4 en production avec Apache HTTPD

Mise en place de Symfony 4 en production

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 dev. J’utilise le .env.local pour réécrire les informations de mon fichiers .env avec mes informations de production (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 comme php bin/console server:start, préfixez votre commande de l’environnement comme ceci :

export APP_ENV=dev && php bin/console server:start

PHP Fatal error: Uncaught Error: Class ‘Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle’ not found in /home/alex/Projects/kantoch.io/www/api/src/Kernel.php:23

Il vous faut installer le paquet Doctrine Migration en mode prod et non en mode dev :

composer require doctrine/doctrine-migrations-bundle

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.

#!/bin/bash
set -e

OUTPUT_FILE="../website.com.zip"

export APP_ENV=prod
export APP_DEBUG=0

# Optimisations Symfony
composer install --no-dev --optimize-autoloader
php bin/console cache:clear

# Suppression fichiers inutiles
rm -rf var/cache
rm -rf var/log

# Si utilisation de Symfony Encore
if [[ -e "./package.json" ]]; then
    yarn run build
fi

# Construction de l'archive à envoyer sur le serveur web
if [[ -e "${OUTPUT_FILE}" ]]; then
    rm -v "${OUTPUT_FILE}"
fi

zip -9 -rqq "${OUTPUT_FILE}" . \
    -x=*docker/* \
    -x=*.idea/* \
    -x=*.bin/* \
    -x=*.assets/* \
    -x=*.templates/* \
    -x=*.tests/* \
    -x=*.dockerignore* \
    -x=*.git* \
    -x=*docker-compose.yaml* \
    -x=*Dockerfile* \
    -x=*README.md* \
    -x=*.phpunit** \
    -x=*./config/jwt/*.pem*

du -hs "${OUTPUT_FILE}"
md5sum "${OUTPUT_FILE}"

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.

Pour ma part étant chez OVH avec un hébergement simple, je ne peux pas utiliser de système de gestion de version comme git. ; ni même utiliser composer sur le serveur pour installer les dépendances…

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 (ce que nous verrons après).

Par défaut, les fichiers .env.* ne sont pas commités !

Vous devrez sans doute renommer le fichier .env.localen .env pour que Symfony puisse l’utiliser.

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.

ClassNotFoundException WebProfilerBundle Symfony 4

Problème de class non trouvée avec Symfony 4 en production

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

Si vous vous retrouvez sur un serveur mutualisé comme moi chez OVH, vous devrez passer par le fichier .htaccess pour faire marcher Symfony.

Si jamais vous avez la main, il vous est possible de simplement utiliser la configuration du vhost.

Configurer Symfony avec le vhost Apache httpd

Voici un fichier de configuration plutôt basique, n’oubliez pas le Require all granted avec le bon chemin sous peine d’une erreur « 403 Forbidden ».

<VirtualHost *:80>
    ServerName security-helpzone.com
    ServerAlias www.security-helpzone.com
    DocumentRoot /var/www/shz/public

    <Directory /var/www/shz/public>
        Require all granted
    </Directory>

    ErrorLog /var/log/apache2/shz_error.log
    CustomLog /var/log/apache2/shz_access.log combined
</VirtualHost>

Configurer Symfony avec .htaccess

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/.

# Redirect all requests to index.php
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.php [QSA,L]
</IfModule>

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 :

Symfony est un outil formidable, faites en bonne usage !

One Response to “Symfony 4 : Mise en production (avec Apache HTTPD)

  • Bonjour,

    Pouvez-vous me dire, s’il vous plaît, quelle solution pour cette erreur :

    Warning: require(/home/devmussfym/www/config/bootstrap.php): failed to open stream: No such file or directory in /home/devmussfym/www/public/index.php on line 7

    Warning: require(/home/devmussfym/www/config/bootstrap.php): failed to open stream: No such file or directory in /home/devmussfym/www/public/index.php on line 7

    Fatal error: require(): Failed opening required ‘/home/devmussfym/www/config/bootstrap.php’ (include_path=’.:/usr/local/php7.1/lib/php’) in /home/devmussfym/www/public/index.php on line 7

    NB : Je suis sur symfnoy 4.2.9 5 ( mon projet était sur sf 3.3.6 que je bascule en sf 4.29 => dev-muss.fr)

    Merci

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.