Héberger plusieurs domaines sur une même machine est normal et économique. Ce qui décide de la sûreté, c'est leur séparation : répertoires distincts, utilisateurs de base distincts, et idéalement utilisateurs système distincts.
La disposition
/var/www/
site-one/ public/ storage/
site-two/ public/ storage/
site-three/ public/ storage/
Chaque racine de documents pointe sur son propre répertoire public. Rien au-dessus n'est joignable depuis le web, donc la configuration et le stockage se trouvent hors de portée de toute URL.
Un bloc serveur par domaine
server {
listen 443 ssl;
server_name one.example;
root /var/www/site-one/public;
include snippets/php.conf;
}
Séparer les bases de données
CREATE DATABASE site_one CHARACTER SET utf8mb4;
CREATE USER 'site_one'@'localhost' IDENTIFIED BY '...';
GRANT ALL PRIVILEGES ON site_one.* TO 'site_one'@'localhost';
Un seul utilisateur de base ayant accès à toutes les bases signifie qu'un seul site compromis les lit et les écrit toutes. C'est l'erreur la plus fréquente sur un serveur multi-sites, et elle transforme un incident en tous les incidents d'un coup.
Des pools PHP séparés, si possible
Un pool par site, chacun tournant sous son propre utilisateur, signifie qu'un site ne peut pas lire les fichiers d'un autre bien qu'ils partagent la machine. Cela empêche aussi le trafic d'un site d'épuiser les workers dont tous les autres ont besoin.
; /etc/php/8.3/fpm/pool.d/site-one.conf
[site-one]
user = site-one
group = site-one
listen = /run/php/site-one.sock
pm = ondemand
pm.max_children = 10
Les certificats
sudo certbot --nginx -d one.example -d www.one.example
sudo certbot --nginx -d two.example -d www.two.example
Des certificats séparés plutôt qu'un seul couvrant tout. Le renouvellement d'un domaine ne peut alors pas faire tomber les autres, et le certificat ne publie pas la liste de tous les sites que vous hébergez.
