PHP-FPM — IntĂ©gration avec Apache et Nginx¶
Installation de PHP-FPM¶
Debian/Ubuntu¶
apt update
apt install php-fpm
Le service s'appellera selon la version installée, par exemple php8.2-fpm.
Red Hat / Rocky / AlmaLinux¶
dnf install php-fpm
Le service s'appelle php-fpm.
Configuration PHP-FPM — Pool par dĂ©faut¶
Le pool par défaut écoute sur un socket Unix. C'est recommandé pour les performances.
Debian/Ubuntu : /etc/php/8.2/fpm/pool.d/www.conf
Red Hat : /etc/php-fpm.d/www.conf
Vérifiez que la ligne suivante est présente :
listen = /run/php/php8.2-fpm.sock ; Debian
; ou
listen = /run/php-fpm/www.sock ; Red Hat
IntĂ©gration avec Nginx¶
Fichier /etc/nginx/sites-available/monsite (Debian) ou /etc/nginx/conf.d/monsite.conf (Red Hat) :
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock; # Debian
# fastcgi_pass unix:/run/php-fpm/www.sock; # Red Hat
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# Bloquer l'accès aux fichiers .htaccess
location ~ /\.ht {
deny all;
}
}
Activer et recharger :
# Debian/Ubuntu
ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
# Red Hat (pas de sites-enabled, le fichier est déjà dans conf.d)
nginx -t && systemctl reload nginx
IntĂ©gration avec Apache¶
Debian/Ubuntu¶
apt install libapache2-mod-fcgid
a2enmod proxy_fcgi setenvif
a2enconf php8.2-fpm
Fichier /etc/apache2/sites-available/monsite.conf :
<VirtualHost *:80>
ServerName example.com
Redirect "/" "https://example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
a2enmod ssl
a2ensite monsite.conf
systemctl reload apache2
Red Hat / Rocky / AlmaLinux¶
dnf install httpd php-fpm
systemctl enable --now php-fpm
Fichier /etc/httpd/conf.d/monsite.conf :
<VirtualHost *:80>
ServerName example.com
Redirect "/" "https://example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/"
</FilesMatch>
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
systemctl enable --now httpd php-fpm
⚠️ Sur Red Hat, pensez à ouvrir le pare-feu si nécessaire :
firewall-cmd --permanent --add-service=http --add-service=https firewall-cmd --reload
DĂ©marrage et activation des services¶
| Action | Debian/Ubuntu | Red Hat |
|---|---|---|
| Démarrer PHP-FPM | systemctl start php8.2-fpm |
systemctl start php-fpm |
| Activer au démarrage | systemctl enable php8.2-fpm |
systemctl enable php-fpm |
| Vérifier le statut | systemctl status php8.2-fpm |
systemctl status php-fpm |
Emplacements des fichiers PHP-FPM¶
| Fichier | Debian/Ubuntu | Red Hat |
|---|---|---|
| Config principale | /etc/php/8.2/fpm/php-fpm.conf |
/etc/php-fpm.conf |
| Pool par défaut | /etc/php/8.2/fpm/pool.d/www.conf |
/etc/php-fpm.d/www.conf |
| Socket Unix | /run/php/php8.2-fpm.sock |
/run/php-fpm/www.sock |
| Logs | /var/log/php8.2-fpm.log |
/var/log/php-fpm/error.log |
Notes¶
- Adaptez
php8.2à la version PHP effectivement installée sur votre système. - Préférez le socket Unix au socket TCP (
127.0.0.1:9000) pour de meilleures performances en local. - Pour plusieurs sites, créez un pool dédié par vhost dans le dossier
pool.d/.
Ajouts Ă la doc PHP-FPM¶
Configuration php.ini — Paramètres importants¶
Les fichiers php.ini se trouvent aux emplacements suivants selon l'usage :
| Usage | Debian/Ubuntu | Red Hat |
|---|---|---|
| PHP-FPM | /etc/php/8.2/fpm/php.ini |
/etc/php.ini |
| CLI | /etc/php/8.2/cli/php.ini |
/etc/php.ini |
⚠️ Sur Red Hat, un seul
php.iniest partagé entre FPM et CLI. Sur Debian, ils sont séparés — pensez à les synchroniser si besoin.
Exemple de configuration recommandée :
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Performances & Mémoire
;;;;;;;;;;;;;;;;;;;;;;;;;;
; Mémoire maximale allouée par script
memory_limit = 256M
; Temps d'exécution maximum d'un script (secondes)
max_execution_time = 60
; Temps max pour recevoir les données POST
max_input_time = 60
; Nombre max de variables en POST/GET/COOKIE
max_input_vars = 3000
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Upload
;;;;;;;;;;;;;;;;;;;;;;;;;;
; Taille maximale d'un fichier uploadé
upload_max_filesize = 64M
; Taille maximale totale d'une requĂŞte POST
post_max_size = 64M
; Nombre max de fichiers simultanés par requête
max_file_uploads = 20
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Erreurs (Production)
;;;;;;;;;;;;;;;;;;;;;;;;;;
; Ne jamais afficher les erreurs à l'écran en production
display_errors = Off
display_startup_errors = Off
; Logger les erreurs dans un fichier
log_errors = On
error_log = /var/log/php/error.log
; Niveau de rapport d'erreurs (tout sauf les notices)
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Sécurité
;;;;;;;;;;;;;;;;;;;;;;;;;;
; Masquer la version PHP dans les headers HTTP
expose_php = Off
; Désactiver les fonctions dangereuses
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,parse_ini_file,show_source
; Restreindre l'accès aux fichiers au répertoire web
open_basedir = /var/www/html:/tmp
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Sessions
;;;;;;;;;;;;;;;;;;;;;;;;;;
; Durée de vie d'une session (secondes)
session.gc_maxlifetime = 1440
; Cookie de session inaccessible en JavaScript
session.cookie_httponly = On
; Cookie uniquement en HTTPS
session.cookie_secure = On
; Répertoire de stockage des sessions
session.save_path = /var/lib/php/sessions
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Timezone
;;;;;;;;;;;;;;;;;;;;;;;;;;
date.timezone = Europe/Paris
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; OPcache (performances)
;;;;;;;;;;;;;;;;;;;;;;;;;;
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
; En production, désactiver la revalidation pour les perfs max
; opcache.validate_timestamps = 0
💡 Après modification, rechargez PHP-FPM :
systemctl reload php8.2-fpm # Debian systemctl reload php-fpm # Red Hat
Multi-PHP — Deux versions sur deux VHosts distincts¶
L'objectif est d'avoir par exemple PHP 8.1 pour site1.example.com et PHP 8.2 pour site2.example.com, chacun avec son propre socket Unix.
Installation des deux versions (Debian/Ubuntu)¶
apt install php8.1-fpm php8.2-fpm
Sur Red Hat, utilisez le dépôt Remi :
dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
dnf install php81-php-fpm php82-php-fpm
VĂ©rification des sockets disponibles¶
# Debian/Ubuntu
ls /run/php/
# php8.1-fpm.sock php8.2-fpm.sock
# Red Hat (Remi)
ls /var/opt/remi/php81/run/php-fpm/
ls /var/opt/remi/php82/run/php-fpm/
Pools PHP-FPM dĂ©diĂ©s par site¶
Créez un pool par site pour isoler les processus et les sockets.
Pool site1 — PHP 8.1
/etc/php/8.1/fpm/pool.d/site1.conf (Debian) ou /etc/opt/remi/php81/php-fpm.d/site1.conf (Red Hat) :
[site1]
user = www-data
group = www-data
; Socket dédié au site1
listen = /run/php/php8.1-site1.sock
; Red Hat : listen = /var/opt/remi/php81/run/php-fpm/site1.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
; php.ini overrides spécifiques à ce pool
php_admin_value[error_log] = /var/log/php/site1-error.log
php_admin_value[open_basedir] = /var/www/site1:/tmp
php_admin_flag[log_errors] = on
Pool site2 — PHP 8.2
/etc/php/8.2/fpm/pool.d/site2.conf (Debian) ou /etc/opt/remi/php82/php-fpm.d/site2.conf (Red Hat) :
[site2]
user = www-data
group = www-data
; Socket dédié au site2
listen = /run/php/php8.2-site2.sock
; Red Hat : listen = /var/opt/remi/php82/run/php-fpm/site2.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 15
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
php_admin_value[error_log] = /var/log/php/site2-error.log
php_admin_value[open_basedir] = /var/www/site2:/tmp
php_admin_flag[log_errors] = on
đź’ˇ Les directives
php_admin_valuedans le pool surchargent lephp.iniet ne peuvent pas être modifiées par le code PHP. Utilisezphp_valuesi vous souhaitez permettre la surcharge viaini_set().
Configuration Nginx — Multi-PHP¶
# VHost site1 — PHP 8.1
server {
listen 443 ssl;
server_name site1.example.com;
ssl_certificate /etc/ssl/certs/site1.example.com.crt;
ssl_certificate_key /etc/ssl/private/site1.example.com.key;
root /var/www/site1;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-site1.sock;
# Red Hat : fastcgi_pass unix:/var/opt/remi/php81/run/php-fpm/site1.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# VHost site2 — PHP 8.2
server {
listen 443 ssl;
server_name site2.example.com;
ssl_certificate /etc/ssl/certs/site2.example.com.crt;
ssl_certificate_key /etc/ssl/private/site2.example.com.key;
root /var/www/site2;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-site2.sock;
# Red Hat : fastcgi_pass unix:/var/opt/remi/php82/run/php-fpm/site2.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Configuration Apache — Multi-PHP¶
# VHost site1 — PHP 8.1
<VirtualHost *:443>
ServerName site1.example.com
DocumentRoot /var/www/site1
SSLEngine on
SSLCertificateFile /etc/ssl/certs/site1.example.com.crt
SSLCertificateKeyFile /etc/ssl/private/site1.example.com.key
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-site1.sock|fcgi://localhost/"
# Red Hat : SetHandler "proxy:unix:/var/opt/remi/php81/run/php-fpm/site1.sock|fcgi://localhost/"
</FilesMatch>
</VirtualHost>
# VHost site2 — PHP 8.2
<VirtualHost *:443>
ServerName site2.example.com
DocumentRoot /var/www/site2
SSLEngine on
SSLCertificateFile /etc/ssl/certs/site2.example.com.crt
SSLCertificateKeyFile /etc/ssl/private/site2.example.com.key
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-site2.sock|fcgi://localhost/"
# Red Hat : SetHandler "proxy:unix:/var/opt/remi/php82/run/php-fpm/site2.sock|fcgi://localhost/"
</FilesMatch>
</VirtualHost>
DĂ©marrage des services multi-PHP¶
# Debian/Ubuntu
systemctl enable --now php8.1-fpm php8.2-fpm
systemctl reload nginx # ou apache2
# Red Hat (Remi)
systemctl enable --now php81-php-fpm php82-php-fpm
systemctl reload nginx # ou httpd
Tableau rĂ©capitulatif des sockets multi-PHP¶
| Version | Socket Debian/Ubuntu | Socket Red Hat (Remi) |
|---|---|---|
| PHP 8.1 (site1) | /run/php/php8.1-site1.sock |
/var/opt/remi/php81/run/php-fpm/site1.sock |
| PHP 8.2 (site2) | /run/php/php8.2-site2.sock |
/var/opt/remi/php82/run/php-fpm/site2.sock |
⚠️ Vérifiez que les permissions du socket correspondent bien à l'utilisateur du serveur web (
www-datasur Debian,apacheounginxsur Red Hat).