03-comment-je-travaille/vps/03-vhosts-multisite.md

Vhosts Apache & multisite Telaria

Prérequis : stack web installée (02-stack-web.md), TLS configuré (04-tls-https.md). Telaria est une application multisite : un seul déploiement Symfony sert plusieurs domaines avec des contenus distincts, grùce au SiteResolver du bundle tlr-symfony.


1. Structure des répertoires

/var/www/
└── telaria/
    ├── public/          ← document root Apache (index.php)
    ├── src/
    ├── templates/
    ├── var/
    │   ├── cache/       ← chown www-data
    │   ├── log/         ← chown www-data
    │   └── rag/         ← index SQLite kNN (www-data + setgid)
    ├── vendor/
    ├── .env
    └── .env.local       ← secrets (non versionnĂ©, non commitĂ©)

Permissions correctes :

sudo chown -R ubuntu:www-data /var/www/telaria
sudo find /var/www/telaria -type d -exec chmod 750 {} \;
sudo find /var/www/telaria -type f -exec chmod 640 {} \;

# var/ : www-data doit pouvoir écrire (cache, logs, sessions)
sudo chown -R www-data:www-data /var/www/telaria/var
sudo chmod -R ug+rwX /var/www/telaria/var

2. Vhost type — HTTP + HTTPS

Un vhost se décompose toujours en deux blocs :

  • HTTP (port 80) : redirige vers HTTPS (301)
  • HTTPS (port 443) : sert l'application
# /etc/apache2/sites-available/telaria.conf

<VirtualHost *:80>
    ServerName  telaria.dev
    ServerAlias www.telaria.dev

    RewriteEngine On
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
    ServerName  telaria.dev
    ServerAlias www.telaria.dev

    Protocols h2 http/1.1

    DocumentRoot /var/www/telaria/public

    <Directory /var/www/telaria/public>
        AllowOverride None
        Require all granted
        FallbackResource /index.php
    </Directory>

    # PHP-FPM via socket UNIX
    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/run/php/php8.5-fpm.sock|fcgi://telaria.dev"
    </FilesMatch>

    # TLS
    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/telaria.dev/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/telaria.dev/privkey.pem

    # OCSP Stapling
    SSLUseStapling On

    # Logs
    ErrorLog  ${APACHE_LOG_DIR}/telaria.dev-error.log
    CustomLog ${APACHE_LOG_DIR}/telaria.dev-access.log combined
</VirtualHost>
sudo a2ensite telaria.conf
sudo systemctl reload apache2

3. Multisite — comment Telaria sert plusieurs domaines

Telaria implĂ©mente le multisite via le bundle tlr-symfony : chaque requĂȘte HTTP est interceptĂ©e par un SiteResolver qui identifie le site courant Ă  partir du Host header.

Principe

RequĂȘte HTTP → Apache → Symfony → SiteResolver
                                       │
                              lit Host: telaria.dev
                                       │
                              rĂ©sout → entitĂ© Site
                                       │
                              injecte  SiteContext
                                       │
                              controllers, templates, CMS
                              adaptent leur réponse au site

Un seul vhost Apache — tous les sous-domaines

Le certificat wildcard *.telaria.dev couvre tous les sous-domaines. Apache les attrape tous avec un ServerAlias wildcard :

<VirtualHost *:443>
    ServerName  telaria.dev
    ServerAlias *.telaria.dev

    # ... mĂȘme config PHP-FPM, mĂȘme DocumentRoot
    # C'est Symfony (SiteResolver) qui différencie les sites, pas Apache
</VirtualHost>

Entité Site en base de données

Chaque site est une ligne dans la table site :

id host name active
1 telaria.dev Telaria true
2 docs.telaria.dev Telaria Docs true

Le SiteResolver fait une requĂȘte Doctrine sur le Host header → retourne le Site courant → injecte un SiteContext dans les services qui en ont besoin (CMS, templates, etc.).

CMS multi-domaines

Le bundle tlr-symfony fournit un moteur CMS (CmsContent, CmsPage) scopĂ© par site. Chaque CmsPage appartient Ă  un Site. Une URL canonique custom peut ĂȘtre dĂ©finie par page (feature F3).


4. Vhosts versionnĂ©s — tlr-vhosts

Les fichiers de configuration Apache ne sont pas modifiés directement sur le serveur : ils sont versionnés dans le dépÎt tlr-vhosts et déployés via Ansible (tlr-ansible).

tlr-vhosts/
├── telaria.conf          ← vhost telaria.dev
├── adoption.conf         ← vhost adoption.lan (prĂ©prod)
└── ...

Le rĂŽle Ansible system copie les fichiers .conf vers /etc/apache2/sites-available/ et appelle a2ensite. Modification d'un vhost = commit dans tlr-vhosts + ansible-playbook.


5. Activer / recharger

# Activer un site
sudo a2ensite telaria.conf
sudo systemctl reload apache2

# Désactiver un site
sudo a2dissite telaria.conf
sudo systemctl reload apache2

# Tester la config avant reload
sudo apache2ctl configtest
sudo apachectl -t -D DUMP_VHOSTS

6. Diagnostics

# Vérifier que le vhost répond
curl -I https://telaria.dev
curl -I --http2 https://telaria.dev   # vérifier HTTP/2

# Vérifier le bon vhost résolu
sudo apachectl -t -D DUMP_VHOSTS | grep telaria

# Logs en temps réel
sudo tail -f /var/log/apache2/telaria.dev-error.log

Étape suivante : 04-tls-https.md

Assistant documentaire

Posez une question sur la documentation. Les rĂ©ponses citent leurs sources — un clic ouvre le document Ă  gauche.

Loading…
Loading the web debug toolbar…
Attempt #