HTTPD: le serveur web de la fondation Apache

La fondation Apache distribue un des meilleurs serveur web: httpd

Il existe aussi bien en version windows qu’unix.

La version unix est toujours en avance mais le serveur windows reste très performant.

Ce document a pour but de présenter l’installation, le paramétrage et l’utilisation du serveur httpd sous windows

Installation

Il suffit d’aller télécharger sur http://apache.crihan.fr/dist//httpd/binaries/win32/ pour télécharger la dernière version du serveur.

lors de l’installation je déconseille l’installation de la documentation et de l’outil de gestion du service apache.

_images/20130513_01.png

Si tout ce passe bien à la fin de l’installation vosupouvez arrêter et redémarrer le service Apache2.2

C:\Program Files>net stop Apache2.2
Le service Apache2.2 s’arrête.
Le service Apache2.2 a été arrêté.


C:\Program Files>net start Apache2.2
Le service Apache2.2 démarre.
Le service Apache2.2 a démarré.

et sur votre navigateur, avec l’url http://127.0.0.1 on peut voir

_images/20130508_1.png

Configuration

Le principe de base de la configuration d’un serveur apache est la modification du fichier httpd.conf.

Nous trouvons ce fichier dans C:/Program Files/Apache Software Foundation/Apache2.2/conf

Afin de faciliter la maintenance du serveur nous allons modifier au minimum httpd.conf mais de créer un fichier de configuration par site.

Pour cela créer un dossier sites-available dans C:/Program Files/Apache Software Foundation/Apache2.2/conf

C:
 |_ Program Files
    |_ Apache Software Foundation
        |_ Apache2.2
           |_ conf
              |_ httpd.conf
              |_ sites-available

Notre objectif est de créer sur poste de travail 2 sites web pouvant être atteint par:

Chaque site aura la même source pour le répertoire image: http://www.test1.fr/img sera le même que http://www.test2.fr/img

On personnalisera les ereurs 404

ON géra des logs différenciers pour ces deux sites.

Note

la notion d’alias peut être utile si on ne veut pas tout les fichiers du site au même endroit

Donc nous allons créer 2 sites sur:

  • la même adresse IP (127.0.0.1)
  • le même port (80)

Gestion d’un dns local

Nous allons modifier windows afin que la résolution de test1.fr et test2.fr pointe sur l’ip 127.0.0.1

pour cela il faut modifier le fichier C:/Windows/System32/drivers/etc/hosts

et y ajouter

127.0.0.1 test1.fr
127.0.0.1 www.test1.fr
127.0.0.1 test2.fr
127.0.0.1 www.test2.fr

maintenant nous avons ce résultat concernant les ping

C:\Program Files>ping test1.fr

Envoi d'une requête 'ping' sur test1.fr [127.0.0.1] avec 32 octets de données :
Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128
Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128
Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128

Gestion des sites web

Il faut créer la structure suivante

C:
 |_ www
    |_ test1
    |   |_ index.html
    |   |_ missing.html
    |   |_ logs
    |      |_ access.log
    |      |_ error.log
    |_ test2
    |   |_ index.html
    |   |_ missing.html
    |   |_ logs
    |      |_ access.log
    |      |_ error.log
    |_ common
        |_ img
        |_ httpd.png

contenu de index.html du site 1

<html>
            <h1>TEST 1 !!!!!!</h1>
    </html>

contenu de index.html du site 2

<html>
            <h1>TEST 2 !!!!!!</h1>
    </html>

contenu de missing.html

<html>
            <h1>OUPS !!!!!!</h1>
    </html>

Configuration de httpd

Nous allons créer la structure suivante

C:
 |_ Program Files
    |_ Apache Software Foundation
        |_ Apache2.2
           |_ conf
              |_ httpd.conf
              |_ sites-available
                 |_ test1.conf
                 |_ test2.conf

le fichier httpd.conf contient déjà “Listen 80” qui indique que apache écoute le port 80 pour toutes les adresses ip du serveur.

Nous allons rajouter à la fin du fichier https.conf

#Listen 80
NameVirtualHost *:80
Include conf/sites-available/*.conf

cela permet d’indiquer que chaque VirtualHost utilise toutes les adresses IP en écoute sur le port 80

De plus on inclu tout les fichier .conf du dossier sites-available

Note

par la suite pour supprimer un site du serveur apache il suffira de renommer son fichier conf: site.conf en site.old

contenu du fichier test1.conf

# conf/site-available/test1.conf
<VirtualHost *:80>
        ServerName test1.fr
        ServerAlias *.test1.fr

    DocumentRoot "C:/www/test1"
    <Directory "C:/www/test1">
            AllowOverride None
            Options None
            Order allow,deny
            Allow from all
        </Directory>

        Alias /img "C:/www/common/img"
    <Directory "C:/www/common/img">
                Order allow,deny
                Allow from all
        </Directory>

        <IfModule dir_module>
        DirectoryIndex index.html
        </IfModule>
        ErrorDocument 404 /missing.html

        ErrorLog "C:/www/test1/logs/error.log"
        LogLevel info

        <IfModule log_config_module>
            LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
            LogFormat "%h %l %u %t \"%r\" %>s %b" common
            #CustomLog "C:/www/test1/logs/access.log" common
            CustomLog "|bin/rotatelogs.exe C:/www/test1/logs/access-%Y_%m_%d_%H_%M.log 86400" common
            #CustomLog "|bin/rotatelogs.exe C:/www/test1/logs/access-%Y_%m_%d.log 5M" common
        </IfModule>
</VirtualHost>

contenu du fichier test2.conf

# conf/site-available/test2.conf
<VirtualHost *:80>
        ServerName test2.fr
        ServerAlias *.test2.fr

    DocumentRoot "C:/www/test2"
    <Directory "C:/www/test2">
            AllowOverride None
            Options None
            Order allow,deny
            Allow from all
        </Directory>

        Alias /img "C:/www/common/img"
    <Directory "C:/www/common/img">
                Order allow,deny
                Allow from all
        </Directory>

        <IfModule dir_module>
        DirectoryIndex index.html
        </IfModule>
        ErrorDocument 404 /missing.html

        ErrorLog "C:/www/test2/logs/error.log"
        LogLevel info

        <IfModule log_config_module>
            LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
            LogFormat "%h %l %u %t \"%r\" %>s %b" common
            #CustomLog "C:/www/test2/logs/access.log" common
            CustomLog "|bin/rotatelogs.exe C:/www/test2/logs/access-%Y_%m_%d_%H_%M.log 86400" common
            #CustomLog "|bin/rotatelogs.exe C:/www/test2/logs/access-%Y_%m_%d.log 5M" common
        </IfModule>

</VirtualHost>

quelques explications:

  • ServerName et ServerAlias indique pour quelle url le VirtualHost utilise
  • DocumentRoot indique ou on trouve les fichiers du site
  • Directory indique surtout des notions de droit
  • Alias img indique ou on trouve les fichiers pour les url /img
  • DirectoryIndex indique les fichiers à charger si on indique pas de fichier
  • ErrorDocument 404 indique le fichier à charger en cas d’erreur 404
  • ErrorLog et LogLevel indique l’emplacemnt et le niveau du fichier d’erreur
  • LogFormat et CustomLog permet de mettre en place le fichier log concernant les accès

Note

dans notre exemple comme le fichier access.log grossit très vite nous avons paramétrer une rotation journalière (86400 secondes) on pourrait gérer une rotation basé sur la taille du fichier (5M) on sans rotation

Note

Il est possible de gérer l’autorisation d’accès via pache (même si cela est souvent réalisé de façon fonctionnelle) On peut par exempel autoriser toutes les adresses IP du réseau 192.168.0 sauf la 192.168.0.42 en paramétrant ainsi

Order allow,deny
Allow from 192.168.0
Deny from 192.168.0.42

Résultat

C:\Program Files>net stop Apache2.2
Le service Apache2.2 s’arrête.
Le service Apache2.2 a été arrêté.


C:\Program Files>net start Apache2.2
Le service Apache2.2 démarre.
Le service Apache2.2 a démarré.
_images/20130508_2.png
_images/20130508_3.png
_images/20130508_4.png
_images/20130508_5.png
_images/20130508_6.png

Autres configurations

Il est possible d’imaginer d’autres configurations. En effet httpd peut:

  • travailler sur plusieurs IP
  • écouter plusieurs port par IP
  • et pour chaque couple ip/port router sur plusieurs sites

Fonctionnement de plusieurs serveurs virtuels par nom sur une seule adresse IP

# Apache doit écouter sur le port 80
Listen 80

# Toutes les adresses IP doivent répondre aux requêtes sur les
# serveurs virtuels
NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot /www/example.com
ServerName www.example1.com

# Autres directives ici

</VirtualHost>

<VirtualHost *:80>
DocumentRoot /www/example.org
ServerName www.example2.org

# Autres directives ici

</VirtualHost>

Servir le même contenu sur des adresses IP différentes (telle qu’une adresse interne et une externe).

NameVirtualHost 192.168.1.1
NameVirtualHost 172.20.30.40

<VirtualHost 192.168.1.1 172.20.30.40>
DocumentRoot /www/server1
ServerName server.example.com
ServerAlias server
</VirtualHost>

Servir différents sites sur différents ports.

Listen 80
Listen 8080

NameVirtualHost 172.20.30.40:80
NameVirtualHost 172.20.30.40:8080

<VirtualHost 172.20.30.40:80>
ServerName www.example.com
DocumentRoot /www/domain-80
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
ServerName www.example.com
DocumentRoot /www/domain-8080
</VirtualHost>

<VirtualHost 172.20.30.40:80>
ServerName www.example.org
DocumentRoot /www/otherdomain-80
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
ServerName www.example.org
DocumentRoot /www/otherdomain-8080
</VirtualHost>

ébergements virtuels mixtes basés sur les ports et sur les IP

Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080

<VirtualHost 172.20.30.40:80>
DocumentRoot /www/example.com-80
ServerName www.example.com
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
DocumentRoot /www/example.com-8080
ServerName www.example.com
</VirtualHost>

<VirtualHost 172.20.30.50:80>
DocumentRoot /www/example.org-80
ServerName www.example.org
</VirtualHost>

<VirtualHost 172.20.30.50:8080>
DocumentRoot /www/example.org-8080
ServerName www.example.org
</VirtualHost>

Utilisation avancée

le serveur httpd possède plusieurs module permettant:

  • de gérer des proxy
  • de gérer de l’authentification
  • de gérer des outils de programmation

L’utilisation d’outils annexe permettant de rendre le web dynamique est facilité par l’utilisation de trois méthodes:

  • cgi

cette méthode permet de lancer un programme externe à chaque demande http. Cela est souvent peut rapide car chaque demande la mise en mémoire de l’ensemble du programme , de l’importation de tout les modules nécessaires

  • module intégré

cette méthode impose d’avoir un interpréteur embarqué dans le serveur httpd. L’interpréteur n’est lancé qu’une fois ce qui rend cete méthode rapide

  • serveurs tiers

les requêtes http sont transmise à un serveur tiers qui fournit alors la réponse adéquate. Cela nécessite un serveur tiers et donc des ressources supplémentaire mais cetet méthode est la plus rapide et la plus fiable.

Modification du Charset

Dans le fichier /etc/apache2/conf.d/charset ou default vous trouvez:

AddDefaultCharset UTF-8

il faut obtenir:

AddDefaultCharset ISO-8859-1

Sécurisation des accès

Configuration d’Apache pour .htaccess Le fichier de configuration pour Apache : default, se trouve dans /etc/apache2/sites-available/default . D’origne, il contient les éléments suivants

<Directory /var/www/>
Options Indexes Includes FollowSymlinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

Il faut ajouter une instruction (AllowOverride AuthConfig) pour indiquer que nous voulons protéger les dossiers suivants

<Directory /var/www/>
Options Indexes Includes FollowSymlinks MultiViews
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>

AllowOverride AuthConfig demande à Apache de prendre en compte le fichier .htacess dans le répertoire /var/www/ et tous ses sous-répertoires.

Le fichier .htaccess

Avec votre éditeur préféré (vim), vous éditez un fichier .htaccess dans le répertoire que vous souhaitez protéger. Et voici ce qe vous devez y mettre

AuthUserFile /var/www/pass/.htpasswd
AuthName "Accès protégé"
AuthType Basic
<Limit GET POST>
Require valid-user
</Limit>

On indique que le fichier .htpasswd (qui contient les logins et les mots de pass) se trouve dans /var/www/pass/. Il est préférable de mettre de fichier hors du site lui même. Sinon on ajoute un fichier .htaccess dans le répertoire où se trouve .htpasswd pour en empêcher l’accés. Dans ce cas là, le fichier .htaccess contient : deny from all

Création du fichier .htpasswd

Vous devez bien sûr mettre le fichier .htpasswd dans le répertoire que vous avez indiqué dans .htaccess. Il se compose toujours comme suit

login:passwd

Ces mots de passe doivent être cryptés. Vous obtenez le mot de passe crypté au moyen de la commande htpasswd. Par exemple je souhaite que l’utilisateur toto accede à ma page web avec le mot de passe ‘supertoto’, je tape la commande

[[root@glop root]]# htpasswd -c /var/www/pass/.htpasswd toto
New password:
Re-type new password:
Adding password for user toto

L’option -c de htpasswd permet de créer le fichier .htpasswd avec le premier couple login:passwd. Si vous souhaité ajouter un deuxième utilisateur, il faut enlever l’option -c

[[root@glop root]]# htpasswd /var/www/pass/.htpasswd tutu
New password:
Re-type new password:
Adding password for user tutu

remarque il est possible d’écrire le fichier .htpasswd sans être crypté.:

JFPillou:Toto504
Damien:Robert(32)
Comma:Joe[[leTaxi]]

Utilisation de httpd comme proxy web

Pour différente raison il est parfois utile de mettre en place un proxy web. L’objectif est de rendre transparent pour l’utilisateur le routage de ces requêtes web vers un autre serveur web que celui visé.

Par exemple vous avez un serveur web A qui est accessible depuis l’extérieur. Vous avez aussi un serveur B sur lequel vous avez un service (par exemple FileZ) et qui n’est pas accessible depuis l’extérieur.

Vous avez deux solutions:

  • faire que le serveur B possède une adresse public
  • faire en sorte que les requêtes serveurAfilez soit routé sur le serveur B cela s’appelle un proxy

Pour cela sur le serveur A il faut activer le module proxy

a2enmod proxy proxy_http
/etc/init.d/apache2 restart

Puis sur le serveur A rajouter un virtual host permettant la redirection

<VirtualHost *:80>
    ServerAdmin postmaster@domaine.tld
    ServerName serveurA
    ProxyPass /filez http://localhost:8000/
    ProxyPassReverse /filez http://localhost:8000/
    ProxyPreserveHost On
</VirtualHost>