ATTENTION CE CHAPITRE N'A PAS FAIT L'OBJET D'UNE REVISION DEPUIS DE
NOMBREUSES ANNÉES. LES INFORMATIONS CONTENUES Y SONT JUSTES MAIS PASSABLEMENT
OBSOLÈTES !
Ce document est une présentation succincte du protocole HTTP 1.0 et
du serveur Apache qui l'utilise.
1 Le protocole HTTP
Le protocole HTTPXVI1 est le protocole d'application utilisé pour véhiculer, entres autres, de l'HTMLXVI2sur l'Internet.
C'est le protocole le plus utilisé en volume depuis 1995, devant FTP, NNTP et SMTP ; il accompagne l'explosion de l'utilisation du système global d'information ``World-Wide Web''.
Depuis 1990, date d'apparition du ``Web'', le protocole HTTP évolue doucement mais surement. Il est longtemps resté sous forme de ``draft''. La première version déployée largement a été la 1.0, définie dans la RFC 1945 de mai 1996. Depuis le début du mois de janvier 1997 est apparue la version 1.1, deux fois plus volumineuse pour tenir compte des nouvelles orientations de l'usage du service.
Aujourd'hui ce protocole est tellement répandu que pour bon nombre de nouveaux utilisateurs du réseau, l'Internet c'est le ``web'' !
Techniquement, l'usage de ce protocole se conçoit comme une relation entre un client et un serveur. Le client, appelé génériquement un ``browser'', un ``User Agent'', ou encore butineur de toile, interroge un serveur connu par son ``urlXVI3'' dont la syntaxe est bien décrite dans la RFC 1738.
Par exemple la chaîne de caractères http://www.sio.ecp.fr/ est une url ; il suffit de la transmettre en tant qu'argument à un quelconque outil d'exploration et celui-ci vous renverra (si tout se passe comme prévu !) ce qui est prévu sur le serveur en question pour répondre à cette demande (car il s'agit bien d'une requête comme nous le verrons plus loin dans ce chapitre).
Le serveur, supposé à l'écoute du réseau au moment où la partie cliente l'interroge, utilise un port connu à l'avance. Le port 80 est dédié officiellement au protocole httpXVI4, mais ce n'est pas une obligation (cette décision est prise à la configuration du serveur). L'url qui désigne un serveur peut contenir dans sa syntaxe le numéro de port sur lequel il faut l'interroger, comme dans :
1.1 Exemple d'échange avec http
Le transport des octets est assuré par TCPXVI5 et le protocole est ``human readable'', ce qui nous autorise des essais de connexion avec le client tcp à tout faire : telnet ! Bien entendu on pourrait utiliser un ``browser'' plus classique, mais celui-ci gérant pour nous le détail des échanges il ne serait plus possible de les examiner.
$ telnet localhost 80
Trying...
Connected to localhost.
Escape character is '^]'.
Ce qui est tapé par l'utilisateur et la réponse du serveur.
GET / HTTP/1.0
La requête, suivie d'une ligne vide.
HTTP/1.1 200 OK
Date: Fri, 01 Mar 2002 10:59:06 GMT
Server: Apache/1.3.23 (Unix)
Last-Modified: Sat, 10 Nov 2001 16:13:02 GMT
ETag: "1381-8b-3bed520e"
Accept-Ranges: bytes
Content-Length: 79
Connection: close
Content-Type: text/html
<HTML>
<HEAD>
<TITLE>Ceci est un titre</TITLE>
</HEAD>
<BODY>
</BODY>
</HTML>
Connection closed by foreign host.
Enfin la réponse du serveur, que l'on peut décomposer
en trois parties :
mm
Notons également la deconnexion à l'initiative du serveur,
en fin d'envoi de la page HTML.
L'exemple qui précède est typique d'un échange entre le client et le serveur : une question du client génère une réponse du serveur, le tout lors d'une connexion TCP qui se termine lors de l'envoi du dernier octet de la réponse (clôture à l'initiative du serveur).
Le serveur ne conserve pas la mémoire des échanges passés, on dit aussi qu'il est sans état, ou ``stateless''.
La question et la réponse sont bâties sur un modèle voisin : le message HTTP.
cm
figure XVI.01
Les parties A, B et C forment l'en-tête du message, et D le corps.
Par exemple http://www.site.org/.
Un en-tête de ce type est constitué d'une suite d'une ou
plusieurs lignes (la fin d'une ligne est le marqueur CRLF)
construite sur le modèle :
Nom_de_champ : Valeur_du_champ CRLF
Éventuellement le marqueur de fin de ligne peut être omis
pour le séparateur ``;''.
Exemple d'en-tête MIME :
C'est dans cette partie du message que l'on trouve par
exemple les octets de l'HTML, ou encore ceux d'une image...
Le type des octets est intimement lié à celui annoncé
dans l'en-tête, plus précisement dans le champ Content-Type.
Par exemple :
Content-Type: text/html
Content-Type: image/jpg
1xx
N'est pas utilisé ``Futur Use''
2xx
Succès, l'action demandée a été comprise
et exécutée correctement.
3xx
Redirection. La partie cliente doit
reprendre l'interrogation, avec une
autre formulation.
4xx
Erreur coté client. La question comporte
une erreur de syntaxe ou ne peut
être acceptée.
5xx
Erreur coté serveur. Il peut s'agir
d'une erreur interne, due à l'OS ou
à la ressource devenue non accessible.
Date: Fri, 01 Mar 2002 10:59:06 GMT
Server: Apache/1.3.23 (Unix)
Last-Modified: Sat, 10 Nov 2001 16:13:02 GMT
ETag: "1381-8b-3bed520e"
Accept-Ranges: bytes
Content-Length: 79
Connection: close
Content-Type: text/html
-rw-r--r-- 1 web doc 139 Nov 10 17:13 index.html
Le corps
du message contient des octets à interpréter comme ceux
d'une page écrite en HTML.
Le corps
du message contient des octets à interpréter comme ceux
d'une image au format jpeg
Le succès du ``web'' s'appuie largement sur un système de nommage des objets accessibles, qui en uniformise l'accès, qu'ils appartiennent à la machine sur laquelle on travaille ou distants sur une machine en un point quelconque du réseau (mais supposé accessible). Ce système de nommage universel est l'url (``Uniform Resource Locator'' -- RFC 1738) dérivé d'un système de nommage plus général nommé uri (``Universal Resource Identifier'' -- RFC 1630).
La syntaxe générale d'un(e) url est de la forme :
Succintement la ``scheme'' est une méthode que l'on sépare à l'aide du caractère ``:'' d'une chaîne de caractères ascii 7 bits dont la structure est essentiellement fonction de la ``scheme'' qui précède et que l'on peut imaginer comme un argument.
Une ``scheme'' est une séquence de caractères 7bits. Les lettres ``a'' à ``z'', les chiffres de ``0'' à ``9'', le signe ``+'', le ``.'' et le ``-'' sont admis. Majuscules et minuscules sont indifférenciés.
Exemples de ``schemes'' : http, ftp, file, mailto, ...Il en existe d'autres (cf la RFC) non indispensables pour la compréhension de cet exposé.
Globalement une url doit être encodée en ascii 7 bitsXVI8 sans caractère de contrôle (c'est à dire entre les caractères 20 et 7F), ce qui a comme conséquence que tous les autres caractères doivent être encodés.
La méthode d'encodage transforme tout caractère non utilisable directement en un triplet formé du caractère ``%'' et de deux caractères qui en représente la valeur hexadécimale. Par exemple l'espace (20 hex) doit être codé %20.
Un certain nombre de caractères, bien que théoriquement représentables, sont considérés comme non sûrs (``unsafe'') et devraient être également encodés de la même manière que ci-dessus, ce sont :
% < > " # { } | \ ^ ~ [ ] `
Pour un certain nombre de ``schemes'' (http...) certains caractères sont réservés car ils ont une signification particulière. Ce sont :
; / ? : @ = &
Ainsi, s'ils apparaissent dans l'url sans faire partie de sa syntaxe,
ils doivent être encodés.
Une url avec la ``scheme'' http bien formée doit être de la forme :
``path'' et ``searchpath'' sont optionnels.
À l'intérieur de ces deux composantes, les caractères / ; ? sont réservés, ce qui signifie que s'ils doivent être employés, ils doivent être encodés pour éviter les ambiguïtés.
Le ? marque la limite entre l'objet interrogeable et la ``query string''. À l'intérieur de cette chaîne d'interrogation le caractère + est admis comme raccourci pour l'espace (ascii 20 hex). Il doit donc être encodé s'il doit être utilisé en tant que tel.
De même, à l'intérieur de la ``query string'' le caractère = marque la séparation entre variable et valeur, le & marque la séparation entre les couples variable = valeur.
Exemple récapitulatif :
Notez le ``é'' codé %E9, c'est à dire le caractère de rang 14 x 16 + 9 = 233. On peut également observer quatre variables q, hl, start et sa dont la signification peut être partiellement devinée, mais dont le remplissage reste à la charge du serveur en question.
Le rôle de la chaîne ``search'' est celui de ce que l'on appelle
une CGI ou ``Common Gateway Interface'', c'est à dire un programme qui
effectue le lien entre le serveur interrogé et des programmes
d'application, ici une recherche dans une base de données. Nous
examinons succinctement le principe de fonctionnement de tels programmes
page
.
3 Architecture interne du serveur Apache
Cette partie se consacre à l'étude du fonctionnement du serveur ApacheXVI9.
Pour comprendre les mécanismes internes d'un tel serveur il est absolument nécessaire de pouvoir en lire le code source, cette contrainte exclu les produits commerciaux.
Au mois de mars 2002, d'après le ``Netcraft Web Server SurveyXVI10'' le serveur le plus utilisé (55%) est très majoritairement celui du projet Apache.
D'après ses auteurs, le serveur Apache est une solution de continuité au serveur du NCSAXVI11. Il corrige des bugs et ajoute de nombreuses fonctionnalités, particulèrement un mécanisme d'API pour permettre aux administrateurs de sites de développer de nouveaux modules adaptés à leurs besoins propres.
Plus généralement, tout ce qui n'est pas strictement dans les attributions du serveur (gestion des processus, gestion mémoire, gestion du réseau) est traité comme un module d'extension. Le fichier apache_1.3.23/htdocs/manual/misc/API.html de la distribution standard apporte des précisions, le serveur http://www.apacheweek.com/ pointe également sur grand nombre de documents très utiles.
Le serveur Apache introduit également la possibilité de serveurs multi-domaines (domaines virtuels), ce qui est fort apprécié des hébergeurs de sites.
3.1 Environnement d'utilisation
La figure XVI.2 qui suit, synthétise l'environnement d'utilisation.
Le serveur se met en
uvre simplement. La compilation fournit un
exécutable, httpd, qui, pour s'exécuter correctement, a besoin des
trois fichiers ASCII de configuration : srm.conf, access.conf,
httpd.conf. C'est en fait dans celui-ci que sont effectués l'essentiel
des ajustements locaux à la configuration standard.
Lors de l'exécution, trois fichiers sont modifiésXVI12 :
Le ``daemon'' httpd est soit du type (ServerType) ``standalone'' ou si son invocation est occasionnelle, à la demande piloté par inetd (cf page 4).
Il démarre son activité par ouvrir le port (Port) désigné dans la configuration, puis s'exécute avec les droits de l'utilisateur User et du groupe Group. Sa configuration se trouve dans le répertoire conf sous-répertoire de ServerRoot. Les fichiers accessibles par les connexions clientes, eux, se situent dans le répertoire DocumentRoot qui en est la racine, c'est à dire vue comme "/" par les browsers clients.
Le fichier httpd.pid contient un numéro de processus ``leader'' de groupe car en fait le serveur Apache, dès son initialisation, démarre un certain nombre de processus, autant de serveurs capables de comprendre les requêtes des clients. En voici un exemple :
MinSpareServers 5