Aller au contenu principal

Apache et Symfony

Comment configurer Apache pour un projet Symfony ?

astuce

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.

info

Prérequis techniques pour Symfony :

  1. PHP version 8.1 ou supérieure
  2. Extensions PHP : curl, json, ctype, tokenizer, session, simplexml, intl, pdo, mbstring
  3. Apache installé avec le module mod_rewrite activé.
  4. 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émentDescription
DocumentRootRépertoire racine du projet Symfony qui doit pointer vers /chemin_du_projet/public/.
mod_rewriteNécessaire pour la gestion des URLs (routes Symfony).
Fichier .envFichier de configuration pour les variables d'environnement (base de données, environnement).
Cache & LogsRépertoires où Symfony génère les caches et fichiers de logs (var/cache et var/log).
astuce

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.local ou
  • 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.

attention

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

  1. Activez le module si nécessaire (généralement déjà actif sur Debian) :

    sudo a2enmod env
    sudo systemctl restart apache2
  2. Modifiez votre fichier VirtualHost :
    Ouvrez le fichier (ex. /etc/apache2/sites-available/test.conf) avec sudo nano /etc/apache2/sites-available/test.conf.
    Ajoutez les directives SetEnv à l'intérieur du bloc <VirtualHost>, avant ou après DocumentRoot.

    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éfinit NOM_VAR= valeur pour ce VirtualHost.
      • Pour des valeurs avec espaces ou caractères spéciaux, utilisez des guillemets doubles.
      • Vous pouvez ajouter autant de SetEnv que nécessaire.
astuce

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));"

  1. Appliquez les changements :

    sudo apache2ctl configtest  # Vérifie la syntaxe (doit afficher "Syntax OK")
    sudo systemctl reload apache2 # Recharge sans downtime
  2. Vérifiez dans votre application :
    Dans un script PHP (ex. votre index.php Symfony), accédez-y via :

    echo getenv('APP_ENV');  // Affiche "prod"
    // Ou via $_SERVER['APP_ENV']

    Rechargez la page http://test.slam.sio.ndlp et vérifiez (ex. avec un var_dump(getenv()); temporaire).

Alternatives avancées

  • Pour des variables conditionnelles : Utilisez SetEnvIf (ex. SetEnvIf Request_URI "^/admin" IS_ADMIN true pour définir une var si l'URL matche).
  • Variables globales : Placez SetEnv dans /etc/apache2/apache2.conf ou un fichier inclus (ex. via Include), mais évitez pour l'isolation.
  • Avec mod_php : Les vars sont directement dans $_SERVER. Pour PHP-FPM, passez-les via fastcgi_param dans 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

  1. Créer un projet Symfony nommé mon_projet avec les composants webapp

    astuce

    Pour de l'aide vous pouvez consulter l'Introduction à Symfony.

  2. 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_projet

    Créez un fichier de configuration Apache pour le projet :

    sudo nano /etc/apache2/sites-available/mon_projet.conf

    Dans 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>
  3. 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>
astuce

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.

attention

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

  1. Activer le VirtualHost et configurer Apache :

    • Activez le site :
    sudo a2ensite mon_projet
    • Assurez-vous que le module mod_rewrite est activé :
    sudo a2enmod rewrite
    • Redémarrez Apache :
    sudo systemctl restart apache2
  2. 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 git fonctionne 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 
  3. Configurer le fichier hosts sur la machine cliente (option si vous n'avez pas de serveur DNS):

    Modifiez le fichier hosts de votre machine pour associer l’adresse IP du serveur à votre nom de domaine :

    ip_serveur monprojet.fr
    info

    Si vous n'avez pas accès à un serveur DNS (Domain Name System), vous devez modifier le fichier hosts de votre machine pour établir une association manuelle entre l'adresse IP du serveur et le nom de domaine souhaité.

    Le fichier hosts agit 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.

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


Quel est le répertoire public d'un projet Symfony ?


Quel module Apache doit être activé pour gérer les URLs de Symfony ?


Où doit pointer le DocumentRoot d'un projet Symfony ?


Quelle commande permet d'activer un site dans Apache ?



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 :

  1. Nom de domaine :

    • blog.fr pour un blog personnel
    • admin.blog.fr pour la section d'administration
  2. Prérequis :

    • Installer le projet Symfony.
    • Configurer deux VirtualHosts distincts pour les noms de domaines ci-dessus.
  3. Étapes :

    • Créer un projet Symfony blog --webapp.

      astuce

      Pour de l'aide vous pouvez consulter l'Introduction à Symfony.

    • Configurer Apache pour avoir un VirtualHost qui pointe vers /var/www/blog/public pour blog.fr et un autre VirtualHost qui pointe vers /var/www/blog/public/admin pour admin.blog.fr.

    • Modifier le fichier hosts pour ajouter les noms de domaine sur la machine cliente.

    • Tester les URLs http://blog.fr et http://admin.blog.fr pour vérifier le bon fonctionnement.

  4. Développer les sections du site :

    • Ajoutez un fichier index.html.twig pour la page d’accueil du blog.
    • Ajoutez une route et une vue pour la section admin.
Une solution