Il n'est pas possible de charger les modules PHP 4 et PHP 5 simultanément dans Apache, que ce soit en statique (compilé avec Apache [./configure --activate-module=src/modules/php4/libphp4.a]) ou en dynamique (chargé dans la configuration [LoadModule php5_module modules/libphp5.so]).
Il y a plusieurs solutions au problème :
- Utiliser une autre machine
- Utiliser une autre adresse IP sur la même machine avec un second serveur Apache
- Utiliser un autre port sur la même machine avec un second serveur Apache
- Conserver PHP 4 en module et appeler PHP 5 en CGI
- Rediriger les requêtes vers un second serveur Apache
La solution 1 présente l'avantage de la simplicité, ainsi que de l'absence totale de risques pour les applications existantes. Les inconvénients sont le coût, doublé, la maintenance (patches de sécurité, upgrades) sur deux serveurs. La solution 2 est similaire, avec un coût moindre.
La solution 3 ne coûte rien, mais elle ne convient guère que pour des serveurs de développement — et encore ! Non seulement http://www.example.com:81/ risque d'être mal compris, mais en plus les ports non standard seront quasi certainement bloqués par les firewalls.
Dans le cas du CGI, les variables d'environnement sont différentes selon le fonctionnement de PHP en module ou en CGI. Dans le cas de $_ENV elles sont tellement imprévisibles que le manuel renonce à les lister !
Pour ces raisons, je me suis orienté vers la dernière idée. Elle n'est pas nouvelle et a été proposée par John Coggeshall dans un vieil article.
Je saute à la conclusion avant de détailler l'installation. La technique est simple et rapide à mettre en œuvre, mais elle présente plusieurs inconvénients :
- On ne peut rediriger qu'un seul virtual host sur un port. Impossible d'avoir deux sites en PHP5…
- Le serveur qui exécute le PHP est bien entendu le second. Ainsi, $_SERVER['HOST'] vaut (par exemple) 127.0.0.1:8085. À suivre.
Installation
Phase 1 : Recompiler Apache avec mod_proxy (ajouter l'option --enable-module=proxy à la configuration).
Phase 2 : Installer un second serveur Apache sur un port différent du premier. J'ai choisi Apache 2.2.0 et PHP 5.1.2. Voici le script — il suppose que les sources au format tar.bz2 soient préalablement téléchargés dans le répertoire de travail SOFT_DIR.
#!/bin/sh
SOFT_DIR=/home/xtian/src
HTTPD=httpd-2.2.0
PHP=php-5.1.2
# Installer Apache
cd $SOFT_DIR
rm -rf $HTTPD
echo Extracting $HTTPD
tar jxf $HTTPD.tar.bz2
cd $HTTPD
./configure \
--prefix=/usr/local/apache2 \
--enable-module=so \
--enable-rewrite \
--with-mpm=prefork \
--with-port=8085
make && make install
# Installer PHP
cd $SOFT_DIR
rm -rf $PHP
echo Extracting $PHP
tar jxf $PHP.tar.bz2
cd $PHP
./configure \
--prefix=/usr/local/php5 \
--sysconfdir=/etc/php5 \
--disable-short-tags \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-config-file-path=/etc/php5 \
--with-freetype-dir \
--disable-magic-quotes \
--enable-ftp \
--with-gettext \
--with-gd \
--with-mbstring \
--with-mysql \
--with-openssl \
--with-pdo-mysql \
--with-pear \
--with-png \
--with-zlib
make && make install
Phase 3 : Configurer les deux serveurs. L'ancien :
<VirtualHost *:80>
ServerName xtian.goelette.info
DocumentRoot /home/xtian/goelette.info
ProxyPass / http://127.0.0.1:8085/
</VirtualHost>
L'ancienne configuration est simplement transférée au nouveau fichier, par exemple /usr/local/apache2/conf/extra/httpd-vhosts.conf
NameVirtualHost localhost:8085
<VirtualHost localhost:8085>
ServerName xtian.goelette.info
ServerAdmin admin@example.com
DocumentRoot /home/xtian/goelette.info
php_flag magic_quotes_gpc off
CustomLog /home/xtian/goelette.info/logs/access.log combined
</VirtualHost>
Configurer le second serveur pour qu'il écoute le bon port, en local uniquement.
Listen 127.0.0.1:8085
Enfin dernière étape, lancer le second serveur [/usr/local/apache2/bin/apachectl start] et faire lire la nouvelle configuration au premier serveur [/usr/local/apache/bin/apachectl graceful]. Et voilà !