SLBCloud
Intermédiaire8 min de lecture

Héberger plusieurs sites sur une machine

Un vhost par site, l'isolation des utilisateurs et des pools PHP, et pourquoi un site compromis ne doit pas emporter les autres.

Un VPS modeste héberge sans peine une dizaine de sites de faible trafic. La question n'est pas la puissance, c'est l'isolation : par défaut, tout tourne sous le même utilisateur, et une faille dans l'un donne accès à tous les autres.

Un dossier et un utilisateur par site

bash
sudo adduser --system --group --home /var/www/site-a --no-create-home site-a
sudo mkdir -p /var/www/site-a/public
sudo chown -R site-a:site-a /var/www/site-a

Un pool PHP par site

C'est la pièce maîtresse : chaque site exécute son PHP sous son propre compte, avec son propre socket. Un site compromis ne peut alors pas lire les fichiers du voisin.

/etc/php/8.3/fpm/pool.d/site-a.conf

ini
[site-a]
user = site-a
group = site-a
listen = /run/php/site-a.sock
listen.owner = www-data
listen.group = www-data

pm = ondemand
pm.max_children = 8
pm.process_idle_timeout = 30s

php_admin_value[open_basedir] = /var/www/site-a:/tmp
php_admin_value[disable_functions] = exec,passthru,shell_exec,system

ondemand plutôt que dynamic

Avec ondemand, les processus PHP ne démarrent qu'à la première visite et s'arrêtent après trente secondes d'inactivité. Sur une machine qui héberge dix sites dont huit reçoivent trois visiteurs par jour, cela libère beaucoup de mémoire.

Le vhost correspondant

nginx
server {
    listen 80;
    server_name site-a.fr;
    root /var/www/site-a/public;
    index index.php;

    location / { try_files $uri $uri/ /index.php?$query_string; }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/site-a.sock;
    }

    location ~ /\. { deny all; }

    access_log /var/log/nginx/site-a.access.log;
    error_log  /var/log/nginx/site-a.error.log;
}

Des journaux séparés par site paraissent superflus jusqu'au jour où l'un d'eux se fait marteler : vous voyez immédiatement lequel.

Un certificat pour tous

bash
sudo certbot --nginx -d site-a.fr -d www.site-a.fr -d site-b.fr -d www.site-b.fr

Un seul certificat pour tout, ou un par site ?

Un certificat unique est plus simple à renouveler, mais si un seul domaine cesse de résoudre, le renouvellement échoue en entier et tous vos sites passent en erreur le même jour. Au-delà de trois ou quatre sites, préférez un certificat par site.

Combien de sites tient une machine ?

MémoireSites de faible traficRemarque
4 Go5 à 10WordPress, vitrines, blogs
8 Go15 à 25Avec une base de données par site
16 Go30 et plusLa base devient le facteur limitant

Bloqué malgré tout ? Ouvrez un ticket : on répond en français, et on regarde votre machine si besoin.

Ouvrir un ticket