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.
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
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:
- test1: http://www.test1.fr
- test2: http://www.test2.fr
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é.
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>