Le contexte
Je gère plus de 15 applications en production sur un seul VPS Ubuntu, en self-hosted : Symfony, services Node, fronts React statiques. Stack Apache + PHP-FPM + MySQL. Voici comment ça tient debout.
Un vhost par application
<VirtualHost *:80>
ServerName baccalaureat.sn
DocumentRoot /var/www/baccalaureat/public
<Directory /var/www/baccalaureat/public>
AllowOverride All
Require all granted
FallbackResource /index.php
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/baccalaureat.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>Pools PHP-FPM isolés : la clé de la stabilité
L'erreur du débutant : un seul pool pour tout. Si une appli part en vrille, elle prend tout le serveur. La solution : un pool par appli, avec son propre user système.
; /etc/php/8.4/fpm/pool.d/baccalaureat.conf
[baccalaureat]
user = www-baccalaureat
listen = /run/php/baccalaureat.sock
pm = dynamic
pm.max_children = 10Une faille sur un site ne donne pas accès aux fichiers des autres.
MySQL : une base et un user par appli
CREATE DATABASE blog_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE USER 'blog_user'@'localhost' IDENTIFIED BY '...';
GRANT ALL PRIVILEGES ON blog_db.* TO 'blog_user'@'localhost';Jamais de user MySQL partagé. Si des identifiants fuitent, les dégâts sont contenus.
Les services Node sous systemd
# /etc/systemd/system/trackos.service
[Service]
ExecStart=/usr/bin/node /var/www/trackos/server.js
Restart=always
User=www-trackosCe que je retiens
- Un pool PHP-FPM + un user système par appli = cloisonnement et stabilité.
- Une base + un user MySQL par projet, jamais de partage.
- systemd pour tout ce qui doit rester vivant.
- Le self-hosting impose la rigueur sur l'isolation.