[Présentation | Installation ( Installation de MySQL, Installation d'Apache , Installation de PHP4 ) | Configuration basique( Présentation de l'arborescence d'Apache  | Le fichier de configuration d'Apache ,lancement automatique d'Apache sous Mandriva, Lancement automatique d'Apache sous ubuntules pages  webs utilisateurs, les alias  )  |    Configuration avancée ( Protection d'une page,hôtes virtuels ) |  Gestion de bases de données avec MySQL ( Tests de fonctionnement avec MySQL | Administrer ses bases avec phpMyAdmin )| Scripts CGI  | PHP et LDAP | Sécuriser Apache et PHP]

Dernière modification 7 mars 2007

Apache 1.3.37 + PHP5.2.1 + MySQL 5.0.33

(Ce guide peut être téléchargé dans la section téléchargement)

Configuration réseau


Présentation

Cette page présente l'installation et la configuration d'Apache 1.3.37 avec PHP5.1.6 et MySQL 5.0.27, elle est basée sur la compilation complète de ces applications par conséquent elle devrait convenir pour toutes les distributions de linux.

Vous devez récupérer préalablement les sources d' Apache à l'URL www.apache.org on récupère ensuite PHP à l'URL www.php.net , et enfin MySQL à l'URL www.mysql.com.

Pour l'analyser des logs d'Apache, reportez vous à la page "Analyser les logs d'Apache avec Webalizer et Awstats".

Pour mettre en place un moteur de recherche, reportez vous à la page " Ht://Dig"
 

[retour haut de la page]

Installation

Installation de MySQL

Dans le répertoire de travail, on décompresse l'archive:

tar xvfz mysql-5.0.33.tar.gz

Cela crée le répertoire  mysql-5.0.33, sur ma Mandriva j'ai du installer les packages libncurses5-devel et orbit-devel et installer le lien suivant

ln -s /usr/bin/orbit2-config /usr/bin/orbit-config

Sous ubuntu ce n'est pas nécessaire. Dans le répertoire de MySQL, on tape alors:

./configure

Puis

make

La compilation est relativement longue même sur une machine puissante. On tape maintenant en temps que root:

make install

Les exécutables sont installés par défaut sous /usr/local/bin et le serveur mysqld sous /usr/local/libexec. Les bibliothèques vont se trouver sous /usr/local/lib/mysql, rajoutez cette ligne dans le fichier /etc/ld.so.conf et tapez

ldconfig

Si c'est la première fois que vous installez MySQL vous devez taper la commande suivante, vous pouvez passer à l'étape suivante si vous upgradez MySQL :

./mysql-5.0.33/scripts/mysql_install_db

Voilà le résultat obtenu

Installing all prepared tables
Fill help tables

To start mysqld at boot time you have to copy support-files/mysql.server
to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/local/bin/mysqladmin -u root password 'new-password'
/usr/local/bin/mysqladmin -u root -h mana password 'new-password'
See the manual for more instructions.

NOTE:  If you are upgrading from a MySQL <= 3.22.10 you should run
the /usr/local/bin/mysql_fix_privilege_tables. Otherwise you will not be
able to use the new GRANT command!

You can start the MySQL daemon with:
cd /usr/local ; /usr/local/bin/mysqld_safe &

You can test the MySQL daemon with the benchmarks in the 'sql-bench' directory:
cd sql-bench ; perl run-all-tests

Please report any problems with the /usr/local/bin/mysqlbug script!

The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at http://shop.mysql.com

Pour info les bases sont installées par défaut sous /usr/local/var. Si ce n'est pas déjà fait créer le groupe mysql

groupadd mysql

Puis l'utilisateur mysql du groupe mysql

useradd -g mysql mysql

Les bases se trouvent par défaut sous /usr/local/var, mysql doit en être propriétaire

chown -R mysql /usr/local/var

idem pour le groupe

chgrp -R mysql /usr/local/var

Puis on lance le serveur en tapant:

scripts/mysqld_safe &

Ce qui va donner comme résultat

Starting mysqld daemon with databases from /usr/local/var

Avec cette dernière version mysql refusait de se lancer, dans le fichier d'erreur (sous /usr/local/var par défaut)  j'avais

041002 12:18:13  mysqld started
/usr/local/libexec/mysqld: Can't read dir of '/root/tmp/' (Errcode: 13)
/usr/local/libexec/mysqld: Can't create/write to file '/root/tmp/ibqQdaUA' (Errcode: 13)
041002 12:18:13  InnoDB: Error: unable to create temporary file; errno: 13
041002 12:18:13 Can't init databases
041002 12:18:13 Aborting

j'ai résolu cela en tapant avant de lancer mysqld_safe

export TMPDIR=/tmp

Pour un lancement automatique

Pour que MySQL soit lancé automatiquement au boot, on modifiera le fichier mysql.server.sh. Dans ce fichier au lieu de @HOSTNAME@ on écrit hostname, on modifie également la variable basedir (au lieu d'avoir basedir= on écrit  basedir=/usr/local) et pour finir la variable datadir (au lieu de datadir= on écrit datadir=/usr/local/var).

En admettant que votre poste soit connecté sur internet et que vous vouliez pas que n'importe qui puisse accéder à votre serveur internet, vous pouvez préciser l'adresse IP locale de votre serveur pour que seuls les postes de votre réseau puisse y accéder, on modifie la ligne suivante comme ceci

$bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file --bind-address=192.168.26.110 $other_args >/dev/null 2>&1 &

Vous mettre l'adresse IP local de votre serveur (127.0.0.1 si  poste isolé). Par ailleurs si vous avez l'erreur mentionné plus haut rajouté ( à la suite de la déclaration de PATH)

TMPDIR=/tmp
export TMPDIR

Maintenant sous Mandriva

on copie le fichier sous /etc/rc.d/init.d et on le renommera mysql

cp ./mysql-5.0.33/support-files/mysql.server.sh /etc/rc.d/init.d/mysql

On donne les droits d'exécution à ce fichier

chmod 755  /etc/rc.d/init.d/mysql

Pour un lancement automatique de MySQL à l'état de marche 3, 4 et 5, on tapera ensuite

chkconfig --level 345 mysql on

Et un arrêt à l'état de marche 0, 1, 2 et 6

chkconfig --level 0126 mysql off

Sous ubuntu

On copie le fichier sous /etc/init.d et on le nomme mysql, on doit dans ce fichier faire une dernière modif à la place de source on met un . (un point). On donne les droits d'exécution à ce fichier

chmod 755  /etc/init.d/mysql

Pour un lancement automatique on tape

update-rc.d mysql defaults

A présent reportez vous à la page MySQL à partir de la  création du mot de passe pour root, le reste de la configuration et de l'utilisation est identique à la version RPM.
 

[retour haut de la page]

Installation d'Apache

Pour Apache, on désarchive en tapant:

tar xvfz apache_1.3.37.tar.gz

Cela va créer le répertoire apache_1.3.37. Dans ce répertoire, on tape alors:

./configure --prefix=/usr/local/apache --enable-module=most --enable-shared=max

Par prefix on indique que le fichier de conf se trouvera sous /usr/local/apache/conf. Sous Mandriva j'ai du préalablement installer le package libgdbm2-devel. Sous ubuntu il faudra installer le package libgdbm-dev puis créer le lien suivant

ln -s /usr/include/gdbm-ndbm.h /usr/include/ndbm.h

sous ubuntu j'obtiens l'erreur suivante

 + Warning: Your 'echo' command is slightly broken.
 + It interprets escape sequences per default. We already
 + tried 'echo -E' but had no real success. If errors occur
 + please set the SEO variable in 'configure' manually to
 + the required 'echo' options, i.e. those which force your
 + 'echo' to not interpret escape sequences per default.
 + using installation path layout: Apache (config.layout)

pour la corriger on édite le fichier configure et à la première ligne au lieu de #!/bin/sh on écrit #!/bin/bash on retape ensuite configure avec toutes ses options puis

make

et en tant que root:

make install

Il faudra modifier quelque peu le fichier httpd.conf se trouvant sous /usr/local/apache/conf notamment

ServerName nomdevotremachine

et

Port 80

Pour le reste on verra plus tard pour améliorer. Pour lancer maintenant Apache, il faut taper :

/usr/local/apache/bin/apachectl start

si vous rencontrez l'erreur suivante

Cannot load /usr/local/apache/libexec/mod_auth_dbm.so into server: /usr/local/apache/libexec/mod_auth_dbm.so: undefined symbol: dbm_fetch

Dans le répertoire d'Apache précisément sous src/modules/standard on efface mod_auth_dbm.so et on tape

gcc -shared  -o mod_auth_dbm.so mod_auth_dbm.lo -lgdbm -lgdbm_compat

on copie maintenant le module dans le répertoire qui va bien

cp mod_auth_dbm.so /usr/local/apache/libexec

et on peut maintenant lancer apache. A présent dans le répertoire /usr/local/apache/htdocs tapez

mv index.html.fr index.html

Maintenant dans votre navigateur préféré dans le champ URL taper http://localhost ou http://nomdelamachine et là la page d'accueil d'Apache apparaît, pour info celle-ci se trouve sous /usr/local/apache/htdocs.

NOTE Si vous upgradez d'une ancienne version, vos fichiers de conf ne seront pas écrasés.
 

[retour haut de la page]

Installation de PHP

Pour php5, on tapera d'abord

tar xvfj php-5.2.1.tar.bz2

Cela va créer un répertoire php-5.2.1. A présent dans le répertoire de php, vous taperez

./configure --with-apxs=/usr/local/apache/bin/apxs --with-config-file-path=/usr/local/apache/conf --enable-versioning --with-mysql --with-ftp --enable-bcmath=yes --enable-debug=no --enable-memory-limit=yes   --enable-tracks-vars --with-gd --with-zlib  --with-kerberos --enable-mbstring --with-mcrypt

Notes     - Vous avez besoin du package flex contenant lex ainsi que du package libxml2-devel

             -  les options --with-gd --with-zlib  --with-kerberos sont utiles pour l'utilisation des mods freeplayer de la freebox

               -  les options --enable-mbstring --with-mcrypt sont nécessaires pour phpMyAdmin elles requièrent l'installation des packages libmcrypt-dev et mcrypt

Tapez maintenant

make

Puis en tant que root

make install

Cette dernière commande va installer le module PHP sous /usr/local/apache/libexec et modifier automatiquement le fichier httpd.conf pour qu'Apache prenne en compte PHP, et rajouter les lignes suivantes :

LoadModule php5_module        libexec/libphp5.so

Supprimez les lignes qui font référence au chargement du module pour PHP4 dans le cas d'une ancienne installation.

Au niveau de

AddType application/x-tar .tgz

On rajoutera

AddType application/x-httpd-php .php .php .php4 .php5 .phtml
AddType application/x-httpd-php-source .phps

Par ailleurs à la ligne

DirectoryIndex index.html

On rajoutera

DirectoryIndex index.html index.htm index.php index.php index.php4 index.php5

A présent on va copier le fichier php.ini-dist se trouvant dans le répertoire de PHP ./php-5.2.1 pour le mettre sous /usr/local/apache/conf et en le renommant php.ini

cp ./php-5.2.1/php.ini-dist /usr/local/apache/conf/php.ini

Dans le cas d'une ancienne installation de php, vous avez tout intérêt à repartir du nouveau fichier php-dist.ini fourni et de le remodifier.
On relance Apache

/usr/local/apache/bin/apachectl restart

Créer maintenant le fichier infophp.php contenant

<?
phpinfo();
?>

Que vous placerez sous /usr/local/apache/htdocs, dans l'URL de votre navigateur préféré, taper http://localhost/infophp.php ou http://nommachine/infophp.php et là magique devrait s'afficher des info sur la configuration de PHP sur votre système, dont le tableau suivant:


ATTENTION Si comme moi vous utilisez des URL du style http://www.funix.org/fr/linux/main-linux.php?ref=apache&page=menu c'est à dire avec passage d'arguments, à partir de la version 4.2.0 de php cela risque de ne pas fonctionner. Le passage d'argument est régi entre autres par la variable register_globals qui a été désactivée dans le fichier php.ini pour des raisons de sécurité. Pour la réactiver éditez /usr/local/apache/conf/php.ini et au lieu de

register_globals = Off

Mettez

register_globals = On

Relancez Apache. Cela dit vous avez intérêt à laisser cette variable à Off et procéder comme suit. Voilà le bout de code php des pages html de ce site pour faire l'inclusion du menu à gauche ou pas. Voilà la code avec register_globals = On

<?
        if ($page=="menu")
        {
                $menu="menu.htm";
                include($menu);
        }
?>

Et le même code avec register_globals = Off

<?
        if ($_GET["page"]=="menu")
        {
                $menu="menu.htm";
                include($menu);
        }
?>

Pour plus d'info sur cette fonctionnalité désactivée et sur la manière de faire autrement http://www.php.net/manual/en/security.registerglobals.php
 
 

[retour haut de la page]

Configuration basique

Présentation de l'arborescence d'Apache

L'installation va créer un répertoire /usr/local/apache  contenant:
- répertoire bin contient les exécutables d'Apache
- répertoire cgi-bin contient les scripts CGI
- répertoire conf contient les fichiers de configuration d'Apache
- répertoire htdocs contient la page d'accueil d'Apache
- répertoire icons contient des icônes qui servent notamment pour identifier les types de fichier.
- répertoire include contient les includes d'Apache
- répertoire libexec contient les modules d'Apache
- répertoire logs contient les fichiers de log d'Apache
- répertoire man contient les mans d'Apache
- répertoire proxy Apache peut être utilisé comme un proxy, c'est le répertoire cache pour cette fonction 

Le répertoire de log contient essentiellement deux fichiers:
- access_log listant les accès au serveur
- error_log listant les erreurs en tout genre

Le répertoire de modules libexec contient tous les modules utilisables par Apache, pour info un module est une extension logicielle à Apache, lui permettant par exemple d'interpréter le php (module libphp5.so), ou alors de créer des hôtes virtuels (module mod_vhost_alias.so).

Le répertoire /usr/local/apache/conf contient:
- le fichier de configuration d'Apache http.conf
- mime.types fixe le type de fichier suivant l'extension du dit fichier (.doc=msword, .ps=postscript, ...), ça permet au client qui se connecte sur le serveur, de savoir comment interpréter le fichier suivant son extension.
- magic sert pour le module mod_mime_magic
- php.ini pour contrôler certains aspects de PHP
 

[retour haut de la page]

Le fichier de configuration d'Apache

Le fichier de conf d'Apache se trouve sous /usr/local/apache et se nomme httpd.conf, voici les points que je juge important dans le fichier:

(...)

# ---------------------- Server Configuration ----------------------------

# ServerType is either inetd, or standalone.
# vous pouvez soit lancer Apache par le super daemon inetd (config dans /etc/inetd.conf) soit tout seul avec un script dans /etc/rc.d/init.d, à noter qu'avec la première méthode vous pouvez contrôler l'accès avec les TCP_Wrappers (hosts.deny, hosts.allow)
# voir la note en bas du paragraphe pour les avantages de l'un ou de l'autre
# moi j'ai choisi lancement en standalone (voir paragraphe suivant)

ServerType standalone

(...)

# Do NOT add a slash at the end of the directory path.
# Répertoire racine d'Apache
ServerRoot "/usr/local/apache"

(...)

# PidFile: The file in which the server should record its process
# identification number when it starts.
# C'est dans ce fichier qu'on trouvera l'identification du process d'Apache
# c'est utile pour ne pas lancer deux fois Apache par exemple
PidFile /usr/local/apache/logs/httpd.pid

(...)

# Limit on total number of servers running, i.e., limit on the number
# of clients who can simultaneously connect --- if this limit is ever
# reached, clients will be LOCKED OUT, so it should NOT BE SET TOO LOW.
# It is intended mainly as a brake to keep a runaway server from taking
# Unix with it as it spirals down...
# ici on fixe le nombre de clients max qui peuvent se connecter à un moment donné

MaxClients 150

(...) suit ensuite une liste de modules, ceux avec un # devant ne seront pas inclus

LoadModule vhost_alias_module libexec/mod_vhost_alias.so
LoadModule env_module         libexec/mod_env.so
LoadModule config_log_module  libexec/mod_log_config.so
LoadModule mime_magic_module  libexec/mod_mime_magic.so
LoadModule mime_module        libexec/mod_mime.so
LoadModule negotiation_module libexec/mod_negotiation.so
LoadModule status_module      libexec/mod_status.so
LoadModule info_module        libexec/mod_info.so

....

(...) Pour chaque module on doit maintenant la routine AddModule

ClearModuleList
AddModule mod_vhost_alias.c
AddModule mod_env.c
AddModule mod_log_config.c
AddModule mod_mime_magic.c
AddModule mod_mime.c
AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c

(...)

# Port: The port the standalone listens to. For ports < 1023, you will
# need httpd to be run as root initially.
# numéro de port pour le serveur, traditionnellement à 80

Port 80

(...)

# On lance initialement httpd en tant que root, puis immédiatement
# c'est l'utilisateur nobody (groupe nobody) qui en devient le proprio
# ainsi s'il y a une faille dans Apache, le hacker au lieu de devenir root
# devient nobody avec les droits qui vont avec
# pour vérifier que nobody est bien le proprio
# ps aux | grep httpd
User nobody
Group nogroup

# ServerAdmin: Your address, where problems with the server should be
# e-mailed.  This address appears on some server-generated pages, such
# as error documents.
# En cas de problème un email sera envoyé au webmaster, mettez donc
# ici l'adresse email du webmaster
ServerAdmin olivier@asterix.kervao.fr

# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
# C'est dans ce répertoire qu'on va trouver la page d'accueil d'Apache
DocumentRoot "/usr/local/apache/htdocs"

(...)

# UserDir: The name of the directory which is appended onto a user's home
# directory if a ~user request is received.
# Chaque utilisateur pourra mettre ses pages dans sa homedirectory
# dans un répertoire public_html, les pages seront accessibles à l'URL
# http://localhost/~user
<IfModule mod_userdir.c>
    UserDir public_html
</IfModule>

(...)

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
# L'emplacement du fichier de log peut ne pas vous convenir
# si vous voulez le placer dans /var/log/httpd il faut modifier ici
ErrorLog /usr/local/apache/logs/error_log

(...)

# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here.  Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
# De même pour l'emplacement du fichier de log des accès à apache
# c'est cette variable qu'il faut modifier
CustomLog /usr/local/apache/logs/access_log common

(...)

# DirectoryIndex: Name of the file or files to use as a pre-written HTML
# directory index.  Separate multiple entries with spaces.
# liste des fichiers d'entrée des pages
<IfModule mod_dir.c>
    DirectoryIndex index.html index.htm index.php index.php index.php4
</IfModule>

(...)

# priorité dans les langages à utiliser, mettez fr en premier
    <IfModule mod_negotiation.c>
        LanguagePriority fr en da nl et de el it ja pl pt pt-br ltz ca es sv
    </IfModule>

(...)

# Apache peut se comporter comme un proxy comme squid
# par défaut cette fonction n'est pas activée
# Proxy Server directives. Uncomment the following line to
# enable the proxy server:

# ProxyRequests On

# To enable the cache as well, edit and uncomment the following lines:

# CacheRoot /var/cache/httpd
# CacheSize 5
# CacheGcInterval 4
# CacheMaxExpire 24
# CacheLastModifiedFactor 0.1
# CacheDefaultExpire 1
# NoCache a_domain.com another_domain.edu joes.garage_sale.com
 

NOTE "Anciennement" on trouvait un fichier srm.conf etaccess.conf, ils peuvent maintenant complètement être intégrés dans httpd.conf

[retour haut de la page]

 Lancement automatique de l'application sous Mandrake

On prendra le fichier apachectl se trouvant sous /usr/local/apache/bin et on le placera sous /etc/rc.d/init.d, et on le renommera httpd

cp /usr/local/apache/bin/apachectl /etc/rc.d/init.d/httpd

On rajoutera en début de fichier juste après #!/bin/sh

#!/bin/sh

# Startup script for the Apache Web Server
#
# chkconfig: 345 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#              HTML files and CGI.
# processname: httpd

Pour un lancement automatique à l'état de marche 3,4 et 5 on doit normalement taper:

chkconfig --level 345 httpd on

Et pour un arrêt à l'état de marche 0, 1, 2 et 6

chkconfig --level 0126 httpd off

Pour lancer le serveur, il suffira maintenant de taper:

/etc/rc.d/init.d/httpd start
 

[retour haut de la page]

Lancement automatique sous ubuntu

Voilà un script de lancement, il faut l'appeler httpd et le placer sous /etc/init.d

#!/bin/bash
#
# apache    Start the apache HTTP server.
#
# The variables below are NOT to be changed.  They are there to make the
# script more readable.

NAME=apache
DAEMON=/usr/local/apache/bin/httpd
PIDFILE=/usr/local/apache/logs/httpd.pid
CONF=/usr/local/apache/conf/httpd.conf
APACHECTL=/usr/local/apache/bin/${NAME}ctl
# note: SSD is required only at startup of the daemon.
SSD=`which start-stop-daemon`
ENV="env -i LANG=C PATH=/bin:/usr/bin:/usr/local/bin"

trap "" 1

# Check that we're not being started by inetd
if egrep -q -i "^[[:space:]]*ServerType[[:space:]]+inet" $CONF
then
    exit 0
fi

test_config() {
    if [ ! -x $APACHECTL ]; then
    echo "$APACHECTL is not executable, exiting"
    exit 0
    fi

    # ensure we don't leak environment vars into apachectl
    APACHECTL="$ENV $APACHECTL"

    if ! $APACHECTL configtest 2> /dev/null
    then
        printf "Configuration syntax error detected. Not reloading.\n\n"
        $APACHECTL configtest
        exit 1
    fi
}

should_start() {
    if [ ! -x $DAEMON ]; then
    echo "apache is not executable, not starting"
    exit 0
    fi
}

case "$1" in
  start)
    should_start
    test_config
    echo -n "Starting web server: $NAME"
    $ENV $SSD --start --pidfile $PIDFILE --exec $DAEMON > /dev/null
    ;;

  stop)
    echo -n "Stopping web server: $NAME"
    start-stop-daemon --stop --pidfile $PIDFILE --oknodo
    rm -rf /var/lib/apache/mod-bandwidth/link/*
    ;;

  reload | force-reload)
    test_config
    echo -n "Reloading $NAME configuration"
    start-stop-daemon --stop --pidfile $PIDFILE --signal USR1
    ;;

  restart)
    test_config
    echo -n "Restarting $NAME"
    if ! start-stop-daemon -q --stop --pidfile $PIDFILE --signal HUP; then
    $ENV $SSD --start --pidfile $PIDFILE --exec $DAEMON > /dev/null
    fi
    ;;

  *)
    echo "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart}"
    exit 1
    ;;
esac

if [ $? -eq 0 ]; then
    echo .
    exit 0
else
    echo " failed"
    exit 1
fi

On donne les droits d'exécution

chmod 755 /etc/init.d/httpd

Pour le lancer automatique au démarrage il faudra taper

update-rc.d httpd defaults
[retour haut de la page]

Les pages webs utilisateurs

Le problème  avec le répertoire public_html des utilisateurs et qu'il faut mettre 755 au niveau de la home directory, ce qui est particulièrement génant au niveau sécurité. Vous pouvez spécifier que chaque utilisateur doit créer ses pages sous /home/http/login-utilisateur en écrivant pour la variable UserDir

UserDir /home/httpd

Ainsi pour l'utilisateur toto quand vous taperez comme URL http://serveur-apache/~toto,apache ira chercher le fichier index.htm sous /home/httpd/toto. On peut aller plus loin en spécifiant un répertoire particulier, /home/httpd/toto/html par exemple, en écrivant:

UserDir /home/httpd/*/html

[retour haut de la page]

 

Les alias

Si vous ne voulez pas mettre en place un serveur DNS, vous avez un moyen plus simple, les alias. Concrètement, votre serveur s'appelle obelix , vous voulez rendre accessible les fichiers html se trouvant sous /usr/doc/html , les utilisateurs devront taper dans leur navigateur préféré: http://obelix/doc. Pour cela dans votre fichier /etc/httpd/conf/httpd.conf, vous allez rajouter:

 Alias /icons/ "/usr/local/apache/icons/"
 Alias /doc "/usr/doc/html/"

NOTE Si vous mettre /doc/ à la place de /doc dans l'URL il faudra taper http://obelix/doc/, si vous omettez le dernier /, vous aurez une erreur.

[retour haut de la page]

Configuration avancée

Protection d'une page

La protection d'une page pour l'utilisateur olivier se fait de manière très simple,  tous les fichiers à accès limité doivent être concentré dans un même répertoire /home/olivier/public_html/reserve par exemple, il suffit de créer dans celui-ci un fichier qu'on devra nommer .htaccess contenant:

AuthUserFile auth/olivier.users
AuthGroupFile auth/olivier.group
AuthName "Acces Restreint"
AuthType Basic
require group autorise

Le fichier olivier.users va contenir une liste d'utilisateurs, il va se trouver sous le répertoire /usr/local/apache/auth(éventuellement à créer), pour info vous pouvez changer le chemin /usr/local/apacheen modifiant la valeur de la variable ServerRoot qu'on trouve dans le fichier httpd.conf. Le fichier olivier.group correspond à une liste des groupes de personnes, ces mêmes personnes ayant été défini dans le fichier olivier.users. Le principe consiste à créer un groupe de personnes autorisées et à leur attribuer un mot de passe à chacune, seul ce groupe pourra accéder à la section réservée.
Pour créer ces fichiers il suffit, en tant que root, d'une part de créer le répertoire /usr/local/apache/auth, puis de taper:

htpasswd -c /usr/local/apache/auth/olivier.users olivier

L'option -c correspond à la création du fichier olivier.users. On va alors avoir à rentrer un mot de passe pour l'utilisateur olivier.

New password:

On confirme

Re-type new password:
Adding password for user olivier

Pour créer un autre utilisateur veronique vous taperez la même commande sans l'option de création :

htpasswd  /etc/httpd/auth/olivier.users veronique

Toujours en tant que root, créer le fichier /usr/local/apache/auth/olivier.group qui contiendra pour autoriser par exemple olivier et veronique à accéder aux pages réservées :

autorise: olivier veronique

Il faut  décommenter maintenant les lignes suivantes dans le fichier httpd.conf

<Directory /home/*/public_html>
    AllowOverride FileInfo AuthConfig Limit
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    <Limit GET POST OPTIONS PROPFIND>
        Order allow,deny
        Allow from all
    </Limit>
    <LimitExcept GET POST OPTIONS PROPFIND>
        Order deny,allow
        Deny from all
    </LimitExcept>
</Directory>

Ces lignes autorisent l'emploi du fichier .htaccess dans les pages de vos utilisateurs (répertoire /home/*/public_html)

Maitenant quand à partir de votre navigateur préféré quand vous allez rentrer comme URL http://obelix/~olivier/reserve, vous aurez une fenêtre popup qui va s'ouvrir vous demandant de rentrer votre nom d'utilisateur et le mot de passe préalablement rentré.

Notez que pour que quelqu'un ne puisse jetter un coup d'oeil dans les fichiers .htaccess de vos utilisateurs, le fichier httpd.conf, contient la directive suivante:

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

[retour haut de la page]

Les hôtes virtuels

On peut mettre en place des hôtes virtuels, en d'autres termes un utilisateur pour un même serveur Apache croira en voir plusieurs. Exemple, soit votre serveur Apache obelix (adresse IP 192.168.13.11), votre domaine breizland.bz, on va créer les hôtes virtuels www.asterix.breizland.bz et www.idefix.breizland.bz qui vont pointer chacun vers un endroit différent du disque (respectivement /usr/local/asterix et /usr/local/idefix chacun contenant des pages html).
Dans le fichier httpd.conf le module est déjà chargé :

LoadModule vhost_alias_module libexec/mod_vhost_alias.so
AddModule mod_vhost_alias.c

On va rajouter tout à la fin du fichier:

NameVirtualHost 192.168.13.11

<VirtualHost 192.168.13.11>
ServerName obelix.breizland.bz
DocumentRoot /usr/local/apache/htdocs
ErrorLog logs/obelix-error_log
TransferLog logs/obelix-access_log
</VirtualHost>

<VirtualHost 192.168.13.11>
ServerName www.asterix.breizland.bz
DocumentRoot /usr/local/asterix
ErrorLog logs/asterix-error_log
TransferLog logs/asterix-access_log
</VirtualHost>

<VirtualHost 192.168.13.11>
ServerName www.idefix.breizland.bz
DocumentRoot /usr/local/idefix
ErrorLog logs/idefix-error_log
TransferLog logs/idefix-access_log
</VirtualHost>

Relancez Apache en tapant:

/etc/rc.d/init.d/httpd restart

Maintenant nous allons créer nos hôtes asterix et idefix, pour cela vous avez deux méthodes:
- rajouter www.asterix.breizland.bz et www.idefix.breizland.bz dans /etc/hosts sur la même ligne que votre serveur Apache (obelix dans notre exemple).

192.168.13.11 obelix obelix.breizland.bz  www.asterix.breizland.bz  www.idefix.breizland.bz

Normalement si vous faites un ping sur www.idefix.breizland.bz ça devrait marcher, pour les postes clients il faudra rajouter la même ligne dans le fichier hosts (non nécessaire).

- si vous disposez d'un serveur DNS sur votre machine, au niveau de votre config DNS dans votre fichier breizland.bz  qui se trouve sous /var/named vous devez rajouter tout à la fin:

www.asterix    A    192.168.13.11
www.idefix    A    192.168.13.11

Relancez le DNS en tapant:

/etc/rc.d/init.d/named restart

Pour tester tapez dans un shell:

ping www.asterix.breizland.bz

Maintenant dans le champ URL de votre navigateur préféré:

http://www.asterix.breizland.bz

Et là, normalement vous devriez voir s'afficher la page que vous avez placé sous /usr/local/asterix

[retour haut de la page]

Gestion de bases de données avec MySQL

Tests de fonctionnement avec MySQL

On suppose que vous avez installé, configuré MySQL et créé les deux exemples de la page MySQL. On suppose aussi que le serveur s'appelle obelix et l'utilisateur olivier.
Voici une page écrite en PHP qui va accéder à la base de donnée essai et à sa table coord.

<?
$serveur="localhost";
$login="olivier";
$pass="mot-de-passe";
$base="essai";
$table="coord";

$id=MYSQL_CONNECT($serveur,$login,$pass);
mysql_select_db($base);
$nom="hoarau";
$prenom="olivier";
$email="olivier.hoarau@fnac.net";
$query="INSERT INTO $table VALUES('$nom','$prenom','$email')";
$result=mysql_query($query,$id);
echo "Saisie terminée";
?>

Placer ce script dans ~/public_html et appeler le bd1.php

Dans votre navigateur préféré, dans le champ URL saisissez :

http://obelix/~olivier/bd1.php

A priori y a pas grand chose qui s'est passé, maintenant connecter vous à votre base essai dans un shell

[olivier@obelix olivier]$ mysql -u olivier -p essai
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10 to server version: 5.0.33

Type 'help' for help.

mysql> SELECT * FROM coord;
+-----+-------+--------------------+
| nom     | prenom  | email                              |
+-----+-------+--------------------+
| hoarau | olivier    | olivier.hoarau@fnac.net |
+-----+-------+--------------------+
1 row in set (0.00 sec)

C'est bon ça fonctionne. Passons à un exemple plus pointu, on va entrer les informations concernant vos visiteurs dans une base MySQL , créer la table telle que décrite dans l'exemple 2 de la page MySQL, créer maintenant le script PHP.

<?

$page=getenv("HTTP_REFERER");
$ip=getenv( "REMOTE_ADDR");
$host=gethostbyaddr($ip);
$d = date("d/m/Y H:i:s");
$expl=getenv("HTTP_USER_AGENT");

$serveur="localhost";
$login="olivier";
$pass="mot-de-passe";
$base="essai";
$table="ref";

$id=MYSQL_CONNECT($serveur,$login,$pass);
mysql_select_db($base);

$query="INSERT INTO $table VALUES('$d','$host','$ip','$expl','$page')";
$result=mysql_query($query,$id);

echo "$d $host($ip) $expl $page";

?>

Nommez ce script bd2.php et placez le dans ~/public_html . Dans votre navigateur préféré tapez dans le champ URL

http://obelix/~olivier/bd2.php

Vous devriez voir la date, le nom de votre machine avec son adresse IP et des infos sur votre OS et votre navigateur. A présent connectons nous à la base:

[olivier@obelix olivier]$ mysql -u olivier -p essai
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10 to server version: 5.0.33

Type 'help' for help.

mysql> SELECT * FROM ref;
+---------------+---------------+----------+-----------------+-----+
| date                         | host                       | ip                  | os                              | page   |
+---------------+---------------+----------+-----------------+-----+
| 24/04/2000 08:34:05 | asterix.armoric.bz | 192.168.13.11 | Mozilla/4.61 [en] (X  |            |
+---------------+---------------+----------+-----------------+-----+
1 row in set (0.00 sec)

C'est bon le visiteur a bien été pris en compte.

Maintenant que vous savez comment Apache fonctionne avec MySQL et PHP, laissez libre cours à votre imagination.

[retour haut de la page]

Administration des bases MySQL avec phpMyAdmin

phpMyAdmin est un ensemble de scripts PHP qui permet d'administrer des bases MySQL à partir d'un navigateur. Vous pouvez le récupérer à l'URL  www.phpmyadmin.net. En détail phpMyAdmin permet de:
- créer et supprimer des bases de données,
- éditer, ajouter ou supprimer des champs,
- taper des commandes SQL,
- gérer les clés de champs,
- ...

L'archive se présente sous la forme d'un tarball  qu'on décompresse en tapant :

tar xvfz phpMyAdmin-2.10.0.2-all-languages-utf-8-only.tar.gz

Cela va créer dans le répertoire de travail un répertoire phpMyAdmin-2.10.0.2-all-languages-utf-8-only. Dans ce répertoire vous avez un fichier config.inc.sample.php, il faut le renommer en fichier config.inc.php,  dans ce fichier il faut modifier les champs suivants :

Pour cette variable on peut mettre un peu n'importe quoi, ça sert ensuite pour chiffrer de manière aléatoire.

$cfg['blowfish_secret'] = 'je suis toto'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

pour ces deux variables on définit le compte de connexion à la base MySQL avec le mot de passe

$cfg['Servers'][$i]['controluser'] = 'olivier';
$cfg['Servers'][$i]['controlpass'] = 'mot-de-passe-en-clair';

pour le reste j'ai laissé les paramètres par défaut.

Maintenant on doit rendre accessible le répertoire phpMyAdmin d'une page web, pour cela deux solutions:
- (solution simple) placer phpMyAdmin dans /usr/local/apache/htdocs et au niveau de la page d'accueil d'apache faire un lien vers /usr/local/apache/htdocs/phpMyAdmin-2.10.0.2-all-languages-utf-8-only/index.php
- (solution préconisée), créer un hôte virtuel pointant vers ./phpMyAdmin-2.10.0.2-all-languages-utf-8-only qu'on appelera www.sql.breizland.bz .

NOTE Si ça vous gène que n'importe qui d'un navigateur puisse aller dans le répertore phpMyAdmin, mettez y des restrictions d'accès avec un fichier .htaccess.

Avec la solution hôte virtuel, à partir d'un navigateur quand on sélectionne  www.sql.breizland.bz on tombe d'abord sur une bannière de login, ensuite sur une fenêtre avec frame avec à gauche la liste des bases de données disponibles et à droite, le menu suivant:


Pour travailler sur une base de données particulières il suffit de la sélectionner dans le choix déroulant à gauche, on retrouve d'ailleurs notre base essai, pour en créer une autre il suffit de choisir Bases de données puis Créer une base de données.

Si on sélectionne essai par exemple on obtient


Vous pouvez donc créer des nouvelles tables, faire des requêtes SQL, etc.

[retour haut de la page]

Scripts CGI

Pour activer les scripts CGI, le fichier httpd.conf est déjà configuré pour, on y trouve notamment la ligne qui indique où trouver les scripts:

ScriptAlias /cgi-bin/    /usr/local/apache/cgi-bin/

Le but de l'exercice est de créer un script perl CGI qui va traiter un formulaire quelconque d'une page HTML. Vous allez créer votre script perl sous /usr/local/apache/cgi-bin, et le nommer form.pl, voici son contenu:

#!/usr/bin/perl
use CGI;
$html=new CGI;
print $html->header;

print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>Premier script CGI perl</TITLE>\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<H1>Traitement du formulaire</H1>\n";

print "Nom :";
print $html->param('nom');
print "<p>\n";
print "Email :";
print $html->param('email');
print "<p>\n";
print "Commentaire:";
print $html->param('comment');

print "</BODY>\n";
print "</HTML>\n";

Donner les droits qui vont bien avec ce fichier:

chmod 755 form.pl

En tant qu'utilisateur standard (olivier  dans notre exmple), créer maintenant le fichier HTML suivant que vous appelerez formulaire.htm

<html>
<body>
<h2>Formulaire</h2>
<form action="http://obelix/cgi-bin/form.pl" METHOD=GET>
Nom: <input type="text" name=nom size=20><br>
Email: <input type="text" name=email size=30><br>
Commentaire: <input type="text" name=comment size=100><br>
<input type=submit value="Envoyer"> <input type=reset value="remettre à zéro">
</form>
</body>
</html>

Voilà maintenant quand vous allez accéder à http://obelix/~olivier/formulaire.htm , vous allez avoir une page du style:

Nom: 
Email: 
Commentaire: 

En appuyant sur Envoyer ça va déclencher l'exécution du script CGI perl, qui va provoquer l'affichage des valeurs précédemment saisies.

[retour haut de la page]

PHP  et LDAP

On peut compiler PHP pour pouvoir utiliser des commandes gérant une base LDAP, pour cela à la compil de php on rajoutera aux options de configure l'option :

--with-ldap=/var/lib/ldap

/var/lib/ldap devant être remplacé par le chemin où se trouve votre base LDAP. Recompilez puis réinstallez le module qui va bien :

make

Et en tant que root

make install

Relancez Apache

/etc/rc.d/init.d/httpd restart

Voilà un petit programme qui va nous permettre de rajouter une entrée dans la base, libre à vous maintenant de créer des formulaires de saisie, de destruction, et de recherche:

<?
// nom du serveur LDAP
 $server="asterix";

// identification de l'administrateur de la base
 $rootdn="cn=Manager, dc=breizland, dc=bz";

//mot de passe administrateur
 $rootpw="secret";

//connexion à la base
 $result=ldap_connect($server);
 if ($result==1)
{
         ldap_bind($result,$rootdn,$rootpw);
}

//Enregistrement d'une entrée dans la base
echo"Enregistrement de Benjamin Hoarau\n";

$dn="dc=breizland, dc=bz";
$nom="Hoarau";
$prenom="Benjamin";
$mail="benjamin.hoarau@funix.org";

$info["cn"]=$nom." ".$prenom;
$info["mail"]=$mail;
$info["objectclass"]="person";

ldap_add($result,"cn=$nom $prenom,$dn",$info);
ldap_close($result);

echo "L'enregistement a réussi";
?>

Appelez ce fichier ldap.php, vous pouvez le tester et vérifier que l'entrée a bien été saisie dans la base.

[retour haut de la page]

Sécuriser Apache+PHP

La compilation de PHP est identique à celle vue précédemment, c'est au niveau du fichier de configuration qu'on modifiera certains points. Pour Apache, on désactivera par défaut tous les modules (statiques ou dynamiques), on installera le strict minimum, à vous de rajouter ensuite les modules qui sont nécessaires à votre site (ou d'adapter votre site).
Cette sécurisation est relativement basique à moins d'un trou de sécurité dans Apache ou PHP elle devrait vous mettre à l'abri de 99,99% des attaques. Pensez donc à visiter régulièrement les sites d'Apache ou de PHP pour vous tenir au courant des dernières informations en terme de sécurité, évitez aussi d'installer les dernières versions de ces logiciels, attendez qu'elles aient fait leur preuve.

On installera les modules suivants:

mod_access qui permet un contrôle d'accès (hôte, adresse IP et autres caractéristiques), il est nécessaire si on veut utiliser les options order, deny et allow entre autres.
mod_auth qui permet l'authentification des utilisateur basés sur le fichier .htaccess
mod_dir qui permet de définir l'index (index.php, index.html, ...) d'un site
mod_log_config pour activer les logs
mod_mime qui permet de déterminer le type du fichier à partir de son extension
mod_vhost_alias pour pouvoir bénéfier des hôtes virtuels
mod_so pour pouvoir charger une biblio dynamique comme PHP

La compilation d'Apache commence d'abord en tapant:

make clean

Puis

./configure --prefix=/usr/local/apache --disable-module=all --enable-module=access --enable-module=log_config --enable-module=dir --enable-module=mime  --enable-module=auth --enable-module=vhost_alias --enable-module=so

Puis make  et en tant que root make install

Voilà le fichier de configuration /usr/local/apache/conf/httpd.conf réduit à sa plus simple expression

##
## httpd.conf -- Apache HTTP server configuration file
##

# parametres globaux

ServerType standalone
ServerRoot "/usr/local/apache"
PidFile /usr/local/apache/logs/httpd.pid
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard

# parametres de performances

Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
MinSpareServers 5
MaxSpareServers 10
StartServers 5
MaxClients 150
MaxRequestsPerChild 0

# chargement des modules
LoadModule php5_module        libexec/libphp5.so

ClearModuleList
AddModule mod_so.c
AddModule mod_log_config.c
AddModule mod_mime.c
AddModule mod_dir.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_vhost_alias.c
AddModule mod_php5.c

# configuration generale

Port 80
User nobody
Group nogroup
ServerAdmin olivier@tosh.kervao.fr
DocumentRoot "/usr/local/apache/htdocs"
<IfModule mod_dir.c>
    DirectoryIndex index.php index.php
</IfModule>
UseCanonicalName Off
HostnameLookups Off
ServerSignature Off
ServerTokens Prod

# controle d'acces
# par défaut on interdit tout

<Directory />
    Options None
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

# définition des droits d'acces pour les répertoires
# des hotes virtuels

<Directory "/www/homepage/online">
    php_value open_basedir /www/homepage/online
    Order allow,deny
    Allow from all
</Directory>

<Directory "/www/homepage/ohoarau">
    php_value open_basedir /www/homepage/ohoarau
    Order allow,deny
    Allow from all
</Directory>

# pour ne pas pouvoir voir les .htaccess
AccessFileName .htaccess

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

# definition des types MIME

<IfModule mod_mime.c>
    TypesConfig /usr/local/apache/conf/mime.types
</IfModule>
DefaultType text/plain
<IfModule mod_mime.c>
    AddType application/x-tar .tgz
    AddType application/x-httpd-php .php .php .php4 .phtml
    AddType application/x-httpd-php-source .phps
    AddEncoding x-compress .Z
    AddEncoding x-gzip .gz .tgz
</IfModule>

# configuration des logs

ErrorLog /usr/local/apache/logs/error_log
LogLevel warn

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

CustomLog /usr/local/apache/logs/access_log combined

# définition des hôtes virtuels qui seront accessibles sur internet
# les noms de domaine auront été obtenus par des services comme DynDNS

# ici vous devez mettre votre adresse IP sur le net
NameVirtualHost 80.52.250.167

<VirtualHost funix.homelinux.org>
ServerName funix.homelinux.org
DocumentRoot /www/homepage/online
ErrorLog logs/online-error_log
TransferLog logs/online-access_log
CustomLog logs/online-access_log combined
</VirtualHost>

<VirtualHost ohoarau.homelinux.org>
ServerName ohoarau.homelinux.org
DocumentRoot /www/homepage/ohoarau
ErrorLog logs/ohoarau-errror_log
TransferLog logs/ohoarau-access_log
CustomLog logs/ohoarau-access_log combined
</VirtualHost>

Maintenant on va modifier certains points dans la configuration de PHP, cela se passe dans le fichier /usr/local/apache/conf/php.ini. On va modifier les paramètres suivants:

safe_mode=On Les scripts PHP ne pourront modifier d'autres fichiers que si le propriétaire du dit script et aussi propriétaire des autres fichiers. En conséquence le script PHP d'un utilisateur ne pourra pas modifier les fichiers d'un autre utilisateur.
safe_mode_gid = Off Avec safe_mode à On en mettant cette variable à Off, il faut non seulement que le propriétaire du script PHP soit aussi le propriétaire du fichier à modifier mais que le groupe (GID) soit le même également.
open_basedir= Cette variable a été définie plus haut dans le fichier httpd.conf, PHP ne pourra accéder qu'aux fichiers se trouvant dans les répertoires (et sous répertoires) mentionnés.
expose_php=Off
PHP ne délivrera pas d'information en réponse aux requêtes faites par des clients.
display_errors = Off PHP ne délivrera à l'affichage (dans le navigateur) aucune erreur et warning.
log_errors = On Les erreurs et warnings seront inscrits dans un fichier de log
error_log = /usr/local/apache/logs/php.log Définition du fichier de log
file_uploads = Off Désactivation de l'upload
register_globals=Off En mettant à On les variables d'environnement, GET, POST, etc. deviennent automatiquement des variables globales, ce qui est potentiellement dangereux, en conséquence il est fortement conseillé de désactiver ce paramètre

Pour faire propre il faudrait maintenant chrooter l'environnement de votre serveur Apache, supprimer les compilateurs sur votre serveur, ...

 
[Retour page d'accueil FUNIX] [retour haut de la page ]