Skip to content

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.ini est 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_value dans le pool surchargent le php.ini et ne peuvent pas être modifiées par le code PHP. Utilisez php_value si vous souhaitez permettre la surcharge via ini_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-data sur Debian, apache ou nginx sur Red Hat).