Apache 2.2 et PHP sous Windows, environnements de développement multiples avec les virtual hosts

Introduction

Pour des raisons diverses et variées, il est souvent nécessaire de disposer en local de plusieurs environnements de développement avec Apache. Par exemple un environnement dédié par version de PHP pour des contextes de migration, un environnement uniquement pour du debug à l'image de l'environnement de production afin de reproduire un incident...

Environnement Description Version de PHP
www.sqlpac.dvt Développement PHP 7.2
www.sqlpac.ppd Préproduction PHP 7.0
www.sqlpac.dbg Debug production PHP 5.6

La configuration de tels environnements est aisée avec les hôtes virtuels d'Apache 2.2.

Les distributions sont installées sur Windows 10 avec les caractéristiques suivantes :


Répertoire Source des binaires
Apache 2.2.31 64 bits (avec OpenSSL) D:\software\apache %APACHE_HOME% www.apachehaus.com/cgi-bin/download.plx
PHP 5.6 64 bits D:\software\scripts\php-5.6 windows.php.net/download/
PHP 7.0 64 bits D:\software\scripts\php-7.0 windows.php.net/download/
PHP 7.2 64 bits D:\software\scripts\php-7.2 windows.php.net/download/

Référencement des domaines virtuels dans le fichier hosts

Afin que les domaines virtuels www.sqlpac.dvt, www.sqlpac.ppd... soient résolus, éditer le fichier hosts de la machine Windows pour associer les domaines à l'IP locale 127.0.0.1. Ce fichier est dans le répertoire C:\Windows\system32\drivers\etc et il doit être ouvert avec les droits administrateur pour pouvoir le mettre à jour. Éditer ce fichier avec précaution, il est sensible pour l'OS.

C:\Windows\system32\drivers\etc\hosts
# localhost name resolution is handled within DNS itself.
#	127.0.0.1       localhost
#	::1             localhost

127.0.0.1	www.sqlpac.dvt
127.0.0.1	www.sqlpac.ppd
127.0.0.1	www.sqlpac.dbg

Ne pas choisir l'extension .dev, avec Apache, cette extension finit en erreur 408 (Timeout).

Une simple commande ping confirme la résolution des domaines virtuels. Il se peut qu'un redémarrage de la machine soit nécessaire.

C:\Users\sqlpac> ping www.sqlpac.dvt
Envoi d’une requête 'ping' sur www.sqlpac.dvt [127.0.0.1] avec 32 octets de données :
Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128
Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128

Statistiques Ping pour 127.0.0.1:
    Paquets : envoyés = 2, reçus = 2, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes :
    Minimum = 0ms, Maximum = 0ms, Moyenne = 0ms
Ctrl+C

Configuration des virtual hosts

Dans le répertoire %APACHE_HOME/conf/extra, un fichier de configuration par hôte virtuel est créé : le port 80 est indiqué ici (pas de SSL sur le port 443).

%APACHE_HOME/conf/extra/httpd-sqlpac-dvt.conf
<VirtualHost *:80>
    DocumentRoot "D:/www/dev"
    ServerName sqlpac.dvt
    ServerAlias www.sqlpac.dvt
    ErrorLog "logs/www.sqlpac.dvt-error.log"
    CustomLog "logs/www.sqlpac.dvt-access.log" common
</VirtualHost>
%APACHE_HOME/conf/extra/httpd-sqlpac-ppd.conf
<VirtualHost *:80>
    DocumentRoot "D:/www/preproduction"
    ServerName sqlpac.ppd
    ServerAlias www.sqlpac.ppd
    ErrorLog "logs/www.sqlpac.ppd-error.log"
    CustomLog "logs/www.sqlpac.ppd-access.log" common
</VirtualHost>
%APACHE_HOME/conf/extra/httpd-sqlpac-dbg.conf
<VirtualHost *:80>
    DocumentRoot "D:/www/productiondbg"
    ServerName sqlpac.dbg
    ServerAlias www.sqlpac.dbg
    ErrorLog "logs/www.sqlpac.dbg-error.log"
    CustomLog "logs/www.sqlpac.dbg-access.log" common
</VirtualHost>

À cette étape, il est d'ores et déjà possible de définir pour le virtual host les alias, les propriétés et options des répertoires (permissions, FollowSymLinks...) etc...:

%APACHE_HOME/conf/extra/httpd-sqlpac-dbg.conf
<VirtualHost *:80>
        
    DocumentRoot "D:/www/productiondbg"
    ServerName sqlpac.dbg
    ServerAlias www.sqlpac.dbg
    ErrorLog "logs/www.sqlpac.dbg-error.log"
    CustomLog "logs/www.sqlpac.dbg-access.log" common
    
    Alias /articles "D:/www/productiondbg/referentiel/docs"
    
    <Directory "D:/www/productiondbg">
        Options Indexes FollowSymLinks
        Options +ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    
</VirtualHost>

Pour que le serveur Apache prenne en compte ces nouveaux hôtes virtuels, référencer les fichiers de configuration précédemment créés avec l'instruction Include à la fin du fichier de configuration global du serveur Apache (%APACHE_HOME%\conf\httpd.conf) :

%APACHE_HOME%\conf\httpd.conf
Include conf/extra/httpd-sqlpac-dvt.conf
Include conf/extra/httpd-sqlpac-ppd.conf
Include conf/extra/httpd-sqlpac-dbg.conf

Redémarrer le serveur Apache et les virtual hosts sont prêts. Effectuer un simple test avec une page html : http://www.sqlpac.ppd/index.html

Activation du module fcgid d'Apache (fastCGI)

Le module fcgid d'Apache est utilisé ici pour PHP et il se peut que ce module ne soit pas présent dans la distribution Apache 2.2 téléchargée.

Pour vérifier que le module existe, rechercher le fichier mod_fcgid.so dans le répertoire %APACHE_HOME/modules. Si le module n'est pas présent, il peut être téléchargé depuis ApacheHaus (ApacheHaus.com - Mod FCGID for Apache 2.2.x x64).

Il s'agit d'une archive zip avec 2 fichiers à copier dans les répertoires ci-dessous :

httpd-fcgid.conf %APACHE_HOME%\conf\extra
mod_fcgid.so %APACHE_HOME%\modules

Le module fcgid est ajouté au serveur Apache en modifiant le fichier de configuration httpd.conf avec les directives ci-dessous :

%APACHE_HOME%\conf\httpd.conf
# AJOUT FCGID
#
LoadModule fcgid_module modules/mod_fcgid.so
Include conf/extra/httpd-fcgid.conf

Commenter les dernières lignes dans le fichier %APACHE_HOME%/conf/extra/httpd-fcgid.conf car elles définissent une configuration globale, ce qui ne sera pas le cas ici, la configuration étant réalisée par virtual host.

%APACHE_HOME%\conf\extra\httpd-fcgid.conf
# Global Config Example
# Comment out next 4 lines to use per-Directory or per-VirtualHost configuration
#  <Files ~ "\.php$">
#    Options ExecCGI
#    AddHandler fcgid-script .php
#    FcgidWrapper "C:/php/php-cgi.exe" .php
#  </Files>

Redémarrer le serveur Apache.

Personnalisation de la configuration PHP par hôte virtuel

Chaque hôte virtuel utilise une version de PHP bien précise ici.

Domaine Version de PHP
www.sqlpac.dvt PHP 7.2
www.sqlpac.ppd PHP 7.0
www.sqlpac.dbg PHP 5.6

Comme pour les hôtes virtuels, un fichier de configuration apache est préparé dans le répertoire %APACHE_HOME%\conf\extra pour chaque version de PHP :

%APACHE_HOME%\conf\extra\httpd-sqlpac-php-72.conf (PHP 7.2)
FcgidInitialEnv PHPRC "D:/software/scripts/php-7.2"
AddHandler fcgid-script .php .inc .html
FcgidWrapper "D:/software/scripts/php-7.2/php-cgi.exe" .php
FcgidWrapper "D:/software/scripts/php-7.2/php-cgi.exe" .inc
FcgidWrapper "D:/software/scripts/php-7.2/php-cgi.exe" .html
%APACHE_HOME%\conf\extra\httpd-sqlpac-php-70.conf (PHP 7.0)
FcgidInitialEnv PHPRC "D:/software/scripts/php-7.0"
AddHandler fcgid-script .php .inc .html
FcgidWrapper "D:/software/scripts/php-7.0/php-cgi.exe" .php
FcgidWrapper "D:/software/scripts/php-7.0/php-cgi.exe" .inc
FcgidWrapper "D:/software/scripts/php-7.0/php-cgi.exe" .html
%APACHE_HOME%\conf\extra\httpd-sqlpac-php-56.conf (PHP 5.6)
FcgidInitialEnv PHPRC "D:/software/scripts/php-5.6"
AddHandler fcgid-script .php .inc .html
FcgidWrapper "D:/software/scripts/php-5.6/php-cgi.exe" .php
FcgidWrapper "D:/software/scripts/php-5.6/php-cgi.exe" .inc
FcgidWrapper "D:/software/scripts/php-5.6/php-cgi.exe" .html

Les fichiers de configuration pour PHP définissent les directives pour le module FastCGI (Fcgid) : traitement des fichiers *.php, *.inc, *.html avec l'exécutable php-cgi.exe approprié en fonction de la version.

La configuration PHP appropriée est alors attribuée à chaque virtual host avec la directive Include dans le fichier de configuration du virtual host.

%APACHE_HOME/conf/extra/httpd-sqlpac-dvt.conf
<VirtualHost *:80>
    Include conf/extra/httpd-sqlpac-php-72.conf
    DocumentRoot "D:/www/productiondbg"
    ...
</VirtualHost>
%APACHE_HOME/conf/extra/httpd-sqlpac-ppd.conf
<VirtualHost *:80>
    Include conf/extra/httpd-sqlpac-php-70.conf
    DocumentRoot "D:/www/productiondbg"
    ...
</VirtualHost>
%APACHE_HOME/conf/extra/httpd-sqlpac-dbg.conf
<VirtualHost *:80>
    Include conf/extra/httpd-sqlpac-php-56.conf
    DocumentRoot "D:/www/productiondbg"
    ...
</VirtualHost>

Redémarrer le serveur Apache et c'est terminé, sauf si des erreurs de syntaxe se sont glissées par ci par là, consulter les fichiers de log d'Apache.

Tests

Créér un fichier phpinfo.html avec le code ci-dessous :

phpinfo.html
<!DOCTYPE html>

<html>
<head>
    <title>PHP Info</title>
</head>

<body>
    <p>Informations PHP - Script PHP</p>

<?php  phpinfo(); ?>

</body>
</html>

Copier ce fichier dans un répertoire de chaque virtual host, la version de PHP utilisée est confirmée avec la fonction phpinfo.

http://www.sqlpac.dvt/phpinfo.html PHP Version 7.2.1 ...
http://www.sqlpac.ppd/phpinfo.html PHP Version 7.0.27 ...
http://www.sqlpac.dbg/phpinfo.html PHP Version 5.6.33 ...