Installer Apache, MySQL et PHP sous Linux

Sommaire

Installer Linux
Installer Apache (statique)
Installer MySQL
Intermède
Installer PHP (statique)
Installer Apache et PHP (dynamique)
Installer Apache, mod-ssl et PHP (dynamique)
PHP et les images
Apache 2
Quelques tests
phpMyAdmin
Bibliographie

Installer GNU/Linux

L'on installera une distribution récente (avec threads, glibc 2.1, C et Perl).

Les tests de Apache 2 ont été faits avec des distributions Slackware 11.0 disponibles pour quelques euros chez Ikarios http://www.ikarios.com. Le noyau a été recompilé (2.6.18.x) ; l'absence de /usr/src/linux peut compromettre la compilation de certains programmes. La version 1 de Apache n'est plus testée et la documentation correspondante risque de ne plus être opérationnelle.

La distribution Slackware dans ses versions 9.x, 10.x, 11.x et 12.0 intègre directement les paquetages pour Apache, MySQL, PHP, et Openssl, et l'arborescence est modifiée par rapport aux versions précédentes (Apache quitte /var/lib/apache). Il a été choisi ici de ne pas utiliser les paquetages mais de tout installer dans /usr/local (choix de répertoire qui ne sera pas discuté ici) à partir des sources avec un répertoire par logiciel. Cette méthode est intéressante si l'on veut faire un chroot (exécution en environnement contrôlé) ou si l'on veut toujours utiliser la dernière version sans attendre la disponibilté des paquetages.

L'installation de Linux ne sera pas traitée ici.

Toutes les installations décrites ici se font sous le login root. L'auteur décline toute responsabilité etc. (de toute façon, c'est en cassant tout deux ou trois fois que l'on apprend ; si vous avez tout cassé une bonne dizaine de fois sans rien apprendre, envisagez de passer à une activité plus calme.)

Un simple ls -l /usr/src nous apprend qu'après décompactage des archives le propriétaire des archives n'est pas forcément celui qu'on croit. Penser à faire de temps en temps un truc du genre chown -R root.root /usr/src, ça peut éviter des surprises (du type par hasard un ID correspond à celui d'un utilisateur du système, et celui-ci qui est un peu joueur va modifier des choses sensibles dans les sources...)

retour au sommaire

Installer Apache (statique)

On traitera ici de l'installation du serveur Apache 1.3.x On installera toujours la dernière version (1.3.37 au 11/08/2007) non par snobisme mais pour des raisons de correction de bugs et de trous de sécurité.

Noter que statique signifie que les modules sont intégrés à l'exécutable ; il faut donc recompiler Apache si l'on veut ajouter ou supprimer des modules.

Enlever l'ancien Apache

On pourra faire par exemple :

killall httpd
cd /var/lib/apache
rm *
rm -rf *

Bon, d'accord, on peut faire autrement, c'était juste pour voir si vous avez le coeur sensible. Si vous avez supporté ça, le reste de l'installation ne devrait pas vous poser de problème.

Installer le nouveau

Récupérer l'archive apache_1.3.37.tar.gz (httpd.apache.org), compiler et installer :

cd /usr/src
tar -vzxf apache_1.3.37.tar.gz
cd apache_1.3.37
./configure --prefix=/usr/local/apache --enable-module=info
make
make install
chown -R nobody.nobody /usr/local/apache
chmod 700 /usr/local/apache

Configurer et lancer le nouvel Apache

Éditer le fichier /usr/local/apache/conf/httpd.conf :
Remplacer Group "#-1" par Group nobody
Autoriser l'exécution des scripts CGI : enlever le commentaire (#) de la ligne #AddHandler cgi-script .cgi

Changer les droits des scripts CGI :
chmod 500 /var/lib/apache/cgi-bin/*

Exécuter /usr/local/apache/bin/apachectl start pour lancer le serveur

Vérifier que tout va bien : lynx localhost (q pour quitter) puis lynx localhost/cgi-bin/test-cgi

Désactivez les scripts CGI si vous n'en n'avez pas besoin.

Rajouter les lignes rm /usr/local/apache/logs/httpd.pid et /usr/local/apache/bin/apachectl start dans un script de démarrage (/etc/rc.d/rc.inet2 ou autre) pour un lancement au démarrage de la machine.

retour au sommaire

Installer MySQL

La série de production est actuellement la série 5.0.

La dernière version stable est la 5.0.45 à la date du 11/08/2007 , c'est celle que nous utiliserons.

Compiler et installer

Créer un groupe et un utilisateur, et créer les répertoires :

groupadd mysql
adduser (répertoire /usr/local/mysql et groupe initial mysql)
mkdir /usr/local/mysql/data
mkdir /usr/local/mysql/tmp
mkdir /usr/local/mysql/var

Récupérer l'archive mysql-5.0.45.tar.gz (http://dev.mysql.com), compiler et installer :

cd /usr/src
tar -vzxf mysql-5.0.45.tar.gz
cd /usr/src/mysql-5.0.45
CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --with-unix-socket-path=/usr/local/mysql/tmp/mysql.socket
make
make install
chown -R mysql.mysql /usr/local/mysql
chmod 700 /usr/local/mysql/data
chmod 700 /usr/local/mysql/var
chmod 755 /usr/local/mysql/tmp

Pour une première installation , on initialise la base et on change le propriétaire au cas où :

scripts/mysql_install_db
chown -R mysql.mysql /usr/local/mysql

Tester l'installation

cp support-files/mysql.server /usr/local/sbin
chmod 744 /usr/local/sbin/mysql.server
mysql.server start
/usr/local/mysql/bin/mysqladmin -u root password 'motdepasse' (mot de passe admin)
/usr/local/mysql/bin/mysqladmin -p status
/usr/local/mysql/bin/mysqladmin -p shutdown

S'il y a un problème, vérifier les droits et le propriétaire (mysql) des fichiers et répertoires.

Les messages d'erreur se trouvent dans le fichier /usr/local/mysql/data/nom-du-serveur.err

Préparer le lancement automatique de MySQL au démarrage

Éditer un des fichiers de démarrage (/etc/rc.d/rc.local par exemple) pour rajouter la ligne :
/usr/local/sbin/mysql.server start
chmod 744 /usr/local/sbin/mysql.server

Installation des modules PERL (tout à fait facultatif)

Vous trouverez les modules PERL par exemple au CPAN : http://www.cpan.org/modules/by-module/Mysql/

Voyons le principe d'installation à l'ancienne d'un module PERL fictif : MonModulePerl.tar.gz

cd /usr/src
tar -vzxf MonModulePerl.tar.gz
cd MonModulePerl
perl Makefile.PL
make
make test
make install

Pour une méthode plus subtile, on peut utiliser « perl -MCPAN -e shell; » (voir « man CPAN »).

Et comment marche MySQL ?

MySQL (le démon mysqld) attend des requètes SQL (étrange, non ?) qui peuvent être envoyées en mode interactif par l'utilitaire "mysql" ou bien par un programme en C (#include <mysql.h>), un script Perl utilisant les modules cités ci-dessus, du PHP etc.

La sécurité des accès est contrôlée par une base de données appelée "mysql" ; il existe également par défaut une base de données "test"

Quelques commandes à essayer

/usr/local/mysql/bin/safe_mysqld &
/usr/local/mysql/bin/mysqladmin -p create test2 (création base)
/usr/local/mysql/bin/mysqladmin -p status
/usr/local/mysql/bin/mysqladmin -p version
/usr/local/mysql/bin/mysqlshow -p
(montre les bases de données)
/usr/local/mysql/bin/mysqladmin -p drop test2 (boum ; ne pas effacer les bases mysql et test)

Une session avec "mysql"

On suppose que MySQL (mysqld) est lancé. Ne pas oublier les ";" en fin de ligne.

# /usr/local/mysql/bin/mysql -p
help
show databases ;
use mysql ;
show tables ;
show fields from user from mysql ;
use mysql ;
select host,user,password from user ;
insert into user values ('localhost','toto',password('secret'),'Y', 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
create database test2 ;
use test2 ;
create table inventaire (article char(50), nombre int) ;
insert into inventaire values ('raton laveur',1) ;
insert into inventaire values ('petit vélo',1) ;
insert into inventaire values ('chocolats',50) ;
select * from inventaire ;
select article from inventaire where nombre > 1;
exit
# /usr/local/mysql/bin/mysqladmin -p shutdown

Il faudra penser à modifier rapidement les droits de MySQL pour travailler sous un autre compte que 'root'...

retour au sommaire

Intermède

L'on (re)lira avec profit des ouvrages traitant de

retour au sommaire

Installer PHP

La dernière version stable à la date du 11/08/2007 est la 5.2.3 L'on installera ici PHP à la mode "Quick install (static)".

Compiler et installer

Modifier ensuite le fichier /usr/local/apache/conf/httpd.conf et activer les options suivantes (ou modifier ou rajouter si nécessaire) :

Relancer apache pour prendre en compte la nouvelle configuration (/usr/local/apache/bin/apachectl restart)

Tester PHP

On va utiliser le fichier 404.php pour traiter les erreurs du type « document introuvable, encore planté »

Éditer le fichier /usr/local/apache/htdocs/404.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<title>Erreur 404</title>
</head>
<body>
<h1>Encore planté !</h1>
<p>Encore une erreur 404 de <?php echo $_SERVER["REMOTE_ADDR"]," (",gethostbyaddr($_SERVER["REMOTE_ADDR"]),")..."; ?> </p>
<p><em><?echo date("d-m-Y H:i:s")?></em></p>
</body>
</html>

retour au sommaire

Installer Apache et PHP (dynamique)

Notons que dynamique signifie que les modules ne sont pas intégrés à l'exécutable ; on peut ajouter ou supprimer des modules simplement en modifiant le fichier de configuration httpd.conf ; pour cette raison nous compilons ici tous les modules, il suffira de commenter par un # tous les modules à désactiver ; relancer ensuite le serveur.

Compiler et installer

cd /usr/src
tar -vzxf apache_1.3.37.tar.gz
cd ../apache_1.3.37
./configure --prefix=/usr/local/apache --enable-module=all --enable-shared=max
make
make install
cd ..
tar -vzxf php-5.2.3.tar.gz
cd php-5.2.3
./configure --with-mysql=/usr/local/mysql --with-apxs=/usr/local/apache/bin/apxs
make
make install
cp php.ini-dist /usr/local/lib/php.ini

Il faut ensuite éditer /usr/local/apache/conf/httpd.conf pour faire les mêmes modifications qu'indiqué ci dessus. Notons que les lignes nécessaires au chargement des modules ont été rajoutées automatiquement lors de la compilation / installation.

retour au sommaire

Installer Apache, mod-ssl et PHP (dynamique)

À la date du 11/08/2007 la dernière version stable de Openssl est la 0.9.8e (si vous avez des problèmes vous pouvez en rester à la version 0.9.7m ou à une version inférieure patchée pour raison de sécurité, les options d'installation restent les mêmes, seuls changent les répertoires.)

Si vous avez déjà installé Apache, commencez par faire le ménage :

cd /usr/src/apache_1.3.37/
make distclean
mv /usr/local/apache/conf /usr/local/apache/conf.old

Compiler et installer

Commencez par récupérer :
- mod-ssl (archive mod_ssl-2.8.28-1.3.37.tar.gz) sur le site http://www.modssl.org/ ou ftp://ftp.modssl.org/source/
- openssl (archive openssl-0.9.8e.tar.gz) sur le site http://www.openssl.org/
- mm (archive mm-1.2.1.tar.gz) sur le site http://www.engelschall.com/sw/mm/

Installez OpenSSL (mais vous l'avez déjà installé pour OpenSSH, non ?) :

cd /usr/src
tar -vzxf openssl-0.9.8e.tar.gz
chown -R root.root openssl-0.9.8e
cd openssl-0.9.8e
./config shared
make
make install
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig

Installez MM (facultatif, mais pour ce que ça coûte...) :

cd /usr/src
tar -vzxf mm-1.2.1.tar.gz
chown -R root.root mm-1.2.1
cd mm-1.2.1
./configure
make
make test
make install
ldconfig

Configurez Apache et mod-ssl

cd /usr/src
tar -vzxf apache_1.3.37.tar.gz
chown -R root.root apache_1.3.37
cd apache_1.3.37
make distclean [éventuel message d'erreur à ignorer]
cd /usr/src
tar -vzxf mod_ssl-2.8.28-1.3.37.tar.gz
chown -R root.root mod_ssl-2.8.28-1.3.37
cd mod_ssl-2.8.28-1.3.37
./configure --with-apache=../apache_1.3.37/ --with-ssl=../openssl-0.9.8e/ --with-mm=../mm-1.2.1/ --prefix=/usr/local/apache --enable-module=all --enable-shared=max --enable-rule=EAPI
cd ../apache_1.3.37/

Compilez et installez :

make
make install

Il faut ensuite éditer /usr/local/apache/conf/httpd.conf (comme d'habitude).

Pour l'installation de PHP voir ci-dessus [Installer Apache et PHP (dynamique)] ou ci-dessous [PHP et les images].

On revient à /usr/local/apache/conf/httpd.conf :
Dans la section LoadModule déplacer la ligne
LoadModule php5_module libexec/libphp5.so
juste avant la ligne <IfDefine SSL>
Dans la section AddModule déplacer la ligne
AddModule mod_php5.c
juste avant la ligne <IfDefine SSL>
Rajouter une ligne
AddType application/x-httpd-php .php .inc
par exemple juste après la ligne
AddType application/x-tar .tgz

Vous pouvez tout de suite démarrer apache en mode "normal" :
/usr/local/apache/bin/apachectl start
Pour utiliser mod-ssl vous devez générer des clés (make certificate ne fonctionne pas, ça va être plus compliqué)

Création des clés

On commence par se faire un petit coin tranquille et par rajouter si nécessaire la chemin de OpenSSL dans le PATH.
mkdir ~/certificats
cd ~/certificats
export PATH=$PATH:/usr/local/ssl/bin

Création d'une autorité de certification (CA = Certificate Authority)
- création avec openssl d'une clé RSA privée pour la CA ca.key. La seule chose demandée est un mot de passe (PEM pass phrase)
openssl genrsa -des3 -out ca.key 1024
- création avec openssl d'un certificat auto-signé pour la CA ca.crt
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Répondez au questionnaire :
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Haut-Poitou
Locality Name (eg, city) []:Poitiers
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Certificateurs SA
Organizational Unit Name (eg, section) []:Certificateurs
Common Name (eg, YOUR name) []:Dupondt
Email Address []:dupondt@certificateurs-sa.fr

Création d'un certificat pour un serveur
- création avec openssl d'une clé RSA privée pour le serveur server.key. il est demandé un autre mot de passe (disons n°2)
openssl genrsa -des3 -out server.key 1024
- création avec openssl d'une requète de signature de certificat server.csr. On redonne le mot de passe 2, on remplit le questionnaire et on donne un mot de passe n°3 (challenge). Le Common Name doit être le nom du serveur (FQDN)
openssl req -new -key server.key -out server.csr
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Aunis
Locality Name (eg, city) []:La Rochelle
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Ouaibe SA
Organizational Unit Name (eg, section) []:Ouaibe
Common Name (eg, YOUR name) []:mervent.geoffroy.melusine.eu.org
Email Address []:ouaibemaster@ouaibe-sa.fr
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:encore
An optional company name []:Options SA

- utilisation du script mod_ssl-x/pkg.contrib/sign.sh pour signer le certificat du serveur avec le certificat du CA /usr/src/mod_ssl-2.8.28-1.3.37/pkg.contrib/sign.sh server.csr
Utilisez le mot de passe 1, puis répondez y deux fois.

Recopie des clés vers /usr/local/apache/conf/* :
cp -p server.key /usr/local/apache/conf/ssl.key/server.key
cp -p server.crt /usr/local/apache/conf/ssl.crt/server.crt

Le lancement se fait par :
/usr/local/apache/bin/apachectl startssl
Le mot de passe à utiliser est le n°2 (celui donné lors de la création de la clé du serveur).

Lancement du serveur sans la passphrase au démarrage : sauvegarder la clé originale, enregistrer la clé en clair, s'assurer que root est le seul à pouvoir la lire :
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
chmod 400 server.key
chown root.root server.key
cp -p server.key /usr/local/apache/conf/ssl.key/server.key

Relancer le serveur.

retour au sommaire

PHP et les images

Pour pouvoir travailler sur des images JPEG et PNG, vous avez besoin de diverses bibliothèques (libjpeg, libpng, zlib et GD) et du support activé de jpeg et png dans PHP.

Les bibliothèques libjpeg, libpng et zlib sont généralement incluses dans votre distribution. GD 2 est désormais fourni avec PHP. Il vous faudra probablement Freetype2 (disponible sur freetype.sourceforge.net, à installer avec make setup ; make ; make install ; ldconfig) si vous voulez activer l'option --with-freetype-dir.

Compilez et installez PHP avec le support de jpeg et png :
cd /usr/src/php-5.2.3
./configure --with-open-ssl --with-mysql=/usr/local/mysql --with-apxs=/usr/local/apache/bin/apxs --with-zlib-dir --with-gd --with-png-dir --with-jpeg-dir --enable-png --enable-jpeg --with-ttf --with-t1lib --enable-gd-native-ttf --with-freetype-dir --with-xpm-dir --enable-dbase --with-dom=shared --with-dom-xslt=shared --with-dom-exslt=shared --with-iconv
make
make install
cp php.ini-dist /usr/local/lib/php.ini

Tests JPEG et PNG : créer deux fichiers imagejpeg.php et imagepng.php :

<?
$image=imagecreate(100,100);
$rouge=imagecolorallocate($image,255,0,0);
imagefill($image,0,0,$rouge);
header('Content-type: image/jpeg');
imagejpeg($image);
?>

<?
$image=imagecreate(100,100);
$bleu=imagecolorallocate($image,0,0,255);
imagefill($image,0,0,$bleu);
header('Content-type: image/png');
imagepng($image);
?>

La page suivante appellera les deux images :

<!-- image.php -->
<html>
<head>
<title>images</title>
</head>
<body>
<h1>Images</h1>
<p>
<img src="imagepng.php" width="200" height="200" alt="png bleu">
<img src="imagejpeg.php" width="200" height="200" alt="jpeg rouge">
</p>
<p><? print(date('H \h i - D j M Y'))?></p>
</body>
</html>

retour au sommaire

Apache 2

On utilisera la dernière version de Apache 2.0 (2.0.59 au 11/08/2007) avec la dernière version de PHP (5.2.3 au 11/08/2007).

Pour Apache 2.2 il semble prudent d'attendre un peu.

Il semble que les problèmes de stabilité qui se posaient avec Apache 2.0 + PHP aient à peu près disparu. Dans le doute, on peut toujours utiliser la version 1.3.37 de Apache si l'on veut utiliser PHP, et Apache 2.0.59 si l'on n'a pas besoin de PHP.

Avec Apache 2.0, la syntaxe de configure change légèrement. Si vous voulez tous les modules, il sera peut-être nécessaire pour éviter une erreur à la compilation d'installer d'abord expat disponible chez Sourceforge http://sourceforge.net/projects/expat/

tar -vzxf expat-1.95.5.tar.gz
cd expat-1.95.5
./configure
make
make install

tar -vzxf httpd-2.0.59.tar.gz
cd httpd-2.0.59
./configure --prefix=/usr/local/apache2 --enable-mods-shared=all
make
make install

tar -vzxf php-5.2.3.tar.gz
cd php-5.2.3
./configure --with-open-ssl --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache2/bin/apxs --with-zlib-dir --with-gd --with-png-dir --with-jpeg-dir --enable-png --enable-jpeg --with-ttf --with-t1lib --enable-gd-native-ttf --with-freetype-dir --with-xpm-dir --enable-dbase --with-dom=shared --with-dom-xslt=shared --with-dom-exslt=shared --with-iconv
make
make install
cp php.ini-dist /usr/local/lib/php.ini

Editer /usr/local/apache2/conf/httpd.conf pour rajouter une ligne LoadModule php5_module modules/libphp5.so, changer la ligne Group #-1 en Group nogroup, rajouter la ligne AddType application/x-httpd-php .php .inc, et faire toutes autres modifications nécessaires.

Vous démarrerez le serveur par /usr/local/apache2/bin/apachectl start. En cas de problème aller voir dans /usr/local/apache2/logs/.

Apache 2 et mod_ssl

Openssl doit être configuré avec l'option shared

cd openssl-0.9.8e
make distclean
./config shared
make
make install
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig

Apache doit doit être configuré avec l'option --enable-ssl

cd httpd-2.0.59
make distclean
./configure --prefix=/usr/local/apache2 --enable-mods-shared=all --enable-ssl
make
make install

Il faudra créer les clés comme pour Apache 1.3 et les placer dans les répertoires /usr/local/apache2/conf/ssl.crt et /usr/local/apache2/conf/ssl.key
Penser à modifier le nom du serveur dans la section virtualhost de ssl.conf.

On installe PHP comme ci-dessus :

tar -vzxf php-5.2.3.tar.gz
cd php-5.2.3
./configure --with-mysql=/usr/local/mysql --with-apxs2=/usr/local/apache2/bin/apxs --with-zlib-dir --with-gd --with-png-dir --with-jpeg-dir --enable-png --enable-jpeg --with-ttf --with-t1lib --enable-gd-native-ttf --with-freetype-dir --with-xpm-dir --enable-dbase --with-dom=shared --with-dom-xslt=shared --with-dom-exslt=shared --with-iconv--with-bz2 --with-yaz --with-xslt --with-xslt-sablot --with-gettext --enable-mbstring
make
make install
cp php.ini-dist /usr/local/lib/php.ini

Le serveur se démarre avec /usr/local/apache2/bin/apachectl startssl

retour au sommaire

Quelques tests

Décommenter dans httpd.conf les lignes ayant un rapport avec server-status et server-info et indiquez votre nom de domaine à l'endroit prévu à cet effet ; relancez le serveur et demandez les URLs /server-status et /server-info : vous devez obtenir un certain nombre de renseignements sur le serveur et les modules ; désactivez après usage, ces renseignements peuvent servir à des gens mal intentionnés.

Créez un fichier /usr/local/apache/htdocs/test.php contenant la seule ligne
<?phpinfo()?>
et demandez l'URL test.php ; voyez le résultat et supprimez ensuite ce fichier de test (même raison que précédemment).

Pour avoir les renseignements sur les en-têtes du serveur :
telnet mon-serveur http
Le serveur répond un truc du genre
Trying 192.168.1.1...
Connected to mon-serveur.
Escape character is '^]'.

Vous lui demandez aimablement :
HEAD / HTTP/1.0 [+ touche Entrée deux fois]
Et vous lisez le résultat, entre autres quelque chose du genre :
Server: Apache/1.3.37 (Unix) PHP/5.2.3
ou
Server: Apache/2.0.59 (Unix) mod_ssl/2.0.59 OpenSSL/0.9.8e PHP/5.2.3

retour au sommaire

phpMyAdmin

phpMyAdmin permet de gérer les bases MySQL avec une interface graphique.

À la date du 11/08/2007 la dernière version est la 2.10.3 (prendre le fichier phpMyAdmin-2.10.3-all-languages.tar.bz2)

Voir http://www.phpmyadmin.net/home_page/

Bibliographie

Cette bibliographie n'est plus à jour depuis longtemps...

Dans les news : groupe fr.comp.infosystems.www.serveurs

retour au sommaire

Retour à la page d'accueil

Dernière mise à jour le samedi 11 août 2007