RSS
 

Installer un serveur Apache avec PHP sous Linux

14 mai

Apache est un serveur HTTP open source utilisé pour hébergé des pages web (html, php, etc.). Il est le serveur web le plus populaire depuis 1996 et plus de 50% des sites Internet du monde tournent avec Apache (barre des 100 000 000 de sites dépassée en 2009).

PHP est un langage de programmation largement utilisé dans le développement Web.

L'objectif de cette note est donc d'installer un serveur Apache ainsi que PHP pas à pas à partir des sources officielles, puis de configurer notre serveur Apache pour interpréter les pages PHP.

Logiciels utilisés : Apache 2.2.17 et PHP 5.3.4

Système d'exploitation : Debian  5.0, Linux 2.6.34

Mis à jour le 03/09/2010 : upgrade des versions Apache et PHP et améliorations diverses

1 – Installer Apache

1.1 – Pré-requis

Des outils de compilation : make et g++. Ainsi que gnupg pour la vérification du package. Etant sur Debian, j'utilise apt-get pour les récupérer :

$ apt-get install g++ make gnupg

Je vous invite à vous rendre sur cette page pour récupérer le lien de la dernière version stable d'Apache http://httpd.apache.org/download.cgi#apache22

Et on récupère le package qui va bien, ainsi que les fichiers nécessaires à la vérification du package (intégrité et authenticité) :

$ cd ~
$ wget http://apache.cict.fr/httpd/httpd-2.2.17.tar.gz
$ wget http://apache.cict.fr/httpd/httpd-2.2.17.tar.gz.asc
$ wget http://apache.cict.fr/httpd/KEYS
$ wget http://www.apache.org/dist/httpd/httpd-2.2.17.tar.gz.md5

1.2 – Vérifier le package

Avant d'aller plus loin, il faut s'assurer que d'une part le package n'est pas altéré, et d'autre part qu'il est authentique, c'est à dire qu'il n'a pas été détourné par un tiers.

Nous utiliserons deux outils pour cela : md5sum pour l'intégrité et gnupg pour l'authenticité.

1.2.1 – Intégrité

L'intégrité du package se vérifie grâce au programme md5sum, qui va comparer le hash MD5 du package avec le hash MD5 récupéré sur le site d'Apache :

$ md5sum -c httpd-2.2.17.tar.gz.md5
httpd-2.2.17.tar.gz: OK

1.2.2 – Authenticité

L'authenticité du package se vérifie grâce au programme gnupg, qui va vérifier la signature du package (fichier httpd*.asc) avec la liste des clés publiques contenue dans le fichier KEYS que l'on va dans un premier temps importer :

$ gpg --import KEYS
gpg: clé 2719AF35: « Ben Laurie <ben@gonzo.ben.algroup.co.uk> » n'a pas changé
gpg: clé A99F75DD: « Rodent of Unusual Size <coar@ACM.Org> » n'a pas changé
...
gpg: clé E55B0D0E: « "Guenter Knauf" ("CODE SIGNING KEY") <fuankg@apache.org> » n'a pas changé
gpg: clé 39FF092C: « Jeff Trawick (CODE SIGNING KEY) <trawick@apache.org> » n'a pas changé
gpg:        Quantité totale traitée: 65
gpg:         sans nom d'utilisateur: 4
gpg:                      inchangée: 61
$ gpg --verify httpd-2.2.17.tar.gz.asc httpd-2.2.17.tar.gz
gpg: Signature faite le jeu 22 jui 2010 11:07:40 CEST avec la clé DSA ID 42721F00
gpg: Bonne signature de « Paul Querna <chip@force-elite.com> »
gpg:                 alias « Paul Querna <chip@cyan.com> »
gpg:                 alias « Paul Querna <pquerna@apache.org> »
gpg:                 alias « Paul Querna <chip@corelands.com> »
gpg: ATTENTION: Cette clé n'est pas certifiée avec une signature de confiance !
gpg:            Rien ne dit que la signature appartient à son propriétaire.
Empreinte de clé principale: 39F6 691A 0ECF 0C50 E8BB  849C F788 75F6 4272 1F00

Le "ATTENTION" indique simplement que la clé utlisée n'est pas certifiée par un tiers de confiance. Si vous n'avez pas confiance, vous pouvez toujours contacter la personne par téléphone pour s'assurer avec elle que vous possédez bien sa clé … (je suis sérieux !)

1.3 – Compiler et installer

Une fois le package d'Apache récupéré et vérifié on le décompresse dans le répertoire /usr/local/src :

$ tar xvzf httpd-2.2.17.tar.gz -C /usr/local/src
$ cd /usr/local/src/httpd-2.2.17/

On peut maintenant configurer, compiler et installer en spécifiant trois options :

  • --enable-mods-shared=most : permet la compilation de la plupart des modules
  • --enable-ssl : permet de compiler le module SSL, pour pouvoir utiliser le protocole HTTPS
  • --with-ssl : précise le chemin d'OpenSSL

Note: tous les modules compilés seront activés par défaut dans le fichier de configuration d'Apache, via la directive LoadModule. Sur un serveur de production, il faut bien sur désactiver tout les modules qui ne servent pas !!!

$ ./configure --enable-mods-shared=most --enable-ssl --with-ssl=/usr/local/ssl
$ make
$ make install

Voilà, c'est installé !

1.4 – Modifier le PATH

Afin de pouvoir utiliser les commandes fournies par Apache sans avoir à retaper toute l'arborescence, nous allons modifier la variable PATH des utilisateurs :

$ echo -e "apache=/usr/local/apache2/bin\nPATH=\$PATH:\$apache" >> /etc/profile
$ source /etc/profile

1.5 – Démarrer et tester

On peut maintenant démarrer le serveur Apache :

$ apachectl -k start

On vérifie que le processus est bien présent :

$ ps -ef | grep httpd
root      3405     1  0 15:42 ?        00:00:00 /usr/local/apache/bin/httpd -k start
daemon    3406  3405  0 15:42 ?        00:00:00 /usr/local/apache/bin/httpd -k start
daemon    3407  3405  0 15:42 ?        00:00:00 /usr/local/apache/bin/httpd -k start
daemon    3408  3405  0 15:42 ?        00:00:00 /usr/local/apache/bin/httpd -k start
daemon    3409  3405  0 15:42 ?        00:00:00 /usr/local/apache/bin/httpd -k start
daemon    3410  3405  0 15:42 ?        00:00:00 /usr/local/apache/bin/httpd -k start

Et que le serveur httpd est bien en écoute :

$ netstat -tlnp
Connexions Internet actives (seulement serveurs)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat        PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3405/httpd

Tout est OK, on peut maintenant faire un premier test de réponse du serveur en lui envoyant une requête HTTP :

$ wget -O - -q localhost:80
 <html><body><h1>It works!</h1></body></html>

Le serveur Apache nous réponds, tout est bon !

Ce qui nous est retourné est en fait le contenu du fichier /usr/local/apache2/htdocs/index.html

2 – Installer PHP

2.1 – Pré-requis

Les mêmes outils de compilation que précédemment : make et g++. Etant sur Debian, j'utilise apt-get pour les récupérer

$ apt-get install g++ make

Je vous invite à vous rendre sur cette page pour récupérer le lien de la dernière version stable de ¨PHP http://www.php.net/downloads.php#v5

Et on récupère le package qui va bien :

$ cd ~
$ wget -O php-5.3.4.tar.gz http://fr.php.net/get/php-5.3.4.tar.gz/from/this/mirror

2.2 – Vérifier le package

La vérification de l'intégrité du package ainsi téléchargé se fait grâce au hash md5 présent sur la page de téléchargement.

Ce hash md6 est à comparer au hash md5 du package sur votre serveur : s'il est identique, le package n'a pas été altéré. Pour la comparaison, deux méthodes :

  • calculer le hash md5 du fichier téléchargé et comparé à l'oeil par rapport au hash md5 du site
$ md5sum php-5.3.4.tar.gz
5adf1a537895c2ec933fddd48e78d8a2  php-5.3.4.tar.gz
  • copier le hash md5 du site dans un fichier et laisser md5sum comparé les deux
$ echo "5adf1a537895c2ec933fddd48e78d8a2 *php-5.3.4.tar.gz" > php-5.3.4.tar.gz.md5
$ md5sum -c php-5.3.4.tar.gz.md5
php-5.3.4.tar.gz: OK

2.3 – Compiler et installer

Une fois le package de PHP récupéré on le décompresse dans le répertoire /usr/local/src :

$ tar xvzf php-5.3.4.tar.gz -C /usr/local/src
$ cd /usr/local/src/php-5.3.4/

On peut maintenant configurer, compiler et installer en spécifiant un certain nombre d'options :

  • --prefix : chemin d'installation
  • --with-config-file : permet de spécifier l'emplacement du fichier de configuration de PHP
  • --with-apxs2 : permet de spécifier l'emplacement du programme permettant la compilation dynamique des modules Apache
  • --with-mysql : permet d'ajouter le support du serveur MySQL
  • --mandir : emplacement des pages de manuel

L'option --with-mysql est facultative, et n'est à mettre que si vous avez préalablement installé MySQL. Pour l'installation d'un serveur MySQL sur Linux, voir cet article : http://blog.moncoindunet.fr/linux/installer-un-serveur-mysql-sur-linux/

$ ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql --mandir=/usr/share/man
$ make
$ make install

Voilà, c'est installé !

2.4 – Modifier le PATH

Afin de pouvoir utiliser les commandes fournies par PHP sans avoir à retaper toute l'arborescence, nous allons modifier la variable PATH des utilisateurs :

$ echo -e "php=/usr/local/php/bin\nPATH=\$PATH:\$php" >> /etc/profile
$ source /etc/profile

2.5 – Configurer

Le package fournit deux fichiers de configuration adapté chacun à un environnement différent :

  • php.ini-development : pour un environnement de développement
  • php.ini-production : pour un environnement de production

Note : il est très important de respecter l'environnement qui convient !

Note 2 : le fichier php.ini-production correspond à l'ancien fichier php.ini-recommended et le fichier php.ini-development correspond à l'ancien fichier php.ini-dist

On copie le fichier choisit à l'emplacement défini dans les options de configuration :

$ cd /usr/local/src/php-5.3.4/
$ cp php.ini-production /usr/local/php/etc/php.ini

3 – Configurer Apache pour PHP

3.1 – Configurer Apache

La configuration du serveur Apache se fait dans le fichier httpd.conf, situé dans /usr/local/apache2/conf. Deux paramètres sont à configurer : le chargement du module PHP et la reconnaissance de l'extension .php en tant que fichier PHP.

$ cd /usr/local/apache2
$ vi conf/httpd.conf

L'installation de PHP a normalement déjà configuré le chargement du module PHP. Les deux paramètres sont donc à vérifier dans le fichier httpd.conf, et doivent être insérés s'ils sont absents :

LoadModule php5_module        modules/libphp5.so
AddType application/x-httpd-php .php

On redémarre le serveur Apache pour prendre en compte ces modifications :

$ apachectl -k stop
$ apachectl -k start

3.2 – Première page PHP

Nous allons maintenant vérifier qu'Apache interprète correctement les pages PHP en affichant les informations PHP via la function phpinfo(). Il suffit d'insérer ces lignes dans un fichier phpinfo.php que nous créerons dans le répertoire htdocs :

$ vi htdocs/phpinfo.php
<?php
phpinfo();
?>

Il suffit maintenant d'appeler la page http://localhost/phpinfo.php (ou http://<adresse IP du serveur>/phpinfo.php) pour constater que la page est bien interprété. Si oui, la page affichera les informations PHP du serveur (options de compilation, options propres à chacun des modules, etc.)

4 – Problèmes & solutions

Problème : une application a besoin d'un module que vous n'avez pas installer lors de la compilation de PHP.

Solution : il est toujours possible de recompiler avec le module manquant en plus des options de départ => voir le paragraphe 2.3 de l'article.

Quelques exemples d'options à ajouter pour des modules courant :

  • gettext (bibliothèque d'internationalisation) : --with-gettext
  • mbstring (pour les chaînes de caractères multi-octets) : --enable-mbstring
  • gd (pour la manipulation dynamique des images) : --with-gd
  • exif (pour le traitement du format EXIF des appareils photos) : --enable-exif
  • zip (pour le traitement des fichiers compressés):: --enable-zip

 

Problème remonté dans les logs du serveur Apache :

[Thu Mar 04 23:01:32 2010] [error] [client 193.23.51.124] PHP Fatal error:  Call to undefined function gettext() in /var/www/toto.php on line 21

Solution : reconfigurer PHP avec la prise en charge de gettext (cf. ci-dessus)


 

Problème lors de la compilation de PHP avec la prise en charge de GD :

configure: error: libpng.(a|so) not found.

Solution : installer d'abord le package libpng12-dev avant de recompiler :

$ apt-get install libpng12-dev


 

Problème lors de la compilation de PHP :

configure: error: xml2-config not found. Please check your libxml2 installation.

Solution : installer le package libxml2-dev

$ apt-get install libxml2-dev

 
No Comments

Posted in Apache, PHP

 

Tags: , ,

Leave a Reply