
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 fichiercomposer.json
.
Utilisation de DotEnv

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

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.local
en .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.

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 :
- https://symfony.com/doc/current/setup/web_server_configuration.html
- https://symfony.com/doc/current/deployment.html
Symfony est un outil formidable, faites en bonne usage !
mouss
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
• Lien vers le commentaire
kamga orelien
Good cela a bien fonctionner chez moi. Merci
• Lien vers le commentaire
Kevin D
Top, ca marche parfaitement ! Merci beaucoup ! 😉
• Lien vers le commentaire
Julien
Bonjour,
Et merci pour cette procédure, je ne l’ai pas encore suivie mais je pense pouvoir m’en sortir. Je suis sur un serveur mutualisé O2SWITCH
Par contre, cela m’amène à une question sur l’installation des mises à jour future de l’application : Comment faire pour livrer les correctifs ultérieurs y compris les mises à jour des bundles sans écraser le répertoire uploads qui contient les images ?
Je remercie d’avance
• Lien vers le commentaire
Alex Soyer Auteur(e) de l'article
Hello Julien,
Si le binaire composer est présent sur o2switch tu peux directement utiliser composer update.
Au mieux tu peux télécharger composer.phar si le firewall te le permet.
Si jamais tout cela n’est pas possible, tu vas devoir reuploader ton dossier vendor à chaque fois…
• Lien vers le commentaire