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
