Ceci est une ancienne révision du document !
Pour configurer chaque site web avec un utilisateur système différent, la méthode la plus courante et la plus robuste en PHP est d’utiliser PHP-FPM avec des pools séparés pour chaque site.
Voici les étapes générales :
Créer un utilisateur système et un groupe pour chaque site : Pour chaque site web, créez un utilisateur et un groupe dédiés. Par exemple, pour site1.com :
sudo groupadd site1 sudo useradd -g site1 -s /sbin/nologin site1user # ou adduser --allow-bad-names --shell /sbin/nologin site1.com # ne rien mettre comme mot de passe (plusieurs fois)
Répétez pour chaque site (site2user, site2, etc.). L’option -s /sbin/nologin empêche ces utilisateurs de se connecter directement au système.
Définir les permissions des dossiers des sites : Changez le propriétaire des répertoires de vos sites web pour qu’ils appartiennent à leur utilisateur et groupe respectifs :
chown -R site1user:site1 /var/www/site1.com # Assurez-vous que le répertoire du site est accessible en lecture par l'utilisateur chmod -R ug+rwX,o+rX-w /var/www/site1.com
Faites de même pour chaque site.
Configurer des pools PHP-FPM séparés : Si vous utilisez PHP-FPM (ce qui est fortement recommandé pour cette configuration), créez un fichier de configuration de pool pour chaque site. Ces fichiers se trouvent généralement dans /etc/php/X.X/fpm/pool.d/ (où X.X est votre version de PHP).
Par exemple, créez /etc/php/X.X/fpm/pool.d/site1.conf :
[site1] user = site1user group = site1 listen = /run/php/phpX.X-site1.sock ; Chemin unique pour le socket listen.owner = www-data ; L'utilisateur du serveur web (ex: nginx, apache) doit pouvoir accéder au socket listen.group = www-data pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 pm.process_idle_timeout = 10s ; Définir le répertoire racine du site chdir = /var/www/site1.com ; Variables d'environnement si nécessaire ; php_admin_value[error_log] = /var/log/php-fpm/site1_error.log ; php_admin_flag[log_errors] = on
Répétez cette configuration pour chaque site, en changeant [site1], user, group, listen et chdir en conséquence.
Configurer votre serveur web (Nginx ou Apache) :
Nginx : Pour chaque hôte virtuel (server block), configurez-le pour qu’il utilise le socket PHP-FPM du pool correspondant. Exemple pour /etc/nginx/sites-available/site1.com :
Nginx
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1.com/public; # Votre répertoire public
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/phpX.X-site1.sock; # Pointer vers le bon socket
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Autres configurations (logs, ssl, etc.)
}
Apache (avec mod_proxy_fcgi) : Configurez un VirtualHost pour chaque site. Exemple pour /etc/apache2/sites-available/site1.com.conf :
Apache
<VirtualHost *:80>
ServerName site1.com
ServerAlias www.site1.com
DocumentRoot /var/www/site1.com/public
<Directory /var/www/site1.com/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch ".+\.ph(?:ar|p|tml)$">
SetHandler "proxy:unix:/run/php/phpX.X-site1.sock|fcgi://localhost/" # Pointer vers le bon socket
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/site1_error.log
CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
</VirtualHost>
Redémarrer les services : Après toutes ces modifications, redémarrez les services concernés :
Bash
sudo systemctl restart phpX.X-fpm sudo systemctl restart nginx # ou sudo systemctl restart apache2
Avantages de cette méthode :
Sécurité accrue : Chaque site s’exécute avec des permissions limitées à son propre environnement, réduisant le risque qu’un site compromis n’affecte les autres.
Isolation des processus : Les processus PHP de chaque site sont isolés, ce qui améliore la stabilité.
Facilite la configuration de Postfix : Avec chaque site s’exécutant sous un user différent, Postfix verra des expéditeurs comme site1user@votre_serveur ou site2user@votre_serveur. Vous pouvez alors utiliser la configuration sender_canonical_maps de Postfix mentionnée précédemment pour réécrire site1user@votre_serveur en no-reply@site1.com et site2user@votre_serveur en contact@site2.net, etc.
C’est la méthode standard pour héberger plusieurs sites PHP de manière isolée et sécurisée.