Configuration Apache 2.4 / PHP-FPM

A partir de la version 13.10, Ubuntu fournit par défaut la version 2.4 du serveur http Apache.

Les options de paramétrage ont évolué entre les versions 2.2 et 2.4, notamment sur les aspects :

  • virtualhost : le nom des fichiers doit se terminer par l'extension .conf et certains paramètres ont changé
  • le lien avec PHP-FPM

Cet article illustre les changements à apporter pour faire fonctionner Apache 2.4 et PHP sur un serveur linux de type Debian / Ubuntu.

Installation Apache

L'installation se fait facilement via :

sudo apt-get install apache2 apache2-utils

On peut vérifier la version / configuration avec la commande

apache2ctl  -V
Server version: Apache/2.4.7 (Ubuntu)
Server built:   Mar 10 2015 13:05:59
Server's Module Magic Number: 20120211:27
Server loaded:  APR 1.5.1-dev, APR-UTIL 1.5.3
Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)

VirtualHost

La déclaration des VirtualHost a été modifiée.
Premier impact majeur : le nom des fichiers doit maintenant se terminer par .conf.
Une autre modification importante intervient dans le paramétrage de l'autorisation, avec les directives "Allow", qui sont maintenant remplacées par "Require", comme indiqué dans la documentation http://httpd.apache.org/docs/2.4/fr/upgrading.html

Par exemple, en version 2.2, pour autoriser toutes les requêtes, on avait :

  Order allow,deny
  Allow from all

Avec la version 2.4, pour autoriser les requêtes, la syntaxe est :

  Require all granted

Exemple de configuration pour un site statique (fichier /etc/apache2/sites-available/static.conf) :

<VirtualHost *:80>
  ServerName static.test.local
  DocumentRoot /var/www/static
  <Directory /var/www/static/>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride None
	Require all granted
  </Directory>
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Qu'on active via la commande :

a2ensite static
service apache2 reload

A ce stade, on a un serveur http, uniquement capable de "servir" des fichiers statiques. Allons un peu plus loin, avec la mise en place de PHP.

Deux options sont possibles pour PHP : en module Apache (mod_php), ou avec PHP-FPM.

Installation PHP en module Apache

L'installation de php5 installe également le module apache2 correspondant :

apt-get install php5
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  libapache2-mod-php5 lsof php5-cli php5-common php5-json php5-readline psmisc

Paramétrage du VirtualHost

Pour le test on va créer un répertoire /var/www/php, et y créer un fichier info.php, qui contient les lignes :

<?php  
  phpinfo(); 
?>

La définition de notre VirtualHost est alors :

<VirtualHost *:80>
  ServerName  php.test.local

  DocumentRoot /var/www/php
  <Directory /var/www/php/>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Require all granted
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error_php.log
  LogLevel info
  CustomLog ${APACHE_LOG_DIR}/access_php.log combined
</VirtualHost>

L'action du site s'effectue de la même manière que précédemment. On peut alors tester via l'url http://php.test.local/info.php, ce qui nous affiche la configuration de PHP pour le serveur.

Passons à l'étape suivante, la configuration avec PHP-FPM.

L'installation est détaillée dans un autre article : Passage de Apache + mod_php vers Nginx + PHP-FPM

Lien avec PHP-FPM

En dehors du module PHP, qui a l'inconvénient de surcharger le serveur apache, car chaque process embarque un moteur php complet, on peut utiliser PHP-FPM (FastCGI Process Manager), qui offre des fonctionnalités additionnelles intéressantes dans les environnements soumis à une forte charge.
PHP-FPM est lancé en tant que processus séparé du serveur http. Il peut donc être lancé avec un (ou plusieurs) comptes, différents de celui utilisé par le serveur http, afin d'améliorer la sécurité, ou d'utiliser des paramétrages PHP différents selon les différents pools de connexions utilisés.
La version Apache 2.4 ne peut cependant pas utiliser des sockets Unix pour communiquer avec le serveur php-fpm.
Depuis la version 2.4.9, ce souci semble être résolu (https://httpd.apache.org/docs/2.4/fr/mod/mod_proxy_fcgi.html).
Comme c'était le paramétrage par défaut sur Debian / Ubuntu avec Apache 2.2, il faut adapter la configuration, pour utiliser le port TCP.

Dans notre configuration, nous prenons comme hypothèse de définir le paramétrage au niveau de chaque VirtualHost. On peut également le faire au niveau global (cf. article cité plus haut).

cat /etc/apache2/sites-available/php.conf 
<VirtualHost *:80>
	ServerName php.test.local
	DocumentRoot /var/www/php

  ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/php/$1

  <Directory /var/www/php/>
	Options Indexes FollowSymLinks MultiViews
	AllowOverride None
	Require all granted
  </Directory>
	ErrorLog ${APACHE_LOG_DIR}/error_php.log
	CustomLog ${APACHE_LOG_DIR}/access_php.log combined
</VirtualHost>

On installe php5-fpm, puis active les modules proxy + proxy_fcgi, puis la nouvelle configuration PHP, avant de redémarrer le service apache :

apt-get install php5-fpm apache2-mpm-worker
a2enmod proxy
a2enmod proxy_fcgi
a2enconf php
a2dismod php5 mpm_prefork
a2enmod mpm_worker
sudo service apache2 restart
# Vérification du mode Worker
apache2ctl -V
Server version: Apache/2.4.7 (Ubuntu)
Server built:   Mar 10 2015 13:05:59
Server's Module Magic Number: 20120211:27
Server loaded:  APR 1.5.1-dev, APR-UTIL 1.5.3
Compiled using: APR 1.5.1-dev, APR-UTIL 1.5.3
Architecture:   64-bit
Server MPM:     worker

A ce stade, si on accède à l'URL http://mon.serveur.com/info.php, on a un message : Service Unavailable The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later. Apache/2.4.6 (Ubuntu) Server at saucy.test.local Port 80 Dans le fichier /var/log/apache2/error.log :

[Thu Dec 05 10:57:09.123785 2013] [proxy:error] [pid 6060:tid 139966214838016] (111)Connection refused: AH00957: FCGI: attempt to connect to 127.0.0.1:9000 (*) failed
[Thu Dec 05 10:57:09.125134 2013] [proxy_fcgi:error] [pid 6060:tid 139966214838016] [client 192.168.122.1:48002] AH01079: failed to make connection to backend: 127.0.0.1

Il faut paramétrer le pool php-fpm par défaut : /etc/php5/fpm/pool.d/www.conf Modifier le fichier avec les informations concernant le listen:

;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1

Puis redémarrer php5-fpm :

service php5-fpm restart

Si on accède à l'URL http://php.test.local/info.php, on constate bien :
Server API FPM/FastCGI

 

Catégorie: 

Tag: 

Comments

Add new comment