12 septembre 2014

APACHE 2.2 et Centos 7

Il y a de nombreuses raisons pour vouloir encore utiliser Apache 2.2 et de ne pas migrer vers Apache 2.4. L'une d'entre elles est l'utilisation de mod_perl2 qui ne fonctionne toujours pas correctement avec Apache 2.4.
Malheureusement l’installation d’Apache 2.2 sur centos 7 ne peut pas se faire avec yum car seule la version 2.4 est disponible. Voici comment procéder pour compiler Apache 2.2 et mod_perl2 sur centos 7 et mettre en place les fichiers nécessaires au  démarrage de httpd 2.2 avec systemctl (aka systemd).


1) Il faut avoir les outils de développements


yum group install "Development Tools"



2) Puis on va sur http://www.us.apache.org/dist/httpd/ et on repère la version la plus récente de httpd-2.2
puis on la télécharge et on la décompresse :


wget http://www.us.apache.org/dist/httpd/httpd-2.2.29.tar.gz
tar xvf httpd-2.2.29.tar.gz



On compile et installe apache 2.2.x

On utilise --prefix pour ne pas installer apache par dessus l’éventuelle version 'officielle'.

cd httpd-2.2.29
./configure --prefix=/path/to/apache22
make
make install


On démarre  apache (risque de conflit si une autre version utilise le port 80)


/path/to/apache22/bin/apachectl -k start


Et avec le browser ont doit avoir le classique « It works »


3) Pour compiler mod_perl et tester il y a plus de préparatifs ET une correction de bug:
(peut être certains des packages ci-dessous sont déjà sur votre machine)


yum install perl-ExtUtils-Embed
yum install perl-libwww-perl

yum install perl-CGI
yum install perl-Test-Simple
yum install perl-Linux-Pid
yum install expat

cd /usr/lib64
ln -s libexpat.so.1.x.0 libexpat.so.0


(Adaptez le version de libexpat à votre cas. Pour moi c'est 1.6.0)


4) On va sur http://apache.org/dist/perl/ repérer la dernière version de mod_perl2
puis on la télécharge et on la décompresse :

wget http://apache.org/dist/perl/mod_perl-2.0.8.tar.gz
tar xvf mod_perl-2.0.8.tar.gz
cd mod_perl-2.0.8


 
ATTENTION #1: Dans le fichier t/api/err_headers_out.t il faut remplacer à deux endroits:


     if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION==6.00;
par
  if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION>=6.00;

Enfin on peut exécuter la séquence standard :


perl Makefile.PL MP_APXS=/path/to/apache22/bin/apxs
make
make test
make install



NB: Le fait d'avoir installé apache 2.2.x dans un répertoire spécifique n'implique pas que toute la partie mod_perl aille aussi dans ce répertoire. Une partie ira dans apache/include et apache/module mais les modules perl iront dans /usr/local/lib64/perl5


5) Quand on compile soit même Apache on ne bénéficie pas des petits plus apportés par un package comme par exemple la mise en place du script de démarrage. Voici donc comment installer cela avec un Linux, comme centos os 7, qui utilise systemd (sytemctrl) à la place les scripts init.d. On va créer deux fichiers :

a) Le premier est /etc/sysconfig/httpd22 
Il sert à configurer l’environnement et les paramètres à passer au daemon httpd.


OPTIONS="-f /path/to/conf/httpd22.conf"
LANG=C



b) Le second /etc/systemd/system/httpd22.service
Il est utilisé par systemd pour exécuter les commandes start/reload/stop et il fait référence au fichier créé ci-dessus.

[Unit]
Description=The Apache HTTP Server 2.2.x
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
KillMode=none
PIDFile=/path/to/apache22/logs/httpd.pid



EnvironmentFile=/etc/sysconfig/httpd22

ExecStart=/path/to/apache22/bin/httpd  -DFOREGROUND  $OPTIONS
ExecStop=/path/to/apache22/bin/httpd   -k stop       $OPTIONS
ExecReload=/path/to/apache22/bin/httpd -k restart    $OPTIONS

[Install]
WantedBy=multi-user.target



NB: C'est apache qui gère le fichier .pid. Par défaut il est avec les logs de apache, mais on peut changer sa position avec la directive PidFile. Dans ce cas il faut adapter le PIDFile=... dans notre fichier httpd22.service


Après avoir créé ces deux fichiers (et avoir un fichier httpd.conf correct) faire


systemctl daemon-reload
systemctl start httpd22
systemctl status httpd22


Si tout est ok rendre le démarrage automatique

systemctl enable httpd22

Ces 2 fichiers cohabitent très bien avec ceux de httpd 2.4. Si les eux doivent s’exécuter en même temps il faut faire en sorte qu'ils n'utilisent pas le même port en changeant le paramètre "listen 80" dans la config de l'un ou de l'autre.



ATTENTION #2: Quand on se compile un programme (comme ici Apache 2.2) avec ses propres répertoires d'installation on se retrouve avec des fichiers .h ou des librairies à des endroits non standards. Ceci peut poser problèmes par la suite.
Par exemple, si pour utiliser mod_perl on veut installer la librairies Apache2::Request, qui utilise APR::Request, qui est une interface avec la librairie C libapreq2.so, il faudra que le programme d'installation de APR::Request trouve libapreq2.so dans le répertoire ou on a installé notre version d'Apache.
La solution la plus élégante est d'ajouter un fichier apache22.conf dans le répertoire /etc/ld.so.conf.d/ . Ce fichier contiendra juste une ligne du type:

/path/to/apache22/lib

Après quoi on exécute ldconfig pour que ce nouveau chemin soit pris en compte.


Enjoy  2.2 ;-)