Ospitare più domini su una sola macchina è normale ed efficiente. A decidere se sia sicuro è quanto siano separati: directory proprie, utenti di database propri e, possibilmente, utenti di sistema propri.

La disposizione

/var/www/
  site-one/    public/  storage/
  site-two/    public/  storage/
  site-three/  public/  storage/

Ogni document root punta alla propria directory pubblica. Nulla al di sopra è raggiungibile dal web, così configurazione e archivio stanno fuori da dove un URL potrebbe mai atterrare.

Un blocco server per dominio

server {
    listen 443 ssl;
    server_name one.example;
    root /var/www/site-one/public;
    include snippets/php.conf;
}

Tenga separati i database

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 solo utente di database con accesso a tutti i database significa che un unico sito compromesso li legge e li scrive tutti. È l'errore più comune su un server con più siti e trasforma un incidente in tutti quanti in un colpo solo.

Pool PHP separati, se può

Un pool per sito, ciascuno in esecuzione come utente proprio, significa che un sito non può leggere i file di un altro pur condividendo la macchina. Impedisce anche che il traffico di un sito esaurisca i worker che servono a tutti gli altri.

; /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

I certificati

sudo certbot --nginx -d one.example -d www.one.example
sudo certbot --nginx -d two.example -d www.two.example
Certificati separati invece di uno che copre tutto. Così il rinnovo di un dominio non può far cadere gli altri, e il certificato non pubblica l'elenco di ogni sito che lei ospita.