Apache HTTP Server Version 1.3
Vue d'ensemble des nouvelles fonctionnalités
Nouvelles fonctionnalités de la version 1.3 d'Apache
De toutes nouvelles fonctionnalités sont apportées par cette
remise à jour, étendant celles déjà
supportées par Apache (lire aussi le fichier plus détaillé
CHANGES
dans le répertoire des sources). Comme le noyau a
changé de façon significative, certaines "libertés" que
l'on pouvait prendre dans la configuration de versions plus anciennes d'Apache
(et du daemon NCSA) ne sont désormais plus permises - Voir les rubriques de compatibilité si vous
rencontrez quelques problèmes.
Outre avoir corrigé un certain nombre de bogues majeurs et avoir
amélioré les performances internes de manière
significative, la version 1.3
d'Apache propose les toutes nouvelles fonctionnalités suivantes :
- Module
optionnel «Spelling Correction» ajouté à la
distribution
Ce module optionnel corrige de fréquentes erreurs d'orthographie des
noms des documents inscrits dans une requête destinée au serveur.
Ceci inclue la correction de requêtes mal capitalisées (fonction
déjà disponible dans le module séparé d'Apache 1.1
mod_speling ) et étend les facultés de correction
à des caractères simple insérés par erreur, omis,
transformés ou mal tapés. Ce module permet de corriger la
majorité des requêtes mal orthographiées. Pour utiliser ce
module, il faudra le valider dans le fichier de Configuration
du
serveur, et la directive CheckSpelling devra être
définie comme on
.
- Définition conditionnelle de variables
d'environnement améliorée
Les directives BrowserMatch* de la version 1.2
d'Apache ont été complétées par des synatxes encore
plus puissantes : SetEnvIf et SetEnvIfNoCase. Celles-ci vous
permettent de définir des variables d'environnement pour le serveur et
les CGI basées sur toute sorte d'attributs de la requête.
- Trace améliorée pour les erreurs de connexion du
proxy
Dans les versions 1.2 d'Apache et antérieures, lorsque le proxy
éprouvait des difficultés à se connecter à un
système, il enregistrait la trace de l'erreur, mais pas de façon
détaillée. L'enregistrement d'erreur inclue désormais
l'adresse IP et le port auquel il a tenté de se connecter
infructueusement.
- Comparaisons étendues de chaînes
SSI
Les directives de contrôle de flux Server-Side Include (SSI) basé
sur des chaînes, et mises à disposition par le module mod_include intègrent
désormais les comparaisons inférieur-à (<),
inférieur-ou-égal-à (<=), supérieur-à
(>), et supérieur-ou-égal-à (>=). Les comparaisons
n'étaient auparavant possibles que pour l'égalité et la
non égalité.
- Sources
réorganisés
Les sources d'Apache ont été réorganisés. La
différence essentielle du point de vue des utilisateurs d'Apache
réside dans le fait que les lignes "Module" du fichier de
Configuration
doivent être remplacées par des
"AddModule" avec une syntaxe légèrement différente. Du
point de vue des auteurs de modules, certaines modifications ont
été apportées pour rendre plus simple l'ajout de ces
modules par les utilisateurs.
- Répertoire par défaut d'Apache
déplacé vers
/usr/local/apache/
Le répertoire ServerRoot par défaut pour Apache a
été déplacé du répertoire
spécifié par la définition NCSA d'origine
/usr/local/etc/httpd/ vers le nouveau répertoire
/usr/local/apache/. Cette modification n'intervient que pour la
configuration par défaut (et la documentation) ; il est bien entendu
toujours possible de modifier ce répertoire par les options de la ligne
de commande -d ServerRoot et -f httpd.conf de démarrage d'Apache.
- Affichage de contenus de répertoires
triés
Si le contenu d'un répertoire est affiché en utilisant la
fonctionnalité FancyIndexing, le fait de cliquer
sur un titre de colonne propvoquera un réaffichage trié du
répertoire selon cette colonne. La sélection successive de la
même colonne commute l'ordre du tri (entre ascendant et descendant).
Cette fonction peut être désactivée par le mot clef
SuppressColumnSorting dans IndexOptions.
- Option SuppressHTMLPreamble pour
l'affichage évolué de répertoires
Si un répertoire est marqué comme devant être
affiché en mode FancyIndexing, l'affichage du contenu est habituellement
précédé par une en-tête HTML
prédéfinie générée par le serveur.
Si la directive IndexOptions pour ce
répertoire mentionne l'option SuppressHTMLPreamble,
et si le fichier spécifié par la directive HeaderName est trouvé dans
ce répertoire, et ce fichier d'en-tête est
reconnu comme étant écrit en HTML (suivant l'extension du nom de
fichier), alors le module supposera que ce fichier contient
les tags HTML introductifs nécessaires et suffisants et s'abstiendra de
générer lui-même sa propre en-tête.
- Moins de tamponnage des sorties de scripts CGI
Dans les versions précédentes d'Apache, la sortie de scripts CGI
était tamponnée en interne par le serveur, et ne pouvait
être répercutée sur le client tant que le tampon
n'était pas plein, ou le CGI n'avait pas terminé son
exécution. Sur Apache 1.3, le tampon entre le CGI et le client est
vidé à chaque fois qu'il contient des informations et que le
serveur attend d'autres données en provenance du script. Ceci permet aux
clients d'obtenir des rapports partiels lors de traitements longs.
- Support de Windows NT/95
Apache supporte désormais les plates-formes Windows NT et Windows 95,
en plus des systèmes Unix supportés par les versions
précédentes. Bien que la version Windows d'Apache ne soit pas
aussi performante que sa sœur pour Unix (pour laquelle Apache a
été écrit à l'origine), ce nouveau support permet
à Apache d'être exploité sur un nombre bien plus important
de sites qu'auparavant.
- Support des expressions
régulières dans les directives Alias et Redirect
Les nouvelles directives AliasMatch, ScriptAliasMatch, et RedirectMatch permettent
l'utilisation d'expression régulières. De plus, les nouvelles
sections <DirectoryMatch>, <LocationMatch>, et <FilesMatch> proposent une
nouvelle syntaxe pour la définition de sections à partir
d'expressions régulières.
- Nouveau module de typage "Magic"
MIME
Un nouveau module optionnel mod_mime_magic
, a été
ajouté. Il exploite les "nombres magiques" et autres astuces pour
identifier le contenu d'un fichier. Il utilise alors ces informations pour
déterminer le type de média du fichier, lorsque celui-ci ne peut
être déduit de l'extension du nom de fichier.
- Division du module d'affichage de répertoires
Le module mod_dir
a été divisé en deux, mod_dir traitant des fichiers d'indexage de
répertoire, et mod_autoindex
créant des listes de répertoires. Ceci permet aux utilisateurs en
situation critique de désactiver la fonction d'indexage.
- Gestion des tailles d'icones pour les répertoires
Le module mod_autoindex procure les listes de
contenu de répertoire lorsqu'approprié. Si l'option
FancyIndexing est active, chaque fichier listé est
précédé par une icone représentant le type de son
contenu. Dans les verisons antérieures d'Apache, les balises HTML
IMG insérant ces icones n'avaient pas d'information de
taille, et le navigateur devait attendre que les images soient chargées
pour pouvoir commencer à effectuer la mise en page. A partir de la
version 1.3, la directive IndexOptions dispose de deux
nouveaux mots-clefs qui permettent de contrôler si des balises
IMG pré-taillées doivent être
utilisées. Ceci peut notablement accélérer l'affichage de
répertoires longs.
- AccessFileName
améliorée
La directive AccessFileName accepte désormais plus d'un
nom de fichier. Ceci permet à des sites de servir des pages à
partir de systèmes de fichiers "réseau" et à partir de
plusieurs serveurs Web Apache, et configurer sur chaque serveur l'accès
aux pages partagées.
- HostNameLookups
spécifié par
défaut à "Off"
La directive HostNameLookups est maintenant
spécifiée par défaut à "Off". Ceci signifie que,
à moins qu'elle ne soit explicitement remise sur "on", le serveur ne
résoudra pas les adresses IP. Ceci a été
décidé pour éliminer d'Internet un surtrafic DNS inutile.
- Double résolution DNS inverse forcée
La directive HostnameLookups supporte
désormais la double résolution DNS inverse. (Connue par les
spécialistes de tcp sous le nom de PARANOID). Une adresse IP
passe avec succès un test par double résolution DNS inverse si la
résolution vers l'espace de nom suivi d'une résolution inverse
vers l'espace d'adresse redonne l'adresse IP originale (et vice-versa). Les
listes d'accès gérées par mod_access et utilisant des noms DNS
imposent que tous les noms aient passés avec
succès le test de double résolution inverse,
indépendamment de la valeur de l'option HostnameLookups. (Les anciennes
versions d'Apache nécessitaient le basculement d'une option de
compilation pour activer la double résolution inverse).
- Contrôle d'accès CIDR et par masque de sous-
réseau
Les directives mod_access supportent
maintenant les préfixes de type CIDR (Classless Inter-Domain Routing),
ainsi que les masques de sous-réseau pour un contrôle accru des
listes d'accès IP.
- Directives
NoProxy et ProxyDomain
ajoutées au fonctionnement proxy, pour Intranets.
- Directive
AddModuleInfo
ajoutée au module mod_info
Permet d'obtenir des informations supplémentaires sur les modules
activés.
- Amélioration des performances
- Les hôtes virtuels basés sur des adresses IP sont
désormais recherchés via des tableaux associatifs,
améliorant les performances générales de serveurs
supportant un grand nombre de ces hôtes.
- L'inspection des sections <Directory> au moment du traitement des
requêtes a été considérablement optimisée,
accélérant le temps de réponse de configurations
très partitionnées.
- Le chemin critique pour le traitement des requêtes statiques fait
moins d'appels systèmes. Cette optimisation concerne globalement le
traitement de toutes les requêtes. (45 appels systèmes pour la
version 1.2 contre 22 en 1.3 - pour une configuration correcte).
- La directive ReceiveBufferSize donne aux
connexions sortantes prises par le module
mod_proxy
des tampons
réseau plus grands, qui permettent la gestion d'un débit plus
important.
- Les routines d'entrées/sorties de bas niveau utilisent
writev
(lorsque disponible) pour effectuer plusieurs
écritures dans le même appel système. Elles s'abstiennent
le plus possible de copier des segments de mémoire dans les tampons. Il
en résulte une réduction de consommation de temps CPU pendant le
transfert de fichiers importants.
- Les requêtes statiques sont servies via
mmap
, ce qui
signifie que les octets sont directement copiés depuis le tampon disque
vers le tampon réseau par le kernel ( et uniquement par le kernel). Le
programme ne copie jamais lui-même les octets, ce qui globalement
réduit la consommation de temps CPU. (Seulement lorsque
disponible/testé).
- Lorsqu'il est en présence d'une pointe de trafic, le serveur
s'adapte rapidement en générant des processus fils à une
cadence plus grande qu'auparavant.
- Le code qui fédère les modules a été
optimisé pour éviter de sauter de façon
systématique les modules qui n'implémentent pas certaines phases
de l'API. (Il a été mesuré que ces sauts
représentent 5% du temps cpu sur le profil d'un serveur utilisant le
module fédérateur standard).
- "Revamping" du code de gestion du "scoreboard" Unix pour que moins de
temps soit passé à compter les différents fils dans chaque
état. Auparavant, un accès était fait à chaque
requête. Maintenant, un accès est fait toutes les secondes. Ceci
devrait apporter une amélioration notable sur les serveurs tournant avec
des centaines de fils à pleine charge.
- De nouveaux choix en matière de sérialisation
améliorent les performances sous Linux, Solaris, et IRIX.
- mod_log_config peut être configuré à la
compilation pour écrire dans des tampons.
Voir la documentation sur les nouvelles
performances pour plus d'information.
- Identifiants uniques
Le module mod_unique_id peut être
inclus pour générer un identifiant unique qui distingue un "hit"
de tous les autres. ("Unique" doit être compris avec certaines
restrictions). L'identifiant peut être consulté dans la variable
d'environnement UNIQUE_ID
.
- Redirection de traces fiabilisées
Sur presque toutes les architectures Unix, Apache implémente
désormais une redirection de trace par tubes "fiabilisée" dans le
module mod_log_config. Fiabilisée
signifie que, si le processus fils qui enregistre dans la trace meurt pour
quelque raison que ce soit, Apache s'en aperçoit et en recrée un
sans avoir à redémarrer complètement. De plus, si le
processus exploitant la trace se bloque et ne vient pas "vider" le tube
suffisamment souvent, Apache est capable de le redémarrer. Ceci ajoute
un grand nombre de possibilités de pour la gestion de traces tournantes,
le filtrage des "hits", la séparation en temps réel de multiples
hôtes virtuels dans des traces séparées, ainsi que pour la
résolution DNS asynchrone "à la volée".
- Chemins relatifs à ServerRoot pour les fichiers
d'authentification
Les noms des fichiers Auth pour les divers modules d'authentification sont
désormais compris relativement à ServerRoot s'il ne sont pas
exprimés comme des chemins d'accès absolus.
- Directive
Include
La directive Include inclue des sous-fichiers de
configuration au point ou est placé la directive.
- L'absence de directive
TransferLog supprime le
traçage
Si aucune directive TransferLog n'est mentionnée
dans la configuration, alors toute opération de trace est
désactivée. Ceci supporte la coexistence avec d'autres modules de
trace.
- Nommage des formats de trace
La directive LogFormat a été
étendue pour permettre l'attribution d'un nom à un format
personnalisé. Vous pouvez utiliser ces noms dans d'autres directives
LogFormat et CustomLog, plutôt qu'avoir
à réécrire la chaîne complète de description
de format.
- mod_cern_meta configurable répertoire par
répertoire
mod_cern_meta est désormais
paramétrable sur la base des répertoires.
- Detachement des flux standard stdin/out/err
Au démarrage, Apache se détache de lui-même des flux
standard stdin, stdout, et stderr. Pour stderr, il ne s'en détachera
qu'une fois que toutes les directives de configuration ont été
correctement interprétées. Ceci permet de continuer à voir
les erreurs éventuelles dans les fichiers de configuration. Ceci permet
de démarrer Apache d'une manière plus pratique via rsh ou
crontab.
- Hôtes virtuels améliorés sous
HTTP/1.1
La nouvelle directive NameVirtualHost est utilisée
pour donner la liste des couples adresses_IP:port pour lesquels les hôtes
virtuels doivent être supportés sous le protocole HTTP/1.1. Cette
configuration est basée par hôte virtuel, selon le champ
"Host:
" de l'en-tête cliente. Dans les versions
précédentes, l'adresse utilisée était implicitement
l'adresse du "serveur principal" sur la machine, ceci posant des
problèmes sans fin aux utilisateurs, et n'étant visiblement pas
d'une puissance suffisante. Consultez la documentation sur les hôtes virtuels sous Apache pour plus de
détails sur la configuration.
- Nouvelles API
Pour tous ceux qui sont intéressés par l'implémentation
de code :
- Fonction
child_init
de l'API
des modules
L'API Apache définit une nouvelle phase d'exécution
appelée une fois par processus "lourd", avant que la moindre
requête ne soit traitée. Ceci permet au module de définir
tout ce qui doit être fait une seule fois par processus. Par exemple, la
connexion à une base de données.
- Fonction
child_exit
de l'API
des modules
Une nouvelle phase d'exécution appelée une seule fois par
processus "lourd", lorsqu'il se termine. Notez que cette phase ne peut
être appelées dans certaines situations (telles que segfaults et
kill -9). Les fonctions child_init
et child_exit
sont
passées à un "pool" dont la durée de vie est
équivalente à celle du processus fils (à moins d'erreurs
fatales pour lesquelles Apache n'a aucun moyen de récupération).
A contrario, la fonction init
du module est passée à
un "pool" dont la vie termine lorsque le père termine ou
redémarre.
- child_terminate
Utilisée dans le processus fils pour lui indiquer de terminer son
exécution après la fin de traitement de la requête
courante.
- register_other_child
Voir http_main.h
. Elle est utilisée dans le processus
père pour enregistrer un fils en vue de monitoring. Le père
pourra alors fournir un état de ce processus à une fonction
fournie. Ceci permet à un module de créer ses propres processus
fils, lesquels peuvent être contrôlés en même temps
que les fils de httpd.
- piped_log
Voir http_log.h
. Cette API procure le code commun pour
l'implémentation de la redirection de traces par tubes. En particulier,
elle implémente une redirection par tube fiabilisée sur les
architectures qui l'acceptent (c-à-d., actuellement Unix).
- Les fonctions MD5 renommées en
ap_*
Les fonctions MD5 ont été renommées pour éviter
des conflits avec d'autres librairies.
- Format du "scoreboard" modifié
Le format du "scoreboard" est légèrement différent. Il
est considéré en principe comme une interface "privée",
est n'est mentionné ici qu'en temps que FYI.
- set_last_modified
divisé en
trois
L'ancienne fonction set_last_modified
effectuait de multiples
tâches dont la définition de l'en-tête Last-
Modified
, de l'en-tête ETag
, et le traitement de
requêtes conditionnelles (telles que IMS). Cette focntion a
été subdivisée en trois fonctions :
set_last_modified
, set_etag
, et
meets_conditions
. Le champ mtime
a été
ajouté à la structure request_rec
pour faciliter
l'usage de meets_conditions
.
- Nouvelle fonction de trace d'erreur :
aplog_error
Toutes les anciennes fonctions de trace seront désormais
obsolètes, nous travaillons pour les remplacer par une focntion unique
appelée aplog_error
. Mais cette tâche est encore en
cours.
- set_file_slot
pour l'interprétation des
configurations
La routine set_file_slot
procure une routine standard qui
préfixe ServerRoot à des chemins exprimés en mode relatif.
- API de modules
post_read_request
Cette phase des requêtes intervient immédiatement après
avoir lu la requête (en-têtes), et immédiatement
après avoir créé une redirection interne. Elle est
particulièrement utile pour définie des variables d'environnement
destinées à paramétrer des phases ultérieures.
- psocket
, et
popendir
Les fonctions psocket
et pclosesocket
permettent,
pour des besoins typiquement du aux contraintes temps-réel, de
créer des sockets "libres" avec gestion de ressources. De même,
popendir
et pclosedir
protègent la lecture
dans les répertoires.
- is_initial_req
Teste si la requête est la requête initiale (c-à-
d., celle directement issue par le client originel).
- kill_only_once
Une option de la fonction spawn_child
qui évite qu'Apache
ne tente de tuer de façon radicale ses processus fils.
- alloc debugging code
La définition d'ALLOC_DEBUG
met en œuvre un debogueur de
mémoire rudimentaire pouvant être utilisé sur des serveurs
opérationnels avec peu d'effets secondaires -- Il initialise tous les
octets alloués et libérés à la valeur 0xa5. La
définition d'ALLOC_USE_MALLOC
obligera le code d'allocation
à utiliser malloc()
et free()
pour chaque
objet. Ceci est beaucoup plus gourmand en consommation de ressources et ne
devra être exploité que pour des séquences de test avec des
outils tels que Electric Fence et Purify. Voir main/alloc.c
pour
plus de détails.
- Modifications "An-2000"
La chaîne par défaut timefmt utilisée dans le
module mod_include a été
modifiée de façon à afficher l'année sur quatre
chiffres au lieu de deux. Le module mod_autoindex a de même
été modifié pour afficher l'année des dates sur
quatre digits lors de l'afichage de répertoires en mode FancyIndexed.
- Routines
ap_*()
déplacées vers une librairie séparée
Certaines fonctions et routines développées pour le projet
Apache complètent ou se substituent à des librairies qui
diffèrent d'un système d'exploitation à l'autre. Bien que
la plupart d'entre elles ne soient utilisées que par le serveur Apache
lui-même, certaines d'entre elles peuvent être requises pour des
compléments applicatifs (telles que htdigest). Il peut
arriver que certaines de ces applications ne puissent plus être
compilées du fait que ces routines n'ont été
intégrées que dans le serveur. Toutes ces fonctions ont donc
été déplacées vers des sous-répertoires et
des libraries séparées de sorte qu'elles puissent être
réutilisées dans d'autres projets.
Apache HTTP Server Version 1.3
