Utiliser PHP avec fcgid & suexec sous Apache 2.2

Synthèse

Cette page reprend un paramétrage fonctionnel, pouvant servir de point de départ au paramétrage d’un site. Il a été validé sous Apache 2.2 sur une distribution Débian.

Procédure d’installation

Adaptation à votre site

Vous devrez remplacer toutes les valeurs suivantes par des valeurs pertinentes pour votre site :

  • compter_utilisateur : le nom du compte utilisateur sous lequel vos scripts PHP doivent s’exécuter.

  • groupe_de_l_utilisateur : le nom du goupe du compte sous lequel vos scripts PHP doivent s’exécuter.

  • www-data : le nom du groupe sous lequel votre serveur Apache s’exécute.

  • site_php : le nom du répertoire dans lequel votre site est installé.

  • /usr/bin/php-cgi : le chemin complet de l’interpréteur PHP1 utilisé. Celui-ci doit être compatible FastCGI2.

Paramétrage d’Apache 2

Activez les modules fcgid et suexec. Sous Débian, exécutez les commandes suivantes :

a2enmod suexec
a2enmod fcgid

Ajoutez les entrées suivantes dans le paramétrage de l’hôte virtuel :

<VirtualHost *>

DocumentRoot /var/www/compte_utilisateur/site_php

[...]

Options None

SuexecUserGroup compte_utilisateur groupe_de_l_utilisateur

<Directory /var/www/compte_utilisateur/site_php>

  # On exécute les scripts .php de ce répertoire
  # via le script intermédiaire php-cgi

  AddHandler fcgid-script .php
  FCGIWrapper /var/www/compte_utilisateur/php-cgi .php
  Options ExecCGI
</Directory>

# On lance un seul serveur PHP FastCGI
# qui lancera autant de fils que
# nécessaire

DefaultMaxClassProcessCount 1
DefaultMinClassProcessCount 1

</VirtualHost>

Puis vérifiez la syntaxe de votre paramétrage d’Apache :

apache2ctl -t

Création des répertoires

À moins d’utiliser le module Apache mod_userdir, vous devrez travailler dans la hiérarchie de répertoires /var/www :

Commencez par créer les répertoires devant héberger votre site :

mkdir -p /var/www/compte_utilisateur/site_php

Puis recopiez votre site dans le répertoire site_php.

Script intermédiaire

Dans /var/www/compte_utilisateur, placez le script php-cgi suivant :

#!/bin/sh
export PHP_FCGI_CHILDREN=4
export PHP_FCGI_MAX_REQUESTS=500
exec /usr/bin/php-cgi $@

Lorsque ce script sera exécuté par Apache, il sera dynamiquement remplacé par le serveur php-cgi. Celui-ci lancera 4 processus fils, chacun en charge de traiter les requêtes reçues. Lorsqu’un processus fils donné aura traité 500 requêtes, il se terminera automatiquement et sera relancé par le processus père. Ce mécanisme est conçu pour éviter d’être trop pénalisé par une éventuelle fuite mémoire.

Le nombre de fils (PHP_FCGI_CHILDREN) est à adapter, en fonction de la puissance de la machine et de la fréquentation du site. Donner à cette variable une valeur faible (4 par exemple) consommera peu de ressources. Une valeur plus élevée (8 par exemple) permettra à votre site de supporter une charge plus importante.

Sécurisation des répertoires

Appliquez les droits suivants :

# Répertoire de l'utilisateur

chown compte_utilisateur:groupe_de_l_utilisateur /var/www/compte_utilisateur
chmod u=rwx,g=rx,o=rx /var/www/compte_utilisateur

# Script intermédiaire

chown compte_utilisateur:groupe_de_l_utilisateur /var/www/compte_utilisateur/php-cgi
chmod u=rwx,ug= /var/www/compte_utilisateur/php-cgi

# Site

chown compte_utilisateur:www-data /var/www/compte_utilisateur/site_php
chmod -R u=rwX,g=rX,o= /var/www/compte_utilisateur/site_php

Relancez Apache

Il ne reste plus qu’à relancer Apache :

apache2ctl graceful

Références

  • La documentation de SUEXEC sur le site du projet Apache.
  • Le fichier README.FastCGI contenu dans les sources de PHP.

License : CC-BY


  1. En général, il devrait s’agir de php4-cgi ou php5-cgi↩︎

  2. Pour le vérifier, lancez la commande php-cgi -v et vérifiez que sa sortie contient bien le texte « (cgi-fcgi) ». ↩︎