Outils pour utilisateurs

Outils du site


tutoriels:php53x-fpm

PHP 5.3.6 : FPM FastCGI compilation & configuration

Apache2 & PHP-FPM en fastCGI

PHP-FPM (FastCGI Process Manager) est une interface SAPI permettant la communication entre un serveur Web et PHP. Principalement, FPM est un gestionnaire de processus FastCGI intégré à PHP, beaucoup plus efficace que celui de la SAPI FastCGI et qui permet surtout beaucoup plus d'options notamment dans le cas de l'hébergement partagé (aussi dit “mutualisé”). En effet, FPM va permettre de démarrer des processus avec des Uid/Gid différents (par site), de personnaliser des directives de php.ini par site hébergé et bien plus encore…

Parametres de PHP-FPM

Configuration de PHP en mode FPM avec FastCGI d'Apache2

Prérequis :

Compilation du module FastCGI pour Apache2

Apache2

Nous avons maintenant besoin d’installer le module « FastCGI » d’Apache. En effet, contrairement à « FCGID » (gestionnaire de processus plus moderne et souvent associé à l’installation de PHP en CGI), « FastCGI » fourni la directive permettant de préciser un gestionnaire externe de processus CGI, dans notre cas PHP5-FPM. « libapache2-mod-fastcgi » est un paquet de la section « non-free » (paquets qui ne respectent pas les DFSG). Vos sources de paquets doivent comprendre cette section pour pouvoir installer le module FastCGI. En fonction de votre distribution, remplacer lenny par squeeze au besoin.

  • Ajouter la section “non-free” dans votre gestionnaire de paquets :

vi /etc/apt/sources.list
deb ftp://mir1.ovh.net/debian/ lenny main contrib non-free
deb-src ftp://mir1.ovh.net/debian/ lenny main contrib non-free

deb http://security.debian.org/ lenny/updates main contrib non-free
deb-src http://security.debian.org/ lenny/updates main contrib non-free

  • Installer mod_FastCGI

aptitude update
aptitude install libapache2-mod-fastcgi

  • Editer le fichier de configuration du module :

vi /etc/apache2/mods-enabled/fastcgi.conf

  • Adapter votre conf de façon plus compréhensible :

<IfModule mod_fastcgi.c>
  AddHandler php5-fcgi .php
  Action php5-fcgi /cgi-bin/php5.external
  <Location "/cgi-bin/php5.external">
    Order Deny,Allow
    Deny from All
    Allow from env=REDIRECT_STATUS
  </Location>
</IfModule>

  • Activer le module actions utilisé dans la configuration de FASTCGI :

a2enmod actions

/etc/init.d/apache2 restart

  • Vérifier que les modules FastCGI et Actions sont chargés par Apache2 :

apache2ctl -M

Compilation de PHP 5.3.6 en FPM

PHP FastCGI

  • Récupérer les sources PHP-5.3.6 :

cd /root/sources
wget http://fr.php.net/distributions/php-5.3.6.tar.gz
tar xzf php-5.3.6.tar.gz && cd php-5.3.6

  • “Fast Process Manager” est directement implémenté à partir de PHP 5.3.

./configure --help | grep fpm

aptitude install libssl-dev libgmp3-dev libfreetype6-dev libgcrypt11-dev libmysqlclient-dev libxslt1-dev libltdl-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libmcrypt-dev libmhash-dev libc-client2007e-dev autoconf2.13 build-essential
'./configure' \
'--prefix=/usr/local/php-5.3.6-fpm' \
'--disable-cli' \
'--enable-fpm' \
'--with-mysql' \
'--with-mysqli' \
'--enable-bcmath' \
'--with-zlib-dir=/usr/include/' \
'--enable-simplexml' \
'--with-xsl' \
'--with-gd' \
'--with-openssl' \
'--enable-magic-quotes' \
'--enable-exif' \
'--enable-ftp' \
'--enable-sockets' \
'--enable-shmop' \
'--enable-mbstring' \
'--enable-sysvsem' \
'--enable-sysvshm' \
'--enable-calendar' \
'--with-png-dir=/usr' \
'--with-iconv' \
'--with-jpeg-dir=/usr' \
'--with-freetype-dir=/usr' \
'--with-pdo-mysql' \
'--with-mcrypt' \
'--enable-shmop' \
'--with-gmp' \
'--with-curl' \
'--with-mhash' \
'--enable-soap' \
'--with-kerberos' \
'--enable-dba' \
'--enable-zip'
 make && make install && make clean

  • Copier le script de démarrage fournit dans les sources et le rendre exécutable:

cp sapi/fpm/init.d.php-fpm /etc/init.d/php5.3.6-fpm
chmod 755 /etc/init.d/php5.3.6-fpm

  • Créer le fichier de configuration depuis le default :

cp /usr/local/php-5.3.6-fpm/etc/php-fpm.conf.default /usr/local/php-5.3.6-fpm/etc/php-fpm.conf
mkdir /etc/php-5.3.6-fpm
ln -s /usr/local/php-5.3.6-fpm/etc/php-fpm.conf /etc/php-5.3.6-fpm/php-conf

  • Configurer le php-fpm.conf :

vi /etc/php-5.3.6-fpm/fpm.d/test1.conf
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

;include=/etc/php-5.3.6-fpm/fpm.d/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
pid = /var/run/php-5.3.6-fpm/php-fpm.pid
error_log = /var/log/php-5.3.6-fpm/php-fpm.log
log_level = notice
emergency_restart_threshold = 10
emergency_restart_interval = 3m
process_control_timeout = 5m
daemonize = yes

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ;
;;;;;;;;;;;;;;;;;;;;
[PHP-5.3.6-FPM]
listen=/var/run/php-5.3.6-fpm/php-fpm.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = php536
listen.group = php536
listen.mode = 0666

user = php536
group = php536

pm = dynamic
pm.max_children = 1
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1
pm.max_requests = 500
slowlog = /var/log/php-5.3.6-fpm/$pool.log.slow
rlimit_files = 1024
;rlimit_core = 0
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

; Default Value: nothing is defined by default except the values in php.ini and
;                specified at startup with the -d argument
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;php_flag[display_errors] = off
;php_admin_value[error_log] = /var/log/fpm-php.www.log
;php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 32M

  • Créer les directory et le user déclarés dans la conf :

mkdir /etc/php-5.3.6-fpm/fpm.d
mkdir /var/run/php-5.3.6-fpm
mkdir /var/log/php-5.3.6-fpm
useradd --shell=/bin/false php536

  • Corriger les PATH du fichier de démarrage :

vi /etc/init.d/php5.3.6-fpm

  • Démarrage du daemon FPM :

PHP-FPM start

Gestion de PHP-FPM par POOL

Configuration de PHP-FPM :

[TEST-FPM-1]

# On suppose uniquement du local, mais on aurait pu
# séparer les instances webserver <-> FastCGIserver
listen = /var/run/php-5.3.6-fpm/test1.sock

# Très pratique, cette instance lancera des processus fils
# sous ces uid/gid là, rien à voir avec ceux d'Apache
user  = test1
group = test1

# Grande granularité sur le contrôle des processus,
# ici, nous demandons une gestion dynamique
pm = dynamic

# Gestion dynamique des processus FastCGI
pm.max_children      = 5
pm.start_servers     = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 5

# Processus tué après avoir traité 500 requêtes
pm.max_requests = 500

# L'URI de la page de statut de FPM et de ping
pm.status_path = /fpm-status
ping.path      = /fpm-ping

request_terminate_timeout = 10s
request_slowlog_timeout   = 10s

slowlog = /var/log/php-5.3.6-fpm/test1.slow

#chroot = 
#chdir  = 

env[TMP] = /data/www/test1/tmp
php_admin_value[error_log]    = /var/log/php-5.3.6-fpm/test1-php.log
php_admin_value[open_basedir]=/data/www/test1
php_admin_value[session.save_path]=/data/www/test1/tmp
php_admin_value[upload_tmp_dir]=/data/www/test1/tmp
#php_admin_value[inlude_path]=./
#php_admin_value[display_errors]=on

  • Créer le user dédié à l'exécution de ce pool:

useradd -s /bin/false test1

Configuration d'APACHE:

  • Créer le fichier VHOST associé au site :

vi /etc/apache2/sites-available/test1.local
<VirtualHost *:80>
    ServerAdmin postmaster@localhost
    DocumentRoot "/data/www/test1/"
    ServerName test1.local
    ServerAlias test1.local
    ErrorLog  "/var/log/apache2/test1.local.log-err"
    CustomLog "/var/log/apache2/test1.local.log-access" combined
FastCgiExternalServer /data/www/test1/cgi-bin/php5.external -socket /var/run/php-5.3.6-fpm/test1.local.sock
</VirtualHost>

  • Créer le Directory dédié à l'interprétation du PHP :

mkdir /data/www/test1/cgi-bin

  • Démarrer l'instance de test :

a2ensite test1.local
apacge2ctl configtest
apacge2ctl graceful

Résultat :

PHPinfo FPM

PHPinfo FastCGI

Sachez qu'il existe plein d'options annexes que je vous laisse découvrir ! (mode socket ou host ….)

tutoriels/php53x-fpm.txt · Dernière modification: 15/04/2016 à 21:15 (modification externe)

Outils de la page