Apache et Symfony
Comment configurer Apache pour un projet Symfony ?
Si vous recherchez un hébergement gratuit pour un projet Symfony, vous pouvez consulter le tutoriel Hébergement du portfolio.
Notions théoriques
Symfony est un framework PHP puissant et populaire qui permet de créer des applications Web robustes et maintenables. Il suit une architecture basée sur le design pattern MVC (Model-View-Controller) et repose sur des principes tels que la modularité et la réutilisation des composants.
Pour qu’un projet Symfony fonctionne correctement, l’environnement serveur doit être configuré avec les bonnes versions de PHP, Apache et les extensions nécessaires.
Prérequis techniques pour Symfony :
- PHP version 8.1 ou supérieure
- Extensions PHP :
curl,json,ctype,tokenizer,session,simplexml,intl,pdo,mbstring - Apache installé avec le module
mod_rewriteactivé. - Composer installé pour la gestion des dépendances.
Symfony génère des fichiers qui doivent être accessibles via un serveur Web (Apache ou Nginx). Le répertoire public de Symfony se trouve dans le dossier public/, qui sert de DocumentRoot pour le serveur Web.
Détails des étapes de configuration d’un projet Symfony sous Apache
| Élément | Description |
|---|---|
| DocumentRoot | Répertoire racine du projet Symfony qui doit pointer vers /chemin_du_projet/public/. |
| mod_rewrite | Nécessaire pour la gestion des URLs (routes Symfony). |
Fichier .env | Fichier de configuration pour les variables d'environnement (base de données, environnement). |
| Cache & Logs | Répertoires où Symfony génère les caches et fichiers de logs (var/cache et var/log). |
Une fois l'hébergement mis en place, vous pouvez cloner, installer et configurer votre projet Symfony.
Pour définir les variables d'environnement de votre projet Symfony, vous pouvez :
- utiliser un fichier
.env.localou - définir des variables d'environnement dans un fichier VirtualHost
Pour générer une chaine de caractères pour la variable d'environment "APP_SECRET",
vous pouvez utiliser la commande : php -r "echo bin2hex(random_bytes(32));"
Définir des variables d'environnement dans un fichier VirtualHost
Sur Apache, vous pouvez définir des variables d'environnement spécifiques à un VirtualHost
en utilisant la directive SetEnv.
Ces variables sont disponibles pour les scripts exécutés dans ce VirtualHost (ex. PHP),
via des fonctions comme getenv() en PHP.
Elles ne sont pas globales à tout Apache, ce qui permet une isolation par site.
SetEnv est simple mais expose les variables au processus Apache (sous www-data).
Pour plus de sécurité, envisagez des outils comme mod_env (activé par défaut)
ou des variables système via des fichiers comme /etc/environment.
Étapes pour configurer le module SetEnv d'Apache
-
Activez le module si nécessaire (généralement déjà actif sur Debian) :
sudo a2enmod env
sudo systemctl restart apache2 -
Modifiez votre fichier VirtualHost :
Ouvrez le fichier (ex./etc/apache2/sites-available/test.conf) avecsudo nano /etc/apache2/sites-available/test.conf.
Ajoutez les directivesSetEnvà l'intérieur du bloc<VirtualHost>, avant ou aprèsDocumentRoot.Exemple de configuration complète pour un site Symfony (adapté à votre contexte précédent) :
<VirtualHost *:80>
ServerName test.slam.sio.ndlp
DocumentRoot /var/www/test/public
# Définition des variables d'environnement
SetEnv APP_ENV prod
SetEnv APP_SECRET votre_secret_ici
SetEnv DATABASE_URL "mysql://user:pass@host/dbname"
<Directory /var/www/test/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/test_error.log
CustomLog ${APACHE_LOG_DIR}/test_access.log combined
</VirtualHost>- Explications :
SetEnv NOM_VAR valeur: DéfinitNOM_VAR= valeurpour ce VirtualHost.- Pour des valeurs avec espaces ou caractères spéciaux, utilisez des guillemets doubles.
- Vous pouvez ajouter autant de
SetEnvque nécessaire.
- Explications :
Pour générer une chaine de caractères pour la variable d'environment "APP_SECRET",
vous pouvez utiliser la commande : php -r "echo bin2hex(random_bytes(32));"
-
Appliquez les changements :
sudo apache2ctl configtest # Vérifie la syntaxe (doit afficher "Syntax OK")
sudo systemctl reload apache2 # Recharge sans downtime -
Vérifiez dans votre application :
Dans un script PHP (ex. votreindex.phpSymfony), accédez-y via :echo getenv('APP_ENV'); // Affiche "prod"
// Ou via $_SERVER['APP_ENV']Rechargez la page
http://test.slam.sio.ndlpet vérifiez (ex. avec unvar_dump(getenv());temporaire).
Alternatives avancées
- Pour des variables conditionnelles : Utilisez
SetEnvIf(ex.SetEnvIf Request_URI "^/admin" IS_ADMIN truepour définir une var si l'URL matche). - Variables globales : Placez
SetEnvdans/etc/apache2/apache2.confou un fichier inclus (ex. viaInclude), mais évitez pour l'isolation. - Avec mod_php : Les vars sont directement dans
$_SERVER. Pour PHP-FPM, passez-les viafastcgi_paramdans le VirtualHost. - Sécurité : Ne mettez pas de secrets sensibles en clair ; utilisez des fichiers chiffrés ou des outils comme Vault. Limitez à des vars non-sensibles pour les logs.
Si vous avez une erreur spécifique (ex. dans les logs /var/log/apache2/error.log) ou un contexte Symfony précis (ex. .env), partagez plus de détails pour affiner !
Exemple pratique
-
Créer un projet Symfony nommé
mon_projetavec les composantswebappastucePour de l'aide vous pouvez consulter l'Introduction à Symfony.
-
Configurer Apache pour le projet Symfony :
Créez un répertoire pour héberger le projet (par exemple
/var/www/mon_projet), puis copiez le projet Symfony dans ce répertoire :sudo mv mon_projet /var/www/
sudo chown -R www-data:www-data /var/www/mon_projetCréez un fichier de configuration Apache pour le projet :
sudo nano /etc/apache2/sites-available/mon_projet.confDans ce fichier, écrivez la configuration suivante :
<VirtualHost *:80>
ServerName monprojet.fr
DocumentRoot /var/www/mon_projet/public
<Directory /var/www/mon_projet/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/mon_projet_error.log
CustomLog ${APACHE_LOG_DIR}/mon_projet_access.log combined
</VirtualHost> -
Créer le fichier
.htaccess:
Il faut créer un fichier .htaccess dans le répertoire public/
contenant les règles de réécriture nécessaires pour servir l'application Symfony.
Voici le contenu du fichier public/.htaccess :
# Use the front controller as index file. It serves as a fallback solution when
# every other rewrite/redirect fails (e.g. in an aliased environment without
# mod_rewrite). Additionally, this reduces the matching process for the
# start page (path "/") because otherwise Apache will apply the rewriting rules
# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
DirectoryIndex index.php
# By default, Apache does not evaluate symbolic links if you did not enable this
# feature in your server configuration. Uncomment the following line if you
# install assets as symlinks or if you experience problems related to symlinks
# when compiling LESS/Sass/CoffeScript assets.
# Options +SymLinksIfOwnerMatch
# Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve
# to the front controller "/index.php" but be rewritten to "/index.php/index".
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
<IfModule mod_rewrite.c>
# This Option needs to be enabled for RewriteRule, otherwise it will show an error like
# 'Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden'
Options +SymLinksIfOwnerMatch
RewriteEngine On
# Determine the RewriteBase automatically and set it as environment variable.
# If you are using Apache aliases to do mass virtual hosting or installed the
# project in a subdirectory, the base path will be prepended to allow proper
# resolution of the index.php file and to redirect to the correct URI. It will
# work in environments without path prefix as well, providing a safe, one-size
# fits all solution. But as you do not need it in this case, you can comment
# the following 2 lines to eliminate the overhead.
RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$
RewriteRule .* - [E=BASE:%1]
# Sets the HTTP_AUTHORIZATION header removed by Apache
RewriteCond %{HTTP:Authorization} .+
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]
# Redirect to URI without front controller to prevent duplicate content
# (with and without `/index.php`). Only do this redirect on the initial
# rewrite by Apache and not on subsequent cycles. Otherwise we would get an
# endless redirect loop (request -> rewrite to front controller ->
# redirect -> request -> ...).
# So in case you get a "too many redirects" error or you always get redirected
# to the start page because your Apache does not expose the REDIRECT_STATUS
# environment variable, you have 2 choices:
# - disable this feature by commenting the following 2 lines or
# - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
# following RewriteCond (best solution)
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=308,L]
# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
# Rewrite all other queries to the front controller.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ %{ENV:BASE}/index.php [L]
</IfModule>
<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>
# When mod_rewrite is not available, we instruct a temporary redirect of
# the start page to the front controller explicitly so that the website
# and the generated links can still be used.
RedirectMatch 307 ^/$ /index.php/
# RedirectTemp cannot be used instead
</IfModule>
</IfModule>
Si vous effectuez des tests rapides avec Apache, vous pouvez exécuter la commande composer require symfony/apache-pack
qui va générer automatiquement le fichier .htaccess pour vous.
Assurez-vous que le paramètre AllowOverride de votre VirtualHost Apache est défini sur All pour ce répertoire,
sinon le fichier .htaccess sera ignoré.
-
Activer le VirtualHost et configurer Apache :
- Activez le site :
sudo a2ensite mon_projet- Assurez-vous que le module
mod_rewriteest activé :
sudo a2enmod rewrite- Redémarrez Apache :
sudo systemctl restart apache2 -
Configurer les permissions et les fichiers de cache/logs :
Symfony nécessite que certains répertoires soient accessibles en écriture par le serveur Web.
Afin que votre commande
gitfonctionne bien avec le propriétaire du répertoire qui a cloné le dépôt, nous vous conseillons d'ajouter votre utilisateur Linux (votre-login) au groupe www-data (utilisé par Apache), avecd la commande :sudo adduser votre-login www-data -
Configurer le fichier
hostssur la machine cliente (option si vous n'avez pas de serveur DNS):Modifiez le fichier
hostsde votre machine pour associer l’adresse IP du serveur à votre nom de domaine :ip_serveur monprojet.frinfoSi vous n'avez pas accès à un serveur DNS (Domain Name System), vous devez modifier le fichier
hostsde votre machine pour établir une association manuelle entre l'adresse IP du serveur et le nom de domaine souhaité.Le fichier
hostsagit comme une petite base de données locale, permettant à votre système d'exploitation de résoudre un nom de domaine (par exemple,monprojet.fr) en une adresse IP (par exemple,192.168.1.10) sans passer par un serveur DNS.Cette méthode est utile pour les environnements de développement ou de test où il n'est pas nécessaire de configurer un DNS public ou interne.
En pratique, cela vous permet de configurer un virtualhost et d'accéder à vos sites hébergés en saisissant des noms de domaine personnalisés dans votre navigateur, plutôt que de devoir utiliser des adresses IP directement.
-
Tester l’installation :
Ouvrez un navigateur Web et accédez à l’adresse
http://monprojet.fr. Vous devriez voir la page d’accueil par défaut de Symfony.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Dans ce TP, vous allez héberger un projet Symfony avec les spécifications suivantes :
-
Nom de domaine :
blog.frpour un blog personneladmin.blog.frpour la section d'administration
-
Prérequis :
- Installer le projet Symfony.
- Configurer deux VirtualHosts distincts pour les noms de domaines ci-dessus.
-
Étapes :
-
Créer un projet Symfony
blog --webapp.astucePour de l'aide vous pouvez consulter l'Introduction à Symfony.
-
Configurer Apache pour avoir un VirtualHost qui pointe vers
/var/www/blog/publicpourblog.fret un autre VirtualHost qui pointe vers/var/www/blog/public/adminpouradmin.blog.fr. -
Modifier le fichier
hostspour ajouter les noms de domaine sur la machine cliente. -
Tester les URLs
http://blog.frethttp://admin.blog.frpour vérifier le bon fonctionnement.
-
-
Développer les sections du site :
- Ajoutez un fichier
index.html.twigpour la page d’accueil du blog. - Ajoutez une route et une vue pour la section
admin.
- Ajoutez un fichier
Une solution
Vous devez être connecté pour voir le contenu.