# đŸ—ïž Architecture ## đŸ§± Composants Pingclair est un workspace Cargo. Le serveur en service est le binaire `pingclair`, qui lie les crates ci-dessous. | Crate | ResponsabilitĂ© | | --- | --- | | `pingclair` | Point d'entrĂ©e en ligne de commande : analyse des arguments, journalisation, dĂ©marrage et enveloppe de service. | | `pingclair-config` | Compilateur de configuration : analyse lexicale, analyse syntaxique et contrĂŽles sĂ©mantiques du Pingclairfile. | | `pingclair-proxy` | Proxy HTTP/1.1 et HTTP/2 sur Pingora, Ă©couteur HTTP/3 sur quiche, rĂ©partition de charge et couche de politique partagĂ©e. | | `pingclair-static` | Service de fichiers statiques : lectures, types MIME, requĂȘtes partielles et diffusion en flux. | | `pingclair-tls` | Gestion des certificats : certificats manuels, autoritĂ© interne persistante et Ă©mission ACME automatique. | | `pingclair-api` | Admin API pour inspecter l'Ă©tat et recharger la configuration. | | `pingclair-core` | Structures de donnĂ©es et cycle de vie du serveur partagĂ©s par les crates ci-dessus. | ## 🚩 Le chemin d'une requĂȘte ```text client | | TLS avec ALPN, ou QUIC v listener HTTP/1.1 et HTTP/2 sur TCP, HTTP/3 sur UDP | v transport adapter Pingora ProxyHttp pour TCP, tokio-quiche pour QUIC | v policy layer routage, matchers, en-tĂȘtes, limites de dĂ©bit, journal d'accĂšs | v handler file server | reverse proxy | FastCGI | rĂ©ponse statique | v amont ou disque ``` Les deux transports convergent vers la mĂȘme couche de politique : le routage, la gestion des en-tĂȘtes, la limitation de dĂ©bit et le journal d'accĂšs se comportent de la mĂȘme façon en HTTP/1.1, HTTP/2 et HTTP/3. Les transports ne diffĂšrent que lĂ  oĂč le protocole l'impose, et ces diffĂ©rences sont listĂ©es ci-dessous. ## 🌊 PropriĂ©tĂ©s du traitement des requĂȘtes - **Les corps sont diffusĂ©s en flux.** Les corps de requĂȘte et de rĂ©ponse traversent le proxy par blocs bornĂ©s. La compression, les intergiciels et la proxification ne mettent pas en tampon un corps complet : un envoi volumineux ou un lecteur lent ne consomme donc pas une mĂ©moire proportionnelle Ă  la taille du corps. - **Les connexions amont sont mutualisĂ©es.** Les connexions keepalive vers les backends sont rĂ©utilisĂ©es. Les amonts dĂ©signĂ©s par un nom d'hĂŽte sont rĂ©solus Ă  nouveau Ă  l'intervalle dĂ©fini par `dns_refresh` : un conteneur qui redĂ©marre sur une nouvelle adresse est suivi sans intervention. - **L'Ă©tat d'exĂ©cution est immuable au moment de la requĂȘte.** Les requĂȘtes lisent un instantanĂ© publiĂ©. Un rechargement publie un nouvel instantanĂ© au lieu de modifier celui qui est en service. ## 🌐 Comportement propre Ă  chaque protocole Certains comportements diffĂšrent selon le protocole, par conception. Ils sont listĂ©s ici plutĂŽt que dĂ©couverts plus tard : | Domaine | Comportement | | --- | --- | | Trailers | Les trailers de requĂȘte dĂ©clarĂ©s ne sont pas transmis. Le serveur rĂ©pond `501` avant l'engagement de la rĂ©ponse, rĂ©initialise un flux HTTP/3 dĂ©jĂ  engagĂ©, et rĂ©pond `502` lorsqu'un amont annonce des trailers de rĂ©ponse. | | CONNECT | `CONNECT` et `CONNECT` Ă©tendu renvoient `501` en HTTP/3 jusqu'Ă  ce que la prise en charge des tunnels soit implĂ©mentĂ©e. | | FastCGI | `php_fastcgi` fonctionne en HTTP/1.1 et HTTP/2. Les routes qui exigent FastCGI renvoient `501` en HTTP/3 jusqu'Ă  ce que ce chemin dispose de son propre client FastCGI. | ## ⚠ DĂ©faut connu Les mises Ă  niveau WebSocket Ă©chouent par intermittence sous charge : environ 10 Ă  15 % des mises Ă  niveau sur une machine occupĂ©e. La cause est une course dans la crate amont `pingora-proxy`, et non dans la gestion des mises Ă  niveau de Pingclair ; elle est invisible sur une machine de dĂ©veloppement au repos, d'oĂč cette documentation. Ticket amont : [cloudflare/pingora#946](https://github.com/cloudflare/pingora/issues/946).