From 6beeb1b708550be0d4a53b272283e17e5e35fe17 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 17:01:30 +0200 Subject: Adding upstream version 2.4.57. Signed-off-by: Daniel Baumann --- docs/manual/mod/mod_proxy_ajp.html.fr.utf8 | 693 +++++++++++++++++++++++++++++ 1 file changed, 693 insertions(+) create mode 100644 docs/manual/mod/mod_proxy_ajp.html.fr.utf8 (limited to 'docs/manual/mod/mod_proxy_ajp.html.fr.utf8') diff --git a/docs/manual/mod/mod_proxy_ajp.html.fr.utf8 b/docs/manual/mod/mod_proxy_ajp.html.fr.utf8 new file mode 100644 index 0000000..d119074 --- /dev/null +++ b/docs/manual/mod/mod_proxy_ajp.html.fr.utf8 @@ -0,0 +1,693 @@ + + + + + +mod_proxy_ajp - Serveur HTTP Apache Version 2.4 + + + + + + + + +
<-
+ +
+

Module Apache mod_proxy_ajp

+
+

Langues Disponibles:  en  | + fr  | + ja 

+
+ + + + +
Description:Module de support AJP pour +mod_proxy
Statut:Extension
Identificateur de Module:proxy_ajp_module
Fichier Source:mod_proxy_ajp.c
Compatibilité:Disponible à partir de la version 2.1 du serveur HTTP +Apache
+

Sommaire

+ +

Ce module nécessite le chargement de mod_proxy. Il fournit le support du Protocole Apache + JServ version 1.3 (nommé dans la suite de ce document + AJP13).

+ +

Pour être en mesure d'exploiter le protocole AJP13, + il est donc nécessaire de charger les modules + mod_proxy et mod_proxy_ajp.

+ +

Avertissement

+

N'activez pas la fonctionnalité de mandataire avant d'avoir sécurisé votre serveur. Les + serveurs mandataires ouverts sont dangereux non seulement pour + votre réseau, mais aussi pour l'Internet au sens large.

+
+
+ +
top
+
+

Utilisation

+

Ce module permet de mandater en inverse un serveur d'application + d'arrière-plan (comme Apache Tomcat) qui utilise le protocole AJP13. + Son utilisation est similaire à celle d'un mandataire inverse HTTP, + mais s'appuie sur le prefixe ajp:// :

+ +

Mandataire inverse simple

ProxyPass "/app" "ajp://backend.example.com:8009/app"
+
+ +

Les options telles que l'option secret de Tomcat (requise + par défaut depuis Tomcat 8.5.51 et 9.0.31) peut tout simplement être ajoutée + en tant que paramètre séparé à la fin des directives ProxyPass ou BalancerMember. Ce paramètre est disponible à + partir de la version 2.4.42 du serveur HTTP Apache :

+

Mandataire inverse simple avec l'option secret

ProxyPass "/app" "ajp://backend.example.com:8009/app" secret=YOUR_AJP_SECRET
+
+ +

On peut aussi configurer un répartiteur de charge :

+

Mandataire inverse avec répartiteur de charge

<Proxy "balancer://cluster">
+    BalancerMember "ajp://app1.example.com:8009" loadfactor=1
+    BalancerMember "ajp://app2.example.com:8009" loadfactor=2
+    ProxySet lbmethod=bytraffic
+</Proxy>
+ProxyPass "/app" "balancer://cluster/app"
+
+ +

Notez qu'en général, la directive ProxyPassReverse n'est pas + nécessaire. La requête AJP inclut l'en-tête host original fourni + au mandataire, et le serveur d'application est sensé générer des + en-têtes auto-référençants relatifs à cet hôte ; aucune réécriture + n'est donc nécessaire.

+ +

La situation la plus courante dans laquelle la directive ProxyPassReverse est nécessaire se + rencontre lorsque le chemin de l'URL au niveau du mandataire est + différente de celle du serveur d'arrière-plan. Dans ce cas, un + en-tête redirect peut être réécrit relativement à l'URL de l'hôte + original (et non du serveur d'arrière-plan ajp:// URL) + ; par exemple :

+

Réécriture d'un chemin mandaté

ProxyPass "/apps/foo" "ajp://backend.example.com:8009/foo"
+ProxyPassReverse "/apps/foo" "http://www.example.com/foo"
+
+

Il est cependant préférable en général de déployer l'application + sur le serveur d'arrière-plan avec le même chemin que sur le + mandataire. +

+
top
+
+

Variables d'environnement

+

Les variables d'environnement dont le nom possède le préfixe + AJP_ sont transmises au serveur original en tant + qu'attributs de requête AJP (le préfixe AJP_ étant supprimé du + nom de la clé).

+
top
+
+

Vue d'ensemble du protocole

+

Le protocole AJP13 est orienté paquet. Le format + binaire a été préféré, probablement pour des raisons de + performances, au format texte pourtant plus lisible. Le serveur web + communique avec le conteneur de servlets sur une connexion TCP. Pour + diminuer la charge induite par le processus de création de socket, + le serveur web va tenter d'utiliser des connexions TCP persistantes + avec le conteneur de servlets, et de réutiliser les connexions + pendant plusieurs cycles requêtes/réponse.

+

Lorsqu'une connexion a été assignée à une requête particulière, + elle ne sera utilisée pour aucune autre jusqu'à ce que le cycle de + traitement de la requête se soit terminé. En d'autres termes, il n'y + a pas de multiplexage des requêtes sur une connexion. Ceci se + traduit par un code beaucoup plus simple à chaque extrémité de la + connexion, un nombre plus important de connexions étant cependant + ouvertes en même temps.

+

Lorsque le serveur web a ouvert une connexion vers le conteneur + de servlets, celle-ci peut se trouver dans l'un des états suivants + :

+
    +
  • Idle
    Aucune requête n'est traitée sur cette + connexion.
  • +
  • Assigned
    La connexion fait l'objet d'un traitement de + requête.
  • +
+

Lorsqu'une connexion est assignée au traitement d'une requête + particulière, les informations de base de cette dernière (comme les + en-têtes HTTP, etc...) sont envoyées sur la connexion sous une forme + très condensée (par exemple les chaînes courantes sont codées sous + forme d'entiers). Vous trouverez des détails sur ce format plus + loin dans la structure des paquets de requête. Si la requête possède + un corps (content-length > 0), il est envoyé dans un + paquet séparé immédiatement après.

+

A ce moment, le conteneur est probablement prêt à traiter la + requête. Au cours de ce traitement, il peut renvoyer les messages + suivants au serveur web :

+
    +
  • SEND_HEADERS
    Renvoie un jeu d'en-têtes au navigateur.
  • +
  • SEND_BODY_CHUNK
    Renvoie un tronçon de corps de requête au + navigateur. +
  • +
  • GET_BODY_CHUNK
    Reçoit un autre tronçon de données de la + requête si elle n'a pas encore été transmise intégralement. Ce type + de transmission est nécessaire car les paquets possèdent une taille + maximale fixe, et des quantités quelconques de données peuvent être + contenues dans le corps de la requête (pour un chargement de + fichier, par exemple). Notez que cela n'a rien à voir avec le + transfert HTTP fractionné.
  • +
  • END_RESPONSE
    Termine le cycle du traitement de la + requête.
  • +
+

Chaque message est associé à un paquet de données formaté + différemment. Voir plus loin les structures des paquets de réponses + pour plus de détails.

+
top
+
+

Structure de base des paquets

+

Ce protocole hérite en partie de XDR, mais il diffère sur de + nombreux points (pas d'alignement sur 4 bits, par exemple).

+

AJP13 utilise les octets selon leur ordre d'arrivée par le réseau + pour tous les types de données.

+

Le protocole comporte quatre types de données : octets, booléens, + entiers et chaînes de caractères.

+
+
Octet
Un seul octet.
+
Booléen
+
Un seul octet, 1 = vrai, 0 = faux. + L'utilisation d'autres valeurs non nulles (dans le style C) peut + fonctionner dans certains cas, mais pas dans certains autres..
+
Entier
+
Un nombre compris entre 0 et 2^16 (32768), stocké + sur 2 octets en débutant par l'octet de poids forts.
+
Chaîne
+
Une chaîne de taille variable (longueur limitée à 2^16). Elle + est codée comme suit : les deux premiers octets représentent la + longueur de la chaîne, les octets suivants constituent la chaîne + proprement dite (y compris le '\0' final). Notez que la longueur + encodée dans les deux premiers octets ne prend pas en compte le + '\0' final, de la même manière que strlen. Cela peut + prêter à confusion du point de vue de Java qui est surchargé de + déclarations d'autoincrémentation étranges destinées à traiter + ces terminateurs. Je suppose que le but dans lequel cela a + été conçu ainsi était de permettre au code C d'être plus efficace + lors de la lecture de chaînes en provenance du conteneur de + servlets -- avec le caractère \0 final, le code C peut transmettre + des références dans un seul tampon, sans avoir à effectuer de + copie. En l'absence du caractère \0 final, le code C doit + effectuer une copie afin de pouvoir tenir compte de sa notion de + chaîne.
+
+ +

Taille du paquet

+

Selon la majorité du code, la taille maximale du paquet est de + 8 * 1024 bytes (8K). La taille réelle du paquet est + encodée dans l'en-tête.

+ +

En-têtes de paquet

+

Les paquets envoyés par le serveur vers le conteneur commencent + par 0x1234. Les paquets envoyés par le conteneur vers + le serveur commencent par AB (c'est à dire le code + ASCII de A suivi du code ASCII de B). Ensuite, vient un entier (codé + comme ci-dessus) représentant la longueur des données transmises. + Bien que ceci puisse faire croire que la taille maximale des données + est de 2^16, le code définit en fait ce maximum à 8K.

+ + + + + + + + + + + + + + + + + + + + +
Format du paquet (Serveur->Conteneur)
Octet01234...(n+3)
Contenu0x120x34Taille des données (n)Data
+ + + + + + + + + + + + + + + + + + + + +
Format du paquet + (Conteneur->Serveur)
Octet01234...(n+3)
ContenuABTaille des données (n)Data
+

Pour la plupart des paquets, le premier octet de la charge utile + encode le type de message, à l'exception des paquets contenant un + corps de requête envoyés du serveur vers le conteneur -- ils + comportent un en-tête standard (0x1234 suivi de la taille + du paquet), mais celui-ci n'est suivi d'aucun préfixe.

+

Le serveur web peut envoyer les messages suivants au conteneur + de servlets :

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeType de paquetSignification
2Fait suivre la requêteDébute le cycle de traitement de la requête avec les données + qui suivent.
7ArrêtLe serveur web demande au conteneur de s'arrêter.
8PingLe serveur web demande au conteneur de prendre le contrôle + (phase de connexion sécurisée).
10CPingLe serveur web demande au conteneur de répondre rapidement + avec un CPong. +
noneDonnéesTaille (2 octets) et les données correspondantes.
+

À des fins de sécurité, le conteneur n'effectuera réellement son + Arrêt que si la demande provient de la machine par + laquelle il est hébergé.

+

Le premier paquet Données est envoyé immédiatement + après le paquet Faire suivre la requête par le serveur + web.

+

Le conteneur de servlets peut envoyer les types de messages + suivants au serveur web :

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeType de paquetSignification
3Envoi d'un tronçon de corpsEnvoi d'un tronçon de corps depuis le conteneur de servlets + vers le serveur web (et probablement vers le navigateur).
4Envoie les en-têtesEnvoi des en-têtes de réponse depuis le conteneur de + servlets vers le serveur web (et probablement vers le + navigateur).
5Fin de la réponseMarque la fin de la réponse (et par conséquent du cycle de + traitement de la requête). +
6Réception du tronçon de corps suivantRéception de la suite des données de la requête si elles + n'ont pas encore été entièrement transmises.
9Réponse CPongLa réponse à une requête CPing
+

Chacun des messages ci-dessus possède une structure interne + différente dont vous trouverez les détails ci-dessous.

+ +
top
+
+

Structure des paquets de +requête

+

Pour les messages de type Faire suivre la requête depuis + le serveur vers le conteneur :

+
AJP13_FORWARD_REQUEST :=
+    prefix_code      (byte) 0x02 = JK_AJP13_FORWARD_REQUEST
+    method           (byte)
+    protocol         (string)
+    req_uri          (string)
+    remote_addr      (string)
+    remote_host      (string)
+    server_name      (string)
+    server_port      (integer)
+    is_ssl           (boolean)
+    num_headers      (integer)
+    request_headers *(req_header_name req_header_value)
+    attributes      *(attribut_name attribute_value)
+    request_terminator (byte) OxFF
+

Les request_headers possèdent la structure suivante + : +

req_header_name :=
+    sc_req_header_name | (string)  [voir ci-dessous pour la manière dont
+    ceci est interprété]
+
+sc_req_header_name := 0xA0xx (integer)
+
+req_header_value := (string)
+

Les attributes sont optionnels et possèdent la + structure suivante :

+
attribute_name := sc_a_name | (sc_a_req_attribute string)
+
+attribute_value := (string)
+

Un des en-têtes les plus importants est + content-length, car il indique si le conteneur doit ou + non attendre un autre paquet immédiatement.

+

Description détaillée de la requête que le serveur + fait suivre vers le conteneur +

+

Préfixe de la requête

+

Pour toutes les requêtes, ce préfixe est 2. Voir ci-dessus pour + les détails des autres codes de préfixes.

+ +

Méthode

+

La méthode HTTP, encodée sous la forme d'un seul octet :

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nom commandeCode
OPTIONS1
GET2
HEAD3
POST4
PUT5
DELETE6
TRACE7
PROPFIND8
PROPPATCH9
MKCOL10
COPY11
MOVE12
LOCK13
UNLOCK14
ACL15
REPORT16
VERSION-CONTROL17
CHECKIN18
CHECKOUT19
UNCHECKOUT20
SEARCH21
MKWORKSPACE22
UPDATE23
LABEL24
MERGE25
BASELINE_CONTROL26
MKACTIVITY27
+

Les versions futures d'ajp13 pourront transmettre des méthodes + supplémentaires, même si elles ne font pas partie de cette + liste.

+ +

protocol, req_uri, remote_addr, remote_host, server_name, + server_port, is_ssl

+

Les significations de ces éléments sont triviales. Ils sont tous + obligatoires et seront envoyés avec chaque requête.

+ +

En-têtes

+

La structure de request_headers est la suivante + : tout d'abord, le nombre d'en-têtes num_headers est + encodé, suivi d'une liste de paires nom d'en-tête + req_header_name / valeur req_header_value. + Les noms d'en-têtes courants sont codés sous forme d'entiers afin de + gagner de la place. Si le nom d'en-tête ne fait partie de la liste + des en-têtes courants, il est encodé normalement (une chaîne de + caractères préfixée par la taille). La liste des en-têtes courants + sc_req_header_name avec leurs codes se présente comme + suit (il sont tous sensibles à la casse) :

+ + + + + + + + + + + + + + + + + + + +
NomValeur du codeNom du code
accept0xA001SC_REQ_ACCEPT
accept-charset0xA002SC_REQ_ACCEPT_CHARSET +
accept-encoding0xA003SC_REQ_ACCEPT_ENCODING +
accept-language0xA004SC_REQ_ACCEPT_LANGUAGE +
authorization0xA005SC_REQ_AUTHORIZATION
connection0xA006SC_REQ_CONNECTION
content-type0xA007SC_REQ_CONTENT_TYPE
content-length0xA008SC_REQ_CONTENT_LENGTH
cookie0xA009SC_REQ_COOKIE
cookie20xA00ASC_REQ_COOKIE2
host0xA00BSC_REQ_HOST
pragma0xA00CSC_REQ_PRAGMA
referer0xA00DSC_REQ_REFERER
user-agent0xA00ESC_REQ_USER_AGENT
+

Le code Java qui lit ceci extrait l'entier représenté par les + deux premiers octets, et si le premier octet est + '0xA0', il utilise l'entier représenté par le deuxième + octet comme index d'un tableau de noms d'en-têtes. Si le premier + octet n'est pas 0xA0, l'entier représenté par les deux + octets est considéré comme la longueur d'une chaîne qui est alors + lue.

+

Ceci ne peut fonctionner que si aucun nom d'en-tête ne possède + une taille supérieure à 0x9FFF (==0xA000 - 1), ce qui + est vraisemblable, bien qu'un peu arbitraire.

+

Note:

+ L'en-tête content-length est extrêmement important. + S'il est présent et non nul, le conteneur considère que la requête + possède un corps (une requête POST, par exemple), et lit + immédiatement le paquet suivant dans le flux d'entrée pour extraire + ce corps. +
+ +

Attributs

+

Les attributs préfixés par ? (par exemple + ?context) sont tous optionnels. Chacun d'eux est + représenté par un octet correspondant au type de l'attribut et par + sa valeur (chaîne ou entier). Ils peuvent être envoyés dans un ordre + quelconque (bien que le code C les envoie dans l'ordre ci-dessous). + Un code de terminaison spécial est envoyé pour signaler la fin de la + liste des attributs optionnels. La liste des codes est la suivante + :

+ + + + + + + + + + + + + + + +
InformationValeur codeType de valeurNote
?context0x01-Non implémenté + actuellement +
?servlet_path0x02-Non implémenté + actuellement +
?remote_user0x03String
?auth_type0x04String
?query_string0x05String
?jvm_route0x06String
?ssl_cert0x07String
?ssl_cipher0x08String
?ssl_session0x09String
?req_attribute0x0AStringNom (le + nom de l'attribut vient ensuite)
?ssl_key_size0x0BInteger
?secret0x0CStringSupporté depuis la + version 2.4.42
are_done0xFF-request_terminator
+

context et servlet_path ne sont pas + définis actuellement par le code C, et la majorité du code Java + ignore complètement ce qui est envoyé par l'intermédiaire de ces + champs (il va même parfois s'interrompre si une chaîne est + envoyée après un de ces codes). Je ne sais pas si c'est une bogue ou + une fonctionnalité non implémentée, ou tout simplement du code + obsolète, mais en tout cas, il n'est pris en charge par aucune des + deux extrémités de la connexion.

+

remote_user et auth_type concernent + probablement l'authentification au niveau HTTP, et contiennent le + nom de l'utilisateur distant ainsi que le type d'authentification + utilisée pour établir son identité (à savoir Basic, Digest).

+

query_string, ssl_cert, + ssl_cipher, ssl_session et + ssl_key_size contiennent les + éléments HTTP et HTTPS correspondants.

+

jvm_route est utilisé dans le cadre des sessions + persistantes, en associant une session utilisateur à une instance + Tomcat particulière en présence de plusieurs répartiteurs de + charge.

+

Le mot de passe est envoyé lorsque la directive ProxyPass ou BalancerMember utilise le paramètre + secret=secret_keyword. Le serveur d'arrière-plan doit savoir + utiliser les mots de passe et les valeurs doivent correspondre. + request.secret ou requiredSecret sont documentés + dans la configuration AJP d'Apache Tomcat.

+

Au delà de cette liste de base, tout autre attribut + supplémentaire peut être envoyé via le code + req_attribute 0x0A. Une paire de chaînes + représentant le nom et la valeur de l'attribut est envoyée + immédiatement après chaque instance de ce code. Les variables + d'environnement sont transmises par cette méthode.

+

Enfin, lorsque tous les attributs ont été transmis, le + terminateur d'attributs, 0xFF, est envoyé. Ce dernier + indique à la fois la fin de la liste d'attributs et la fin du paquet + de la requête

+ +
top
+
+

Structure du paquet de la +réponse

+

Pour les messages que le conteneur peut renvoyer au + serveur.

+
AJP13_SEND_BODY_CHUNK :=
+  prefix_code   3
+  chunk_length  (integer)
+  chunk        *(byte)
+  chunk_terminator (byte) Ox00
+
+
+AJP13_SEND_HEADERS :=
+  prefix_code       4
+  http_status_code  (integer)
+  http_status_msg   (string)
+  num_headers       (integer)
+  response_headers *(res_header_name header_value)
+
+res_header_name :=
+    sc_res_header_name | (string)   [voir ci-dessous pour la manière
+    dont ceci est interprété]
+
+sc_res_header_name := 0xA0 (byte)
+
+header_value := (string)
+
+AJP13_END_RESPONSE :=
+  prefix_code       5
+  reuse             (boolean)
+
+
+AJP13_GET_BODY_CHUNK :=
+  prefix_code       6
+  requested_length  (integer)
+

Détails:

+

Envoi d'un tronçon de corps

+

Le tronçon se compose essentiellement de données binaires et est + renvoyé directement au navigateur.

+ +

Envoi des en-têtes

+

Les code et message d'état correspondent aux code et message HTTP + habituels (par exemple 200 et OK). Les + noms d'en-têtes de réponses sont codés de la même façon que les noms + d'en-têtes de requêtes. Voir ci-dessus le codage des en-têtes pour + plus de détails à propos de la manière dont les codes se distinguent + des chaînes.
+ Les codes des en-têtes courants sont ::

+ + + + + + + + + + + + + +
NomValeur code
Content-Type0xA001
Content-Language0xA002
Content-Length0xA003
Date0xA004
Last-Modified0xA005
Location0xA006
Set-Cookie0xA007
Set-Cookie20xA008
Servlet-Engine0xA009
Status0xA00A
WWW-Authenticate0xA00B
+

La valeur de l'en-tête est codée immédiatement après le code ou + la chaîne du nom d'en-tête.

+ +

Fin de la réponse

+

Signale la fin de ce cycle de traitement de requête. Si le + drapeau reuse est à true (toute valeur autre que + 0 en langage C pur), cette + connexion TCP peut être réutilisée pour traiter de nouvelles + requêtes entrantes. Si reuse est à false + (==0), la connexion sera fermée.

+ +

Réception d'un tronçon de corps

+

Le conteneur réclame la suite des données de la requête (dans le + cas où la taille du corps était trop importante pour pouvoir être + contenue dans le premier paquet envoyé, où lorsque la requête est + fractionnée). Le serveur va alors envoyer un paquet contenant une + quantité de données correspondant au minimum de la + request_length, la taille maximale de corps envoyée + (8186 (8 Koctets - 6)), et le nombre réel d'octets + restants à envoyer pour ce corps de requête.
+ S'il ne reste plus de données à transmettre pour ce corps de requête + (c'est à dire si le conteneur de servlets tente de lire au delà de + la fin du corps), le serveur va renvoyer un paquet vide + dont la charge utile est de longueur 0 et se présentant sous la + forme (0x12,0x34,0x00,0x00).

+ +
+
+
+

Langues Disponibles:  en  | + fr  | + ja 

+
top

Commentaires

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our mailing lists.
+
+ \ No newline at end of file -- cgit v1.2.3