Le Petit Journal du Linuxien Novice
© 1999-2007 César Alexanian. Hébergé officiellement chez Linux-France. Serveur principal tournant sous GNU/Linux chez NFrance Conseil
À SUIVRE...
Aucun lien
STATS

[ Nedstat ]
Dernière mise à jour : vendredi 30 novembre 2007

Compiler mysql, php et apache

par Jean-Michel OLTRA

Table des matières

Pourquoi tant de peine ?

Il devient utile de compiler à partir des sources lorsque le rpm ne donne plus entière satisfaction. Personnellement j'aimerais utiliser les fonctions pdf de php. La version rpm que je possède ne le permet pas, car php n'a pas été compilé avec l'option '-with-pdf'. Si vous possédez déjà une version de php installée par rpm, vous pouvez obtenir quelques info par un petit script :

//info.php3, quelques info sur php
<?
phpinfo();
?>

Vous lirez ce script sur votre navigateur.

D'autre part la multiplication des dépendances dans l'installation avec rpm ne permet pas forcément une mise à jour aisée. Si je ne veux pas changer ma version de php mais que je veux mettre à jour MySQL, je devrais trouver tous les rpm compatibles avec ce que je veux faire.

Enfin, compiler est très formateur, surtout quand ça cafouille....

1 Où trouver les sources nécessaires

1.1 récupérer

Pdflib va servir à générer des fichiers .pdf et gd, libgd en fait est utile si on veut utiliser les fonctions d'images de php. Ca ne mange pas de pain de toutes façons !

1.2 quelques rappels

Avant de compiler il faut décompresser les sources dans le répertoire de votre choix, que j'appelerai DIR. Personnellement je fais ça dans /usr/local/src.

Généralement la compilation se fait par l'exécution du script 'configure', puis on appelle 'make', et enfin encore make avec 'make install'. Ces appels de fonctions se font dans le répertoire créé par la décompression.

Lisez les README et autres INSTALL.

'configure -help' donne les options que l'on peut passer à 'configure'.

C'est parfois le fichier dénommé makefile (ou Makefile) qu'il faut modifier pour faire une installation personnalisée.

Si un 'configure' foire lamentablement pensez à faire un 'rm config.cache' pour détruire le fichier de config avant de tenter un nouveau 'configure'.

1.3 conventions

Le prompt sera représenté par %.

Le prompt mysql sera représenté par >.

Une application ou bibliothèque sera écrite de la forme suivante : appli-version, car après tout,chacun compilera peut-être une version différente.

Les options que je vous passe sont celles que j'ai utilisées. Vous constaterez peut-être que certaines vous manquent ou que d'autres vous sont inutiles. Vous constaterez également que j'ai du passer beaucoup de drapeaux à gcc (problème de conflits ?, de gcc ?). Ceux ci seront peut-être inutiles dans votre configuration.

J'avais déjà le tryptique mysql-php-apache installé à partir de rpm sur ma Mandrake 7.1. J'ai pu aller jusqu'aux 'make install' sans désinstaller mes paquetages.

1.4 le quart d'heure parano

Je vais vous indiquer de décompresser, puis compiler des sources. Toute entrée dans un système d'exploitation est une intrusion potentiellement dangereuse. Si il n'y a pas de risque dans les sources issues des sites que j'ai indiqué, il convient d'être circonspect dans l'utilisation de programmes externes : tar -tvzf, Midnight Commander permettent de visualiser les archives, 'make install -n' permet de tester la commande 'make install'.

2 compiler pdflib

J'ai utilisé pdflib-3.03

    % cd DIR
    % tar -xvzf pdflib-version.tar.gz
    % cd pdflib-version/
    % ./configure -enable-shared-pdflib
    % make
    % make install

Pdflib va s'installer dans /usr/local/lib et /usr/local/include. Modifiez le fichier /etc/ld.so.conf si /usr/local/lib n'est pas dedans (rajoutez la ligne). Puis, dans ce cas, exécutez /sbin/ldconfig.

    % mkdir /usr/local/fonts
    % cp fonts/* /usr/local/fonts

Editez /etc/profile et rajoutez les lignes suivantes :

    #pdflib(c'est un commentaire, pour s'y retrouver...)
    PDFLIBRESOURCE=/usr/local/fonts
    export PDFLIBRESOURCE

3 compiler gd

Vous compilerez si vous voulez utiliser les fonctions d'image de php. Sinon vous pouvez passer votre chemin...Installez avec les rpm, ou compilez, libjpeg et libpng avec les rpm 'devel'.

Personnellement, j'avais déjà installé les rpm freetype et xpm et j'ai compilé gd-1.8.4 avec la totale.

Vous allez me dire : ``mais j'ai un rpm gd qui est déjà installé...''. Personnellement je n'ai pas réussi à faire reconnaître gd-1.8.1 installé dans /usr/lib/ à mon 'configure' lors de la construction de php-4.0.5. Donc ça a été gd-1.8.4, et pas gd-2.0.1béta avec freetype2. Si freetype2 s'est laissée compiler sans chichi, je n'ai rien pu tirer de gd-2.0.1.

Attention :
En fait le script 'configure' s'est très bien exécuté lors de la compilation de php avec l'option '-with-gd=/usr/lib'. Le souci est arrivé au 'make'. Je n'ai pas été le seul : j'ai vu exactement le même problème dans les archives de la liste php-install. D'où la compil de gd dans un répertoire dédié.
% cd .. (n'oubliez pas, on était dans gd-1.8.4)
% tar -xvzf gd-1.8.4.tar.gz
% cd gd-1.8.4/

Editez le Makefile pour le modifier (et n'ayez pas peur il ne vous mangera pas...). Voici les options que j'ai donné (il s'agit surtout de commenter ou décommenter des lignes).

    CFLAGS -O DHAVE_LIBPNG -DHAVE_LIBXPM -DHAVE_LIBJPEG -DHAVE_LIBFREETYPE -DHAVE_LIBTTF
    LIBS=-lgd -lpng -lz -ljpeg -lfreetype -lttf
    INCLUDEDIRS=-I. -I/usr/include/freetype -I/usr/include/X11 -I/usr/X11R6/include -I/usr/local/include
    LIBDIRS=-L. -L/usr/local/lib -L/usr/lib/X11 -L/usr/XR/lib
    INSTALL_LIB=/usr/local/lib/gd-1.8.4
    INSTALL_INCLUDE=/usr/local/lib/gd-1.8.4
    INSTALL_BIN=/usr/local/bin

Comme vous le constatez on fourre le résultat de la compil dans /usr/local/lib/gd-1.8.4 (ce sont les valeurs données à INSTALL_LIB et INSTALL_INCLUDE).

Adaptez le Makefile à ce que vous avez et à ce que vous désirez.

% mkdir /usr/local/lib/gd-1.8.4
% make
% make install

4 compiler mysql

J'ai utilisé la 3.23.36, je l'avais en stock, mais la current release est, à l'heure où j'écris ces lignes, la 3.23.38.

Tant que j'y suis je ne saurais que trop vous conseiller le livre 'Mysql' de Paul DuBois chez CampusPress. Très bien écrit, extrêmement fonctionnel.

% cd ..
%tar -xvzf mysql-version.tar.gz
% cd mysql-version/
% CC=gcc CXX=gcc ./configure -prefix=/usr/local/mysql

J'ai passé des variables à gcc pour faire comme dans la doc. Ca n'a marché que lorsque j'ai installé le paquetage gcc-c+, support du c+ pour le compilateur gcc. A mon avis './configure' doit suffire, mais je ne suis pas un gars simple !

Tel que je vous le dis, mysql installera son arborescence dans /usr/local/mysql. La source de donnée se trouvera dans /usr/local/mysql/var/ lorsque vous initialiserez les tables de permissions, avec mysql_install_db. Si ça ne vous convient pas, './configure -help' !

% make
% make install

5 compiler php comme module apache

5.1 première configuration d'apache

J'ai compilé apache_1.3.19, mais la 1.3.20 est sortie tout récemment.

% cd ..
% tar -xvzf apache-version.tar.gz
% cd apache-version/
% ./configure

Ainsi apache développera son arborescence dans /usr/local/apache/. Certains préfèrent installer le serveur dans /www. Dans ce cas il m'eut fallu indiquer './configure -prefix=/www'. Un petit coup de './configure -help' pour les curieux...

5.2 le gros morceau:php

Ma version est php-4.0.5

Le script 'configure' m'a demandé 'bison' et 'flex'. Je les ai installés en paquetage.

5.2.1 version allégée de configure

Pourquoi allégée ? Parce qu'on n'indique pas de chemin pour pdflib. Cette version a fonctionné sur une Mandrake 8 mais pas chez moi, sur la 7.1. Vous pouvez éventuellement commencer par là. Quand je dis qu'elle n'a pas fonctionné c'est qu'en fait je n'ai pas eu d'erreur sur la compilation elle-même mais que je ne pouvais pas utiliser de fonction pdf dans un script ! Cela se voyait sur la sortie de phpinfo() d'ailleurs : le support pdf n'était pas pris en compte.

% cd ..
% tar -xvzf php-version.tar.gz
% cd php-version/
% CPPFLAGS=''-I/usr/local/mysql/include/mysql -I/usr/local/include'' LDFLAGS=-L/usr/X11R6/lib ./configure -with-mysql=/usr/local/mysql -with-pdflib -with-apache=../apache-version -enable-track-vars -with-gd=/usr/local/lib/gd-1.8.4 -with-zlib-dir=/usr/lib -with-ttf=/usr/include/freetype -with-t1lib -enable-magic-quotes -with-jpeg-dir=/usr/lib -with-xpm-dir=/usr/X11R6/lib -with-tiff-dir=/usr/lib

Vous le constatez, j'ai passé pas mal de drapeaux à 'configure', mais sans ceux-ci mes bibliothèques n'étaient pas trouvées. CPPFLAGS=-I donne le chemin vers les fichiers à inclure, tandis que LDFLAGS=-L donne le chemin vers les bibliothèques.

5.2.2 version un peu moins allégée...

Qui n'a pas fonctionné chez moi non plus...

Indiquer :

-with-pdflib=/usr/local/lib

Avec éventuellement un argument de plus dans LDFLAGS :-L/usr/local/lib

5.2.3 version lourde :la mienne !

Pour que ça fonctionne il m'a fallu faire plus lourd. Mon cas n'est pas isolé : j'ai également vu dans les archives de la liste php-install des cas de pdf en théorie inclus dans php à la compil mais qui ne fonctionne pas au final.

J'ai créé un répertoire dans /usr/local/lib pour pdflib et un sous répertoire dans celui-ci pour les headers :

% mkdir /usr/local/lib/pdf3.03
% mkdir /usr/local/lib/pdf3.03/include

Et j'ai recopié les bibliothèques libpdf (.a, .la, .so.0.1.1) , et refait les liens, dans /usr/local/lib/pdf3.03, tandis que pdflib.h allait dans /usr/local/lib/pdf3.03/include. Puis je n'ai pas fait de détails et ajouté à 'configure' :

-I/usr/local/lib/pdf3.03/include -L/usr/local/lib/pdf3.03 -with-pdflib=/usr/local/lib/pdf3.03

J'ai pu obtenir au final les fonctions pdf !

'configure -help' peut vous donner les arguments à passer au script pour mettre les bibliothèques et les headers où vous voulez au 'make install'. Je ne l'ai pas fait car j'avais déjà les bibliothèques installées dans /usr/local/lib et /usr/local/include.

5.2.4 fin de la construction

% make
% make install

Si vous ne voulez pas utiliser les fonctions d'images ou pdf pour débuter, configurez avec pdflib, mysql, apache et 'enable-track-vars' tout simplement.

5.3 apache

On revient ensuite vers Apache.

% cd ..
% cd apache-version
% LDFLAGS=-L/usr/X11R6/lib ./configure -activate-module=/src/modules/php/libphp4
% make install

Et Apache file tout droit vers /usr/local/apache.

6 Prise en mains de la nouvelle installation

6.1 mysql

On partira du principe que vous avez installé mysql dans PREFIX (chez moi, par conséquent, PREFIX=/usr/local/mysql/).

faites un dump
de vos tables si vous avez déjà une installation. Vérifiez que votre dump est bien fait en créant puis chargeant une de vos tables dans la base de test (qui s'appelle test car le monde est bien fait !).
% mysqldump -opt -tab=/chemin/vers/le/répertoire/ base-de-donnée

Personnellement j'ai choisi de mettre mes sauvegardes dans une autre partition que mes bases. J'ai créé un /home/mysql/backup/ avec un sous répertoire par base. /home/mysql/ appartient à 'mysql' (mais ne constitue pas sa 'maison' qui est indiquée dans /etc/passwd et qui est en fait /usr/local/mysql/var actuellement, pour tout vous avouer, avant que vous ne me passiez à la question !). Le répertoire doit être accessible à 'mysql'. Ce qui donne :

% mysqldump -tab=/home/mysql/backup/troupeau troupeau

Je n'indique pas l'option -opt, ni l'option -fields-terminated-by=; car j'ai un fichier /etc/my.cnf, dans lequel les options sont passées au groupe [mysqldump].

faire le ménage
à grands coups de 'rpm -e' : mysql, mysql-client, mysql-shared-libs, mod_php3-mysql si vous aviez déjà une installation.
préparer le démarrage
au boot :
% cp PREFIX/share/mysql.server /etc/rc.d/init.d/mysql
% ln -s /etc/rc.d/init.d/mysql /etc/rc.d/rc5.d/S99mysql
% ln -s /etc/rc.d/init.d/mysql /etc/rc.d/rc0.d/K99mysql

si vous avez les même répertoires de démarrage que moi.

créez
un utilisateur et un groupe mysql (ou un autre nom) qui possèdera les données (dans /PREFIX/var/), si vous n'en avez pas déjà un.
créez ou modifiez
si nécessaire les fichiez /.my.cnf et /etc/my.cnf. Il y a un exemple pour un /etc/my.cnf dans PREFIX/share/mysql. Ces fichiers sont très pratiques.
démarrer
le serveur.
% /etc/rc.d/init.d/mysql start
% ps -aux | grep 'mysql'

Ainsi vous vérifiez que le serveur est entré en action et sous quel nom d'utilisateur il est lancé. Je le lance sous mysql.

initialiser les tables de permissions
avec le script PREFIX/bin/mysql_install_db. Utilisez l'option '-force' si vous avez une sortie d'erreur.
déterminer
le mot de passe du root. Avec mysqladmin où, si mysqladmin ne fait rien, comme chez moi, en choisissant la démarche suivante :
  1. éteindre le serveur, puis le redémarrer avec :
    % safe_mysqld -skip-grant-tables &
  2. se reconnecter en temps que root :
% mysql -u root mysql
> update user set password = password(mot-de-passe-root) where user = 'root';
> flush privileges;

L'option '-skip-grant-tables' permet d'entrer dans le serveur sans tenir compte des permissions. Evidemment ensuite on fait ce qu'on veut. On, ça peut vouloir dire n'importe qui si il y a des trous de sécurité...Flush privilèges recharge les tables de permissions. Et tant que vous y êtes vous re-créez vos bases :

> create database ma-base;
donner les droits
avec GRANT ou avec le dump de la base mysql ainsi que vous le verrez plus loin.
> grant droit_1, droit_2,... on ma-base.* to user@localhost identified by mot-de-passe-user;

Vous pouvez consulter mon document précédent sur ce site sur l'instruction 'grant', ou un bon bouquin !

recréer les tables
avec les fichiers .sql du dump :
% mysql ma-base < ma-table.sql

Commande courte car j'ai un fichier /.my.cnf.

Je vous donne un exemple personnel d'une autre commande que vous adapterez à votre cas :

% ls /home/mysql/backup/troupeau | awk -F . 'BEGIN{dir=''/home/mysql/backup/troupeau/''} /sql/ {system(``/usr/local/mysql/bin/mysql troupeau < ``dir$0)}'

Cette commande (exécutée sous le compte root pour avoir l'accès à /home/mysql/ ) charge tous les fichiers .sql du dump de la base 'troupeau' (l'ancienne dans le cas présent) dans la nouvelle base 'troupeau'. Attention à la syntaxe du script avec awk. J'aime bien awk, on fait des scripts utiles avec. Vous pouvez mettre ça dans un script. Il suffit de changer les noms de répertoires et de base de donnée pour créer toutes les tables dans toutes les bases, avec une seule instruction par base.

recharger les tables
avec mysqlimport ou l'instruction 'load data' :
> load data local infile 'chemin/vers/fichier-de-dump.txt' into table ma-table fields terminated by ';';

Je vous la joue awk encore une fois !

% ls /home/mysql/backup/troupeau | awk -F . 'BEGIN{dir=''/home/mysql/backup/troupeau/''} /txt/ {system(``/usr/local/mysql/bin/mysqlimport troupeau `` dir$0)}

attention :il y a un espace entre troupeau et ``. Ceci charge tous les fichiers .txt dans la base troupeau à l'aide de l'utilitaire mysqlimport, qui, en fait, exécute une instruction 'load data'. Je n'ai pas mis les options -local et -fields-terminated-by=; car elles sont données dans /etc/my.cnf, sous le nom de groupe [mysqlimport].

C'est fini. Il ne reste plus qu'à établir une politique pour les fichiers de log, et pour les sauvegardes, ainsi que pour les vérifications de l'intégrité des tables (ça je ne l'ai pas encore fait). J'ai demandé les sauvegardes dans un script appelé par la crontab de l'utilisateur mysql à qui j'ai donné les droits de 'select' et 'file'. Il y a surement d'autres choses à faire pour une administration fine mais je ne sais pas tout !

6.2 apache

De la même manière, on partira du principe qu'Apache est installé dans PREFIX (chez moi PREFIX est donc /usr/local/apache)

éventuellement sauvegardez
vos httpd.conf et php3.ini, ça fera une base pour la reconfiguration.
faites encore le ménage
de ce que vous avez d'Apache et de php. Si, comme moi vous avez mis votre fichier de mot de passe dans /etc/httpd/conf, la commande 'rpm -e' ne pourra vider le répertoire et vous le ferez à la main.
préparez le démarrage
au boot :
% cp PREFIX/bin/apachectl /etc/rc.d/init.d/httpd
% ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc5.d/S85httpd
% ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc0.d/K85httpd
renseignez
le fichier PREFIX/conf/httpd.conf. Pour ce faire reportez vous au document que j'ai
déjà préparé sur php-mysql-apache, voyez la configuration (extrêmement sommaire) du serveur.
Il vous faut néanmoins renseigner la directive AddType ainsi :
AddType application/x-httpd-php .php .php3

Apache reconnaîtra les extensions .php et .php3. Si vous choisissez des extensions plus fun du type '.vive_le_petit_journal', c'est votre droit mais il faut le renseigner aussi, apache a de l'humour quand on lui explique !

démarrez
le serveur :
% /etc/rc.d/init.d/httpd start
% ps -aux | grep 'apache'
recopiez
l'arborescence de vos scripts dans le répertoire PREFIX/htdocs. N'oubliez pas de modifier vos fichiers .htaccess si vous avez changé l'emplacement du fichier de mot de passe (je l'ai déplacé de feu /etc/httpd/conf à PREFIX/conf) et de redonner les droits de lecture à l'utilisateur nobody pour que le serveur puisse lire vos scripts.

Et pour finir

Tout ça devrait vous conduire à un résultat satisfaisant. Je ne suis pas un guru de la compil mais j'essaierai de vous apporter de l'aide à : mailto:lapagedudebutant@libertysurf.fr. Il y a aussi les listes php-install, mysql et une liste php-france. Consultez les archives des listes en cas de problème, ou inscrivez vous. On y apprends beaucoup. Allez, vous avez les sources, faites chauffer gcc !

[ Retour ]

Remonter

Site réalisé sous Gnu-Linux en PHP mis en forme avec Quanta et mis en ligne grâce à gFTP sous la Mandrake 9.1