1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
3 <?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
4 <!-- English Revision: 1823832 -->
5 <!-- French translation : Lucien GENTIS -->
8 Licensed to the Apache Software Foundation (ASF) under one or more
9 contributor license agreements. See the NOTICE file distributed with
10 this work for additional information regarding copyright ownership.
11 The ASF licenses this file to You under the Apache License, Version 2.0
12 (the "License"); you may not use this file except in compliance with
13 the License. You may obtain a copy of the License at
15 http://www.apache.org/licenses/LICENSE-2.0
17 Unless required by applicable law or agreed to in writing, software
18 distributed under the License is distributed on an "AS IS" BASIS,
19 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 See the License for the specific language governing permissions and
21 limitations under the License.
24 <modulesynopsis metafile="mod_proxy_fcgi.xml.meta">
26 <name>mod_proxy_fcgi</name>
27 <description>Module fournissant le support de FastCGI à
28 <module>mod_proxy</module></description>
29 <status>Extension</status>
30 <sourcefile>mod_proxy_fcgi.c</sourcefile>
31 <identifier>proxy_fcgi_module</identifier>
32 <compatibility>Disponible depuis la version 2.3 d'Apache</compatibility>
35 <p>Pour fonctionner, ce module <em>nécessite</em> le chargement de
36 <module>mod_proxy</module>. Il fournit le support du protocole <a
37 href="http://www.fastcgi.com/">FastCGI</a>.</p>
39 <p>Ainsi, pour pouvoir traiter le protocole <code>FastCGI</code>,
40 <module>mod_proxy</module> et <module>mod_proxy_fcgi</module>
41 doivent être chargés dans le serveur.</p>
43 <p>A la différence de <a
44 href="http://httpd.apache.org/mod_fcgid/">mod_fcgid</a> et <a
45 href="http://www.fastcgi.com/">mod_fastcgi</a>,
46 <module>mod_proxy_fcgi</module> n'est pas en mesure de démarrer le
47 processus de l'application ; <program>fcgistarter</program> est
48 fourni à cet effet sur certaines plateformes. Le framework
49 applicatif FastCGI utilisé peut aussi fournir la gestion des
50 processus ou des lancements de programmes externes.</p>
52 <note type="warning"><title>Avertissement</title>
53 <p>N'activez pas la fonctionnalité de mandataire avant d'avoir <a
54 href="mod_proxy.html#access">sécurisé votre serveur</a>. Les
55 serveurs mandataires ouverts sont dangereux non seulement pour
56 votre réseau, mais aussi pour l'Internet au sens large.</p>
60 <seealso><program>fcgistarter</program></seealso>
61 <seealso><module>mod_proxy</module></seealso>
62 <seealso><module>mod_authnz_fcgi</module></seealso>
64 <section id="examples"><title>Exemples</title>
65 <p>Pour que ces exemples fonctionnent, vous ne devez pas oublier
66 d'activer <module>mod_proxy</module> et
67 <module>mod_proxy_fcgi</module>.</p>
69 <example><title>Instance d'application unique</title>
70 <highlight language="config">
71 ProxyPass "/mon_appli/" "fcgi://localhost:4000/"
76 <p><module>mod_proxy_fcgi</module> interdisant par défaut la
77 réutilisation des connexions, lorsqu'une requête a été traitée, la
78 connexion ne sera pas maintenue ouverte par le processus enfant
79 httpd, et ne sera donc pas réutilisée. Cependant, si l'application
80 FastCGI supporte les connexions httpd simultanées, vous pouvez opter
81 pour la réutilisation des connexions comme dans l'exemple suivant :</p>
83 <example><title>Instance d'application unique, réutilisation
84 des connexions (versions 2.4.11 et supérieures)</title>
85 <highlight language="config">
86 ProxyPass "/myapp/" "fcgi://localhost:4000/" enablereuse=on
90 <note><title>Active la réutilisation des connexions vers un serveur FCGI
91 d'arrière-plan tel que PHP-FPM</title>
92 <p>Il faut garder à l'esprit que PHP-FPM (en février 2018) utilise un modèle
93 du style prefork ; autrement dit, chacun de ses processus de travail ne peut
94 gérer qu'une connexion à la fois.<br /> Par défaut, lorsqu'il est configuré
95 avec <code>enablereuse=on</code> et lorsqu'un MPM à base de threads est
96 utilisé (comme <module>worker</module> ou <module>event</module>), mod_proxy
97 autorise un jeu de <directive
98 module="mpm_common">ThreadsPerChild</directive> connexions vers le serveur
99 d'arrière-plan pour chaque processus httpd, et par conséquent, il faut
100 prêter une attention particulière aux situations suivantes :</p>
102 <li>Avec une charge en HTTP/1, il est fort probable que le nombre de
103 connexions vers le serveur FCGI d'arrière-plan augmente jusqu'à atteindre
104 <directive module="mpm_common">MaxRequestWorkers</directive>.</li>
105 <li>Avec une charge en HTTP/2, et vue la manière dont
106 <module>mod_http2</module> est implémenté, il y a des threads de travail
107 h2 additionnels qui peuvent forcer la création de connexions
108 supplémentaires vers le serveur d'arrière-plan. Le nombre total de
109 connexions que contiennent les jeux de connexions peut alors dépasser
110 <directive module="mpm_common">MaxRequestWorkers</directive>.</li>
112 <p>Le nombre maximum de processus de travail PHP-FPM doit être défini
113 judicieusement car il est possible qu'ils finissent par rester dans l'état
114 occupé ("busy") pour ne gérer que des connexions persistantes inactives,
115 sans avoir la possibilité d'en établir de nouvelles ; ce qui se traduira
116 pour l'utilisateur final par une pile de "HTTP request timeouts".</p>
119 <p>Dans l'exemple suivant, l'URI de la requête est transmis en tant
120 que chemin du système de fichiers pour l'exécution du démon PHP-FPM.
121 L'URL de la requête est implicitement ajoutée au second paramètre.
122 PHP-FPM est à l'écoute de l'hôte et du port qui
123 suivent fcgi://. La conservation/réutilisation des connexions est activée.</p>
124 <example><title>PHP-FPM</title>
125 <highlight language="config">
126 ProxyPassMatch "^/myapp/.*\.php(/.*)?$" "fcgi://localhost:9000/var/www/" enablereuse=on
130 <p>Dans l'exemple suivant, l'URI de la requête est transmis en tant
131 que chemin du système de fichiers pour l'exécution du démon PHP-FPM.
132 Dans ce cas cependant, PHP-FPM est à l'écoute d'un socket de domaine
133 unix (UDS). Cette fonctionnalité est disponible à partir de la
134 version 2.4.9. Avec cette syntaxe, si un nom d'hôte et un port sont
135 ajoutés après fcgi://, ils seront ignorés.</p>
136 <example><title>PHP-FPM with UDS</title>
137 <highlight language="config">
138 ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php5-fpm.sock|fcgi://localhost/var/www/"
142 <p>Dans l'exemple suivant, on force le module à traiter les paquets de
143 données en provenance du serveur FCGI d'arrière-plan dès leur réception, sans les
144 faire transiter par un tampon.
146 <example><title>Force le traitement des données FCGI sans mise en tampon</title>
147 <highlight language="config">
148 ProxyPassMatch "^/myapp/.*\.php(/.*)?$" "fcgi://localhost:9000/var/www/" enablereuse=on flushpackets=on
152 <p>L'exemple suivant est similaire au précédent avec une différence : ici,
153 les données en provenance du serveur FCGI d'arrière-plan sont traitées après un
154 temps de valeur fixe (elles sont mises en tampon). Cette méthode est
155 utile si le serveur FCGI d'arrière-plan envoie ses données sous forme
156 de petits paquets, auquel cas le traitement immédiat de chacun d'entre eux
157 serait inefficace et couteux en ressources. Notez que cet exemple ne sera
158 peut-être pas adapté dans le cas où l'envoi de paquets de données par
159 l'application FCGI est bloqué par l'attente de données en provenance du
162 <example><title>Force le traitement des données FCGI après une mise en
163 tampon de 20ms</title>
164 <highlight language="config">
165 ProxyPassMatch "^/myapp/.*\.php(/.*)?$" "fcgi://localhost:9000/var/www/" flushpackets=on flushwait=20
169 <p>La passerelle à répartition de charge nécessite le chargement du
170 module <module>mod_proxy_balancer</module> et d'au moins un module
171 fournissant un algorithme de répartition de charge, comme
172 <module>mod_lbmethod_byrequests</module> en plus des modules
173 déjà cités. <module>mod_lbmethod_byrequests</module> est le module
174 par défaut et sera utilisé dans cet exemple de configuration.</p>
176 <example><title>Passerelle à répartition de charge vers plusieurs
177 instances de l'application</title>
178 <highlight language="config">
179 ProxyPass "/myapp/" "balancer://myappcluster/"
180 <Proxy "balancer://myappcluster/">
181 BalancerMember "fcgi://localhost:4000"
182 BalancerMember "fcgi://localhost:4001"
187 <p>Vous pouvez aussi forcer le traitement d'une requête en tant que
188 requête de mandataire inverse en créant un court-circuiteur de
189 gestionnaire approprié. Dans l'exemple ci-dessous, toutes les
190 requêtes pour des scripts PHP seront transmises au serveur FastCGI
191 spécifié par mandat inverse. Cette fonctionnalité est disponible à
192 partir de la version 2.4.10 du serveur HTTP Apache. Pour des raisons
193 de performances, il est recommandé de définir un <a
194 href="mod_proxy.html#workers">worker (configuration d'un
195 mandataire)</a> représentant le même serveur fcgi:// d'arrière-plan.
196 Avec cette configuration, il est possible d'effectuer une
197 correspondance directe entre l'URI et le chemin du fichier sur le
198 serveur, et le chemin local du fichier sera alors transmis au serveur
199 d'arrière-plan. Lorsque FastCGI est configuré ainsi, le serveur est
200 en mesure de calculer le PATH_INFO le plus approprié.
202 <example><title>Mandataire via un gestionnaire</title>
203 <highlight language="config">
204 <FilesMatch "\.php$">
205 # Note : la seule partie variable est /path/to/app.sock
206 SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
208 # Définition d'une configuration de mandataire qui convient.
209 # La partie qui est mise en correspondance avec la valeur de
210 # SetHandler est la partie qui suit le "pipe". Si vous devez faire
211 # une distinction, "localhost" peut être changé en un nom de serveur
213 <Proxy "fcgi://localhost/" enablereuse=on max=10>
216 <FilesMatch ...>
217 SetHandler "proxy:fcgi://localhost:9000"
220 <FilesMatch ...>
221 SetHandler "proxy:balancer://myappcluster/"
227 <section id="env"><title>Variables d'environnement</title>
228 <p>En plus des directives de configuration qui contrôlent le
229 comportement de <module>mod_proxy</module>, de nombreuses
230 <dfn>variables d'environnement</dfn> permettent de piloter le
231 fournisseur du protocole FCGI :</p>
233 <dt>proxy-fcgi-pathinfo</dt>
234 <dd>Lorsqu'il est configuré via les directives <directive
235 module="mod_proxy">ProxyPass</directive> ou <directive
236 module="mod_proxy">ProxyPassMatch</directive>,
237 <module>mod_proxy_fcgi</module> ne définit pas la variable
238 d'environnement <var>PATH_INFO</var>,
239 ce qui permet au serveur FCGI d'arrière-plan de déterminer
240 correctement <var>SCRIPT_NAME</var> et <var>Script-URI</var>, et
241 de se conformer à la section 3.3 de la RFC 3875. Si au contraire
242 vous avez souhaitez que <module>mod_proxy_fcgi</module> génère une
243 "estimation la plus exacte possible" de <var>PATH_INFO</var>,
244 définissez la variable d'environnement
245 <var>proxy-fcgi-pathinfo</var>. Ceci peut servir de
246 contournement pour une bogue présente dans certaines
247 implémentations de FCGI. Cette variable peut être
248 multivaluée afin de pouvoir choisir la valeur la plus appropriée
249 (versions 2.4.11 et supérieures) :
252 <dd>PATH_INFO est extrait à partir du slash qui suit le
253 <em>premier</em> "." de l'URL.</dd>
255 <dd>PATH_INFO est extrait à partir du slash qui suit le
256 <em>dernier</em> "." de l'URL.</dd>
258 <dd>PATH_INFO est calculé en supposant que l'URL correspond au
259 chemin du système de fichiers.</dd>
261 <dd>PATH_INFO correspond à la partie chemin de l'URL avec ses
262 séquences d'échappement décodées.</dd>
263 <dt>toute autre valeur</dt>
264 <dd>PATH_INFO correspond à la partie chemin de l'URL.
265 Auparavant, c'était la seule option pour proxy-fcgi-pathinfo.</dd>
272 <name>ProxyFCGIBackendType</name>
273 <description>Spécifie le type de l'application FastCGI d'arrière-plan</description>
274 <syntax>ProxyFCGIBackendType FPM|GENERIC</syntax>
275 <default>ProxyFCGIBackendType FPM</default>
276 <contextlist><context>server config</context>
277 <context>virtual host</context><context>directory</context>
278 <context>.htaccess</context></contextlist>
279 <override>FileInfo</override>
280 <compatibility>Disponible à partir de la version 2.4.26 du serveur HTTP Apache</compatibility>
283 <p>Cette directive permet de spécifier le type de l'application FastCGI
284 d'arrière-plan. Certains serveurs FastCGI, comme PHP-FPM, utilisent de manière
285 historique des variables d'environnement exotiques pour identifier le type du
286 serveur mandataire utilisé. Définissez cette directive à "GENERIC" si votre
287 application n'est pas de type PHP-FPM et n'interpréter pas correctement des
288 variables d'environnement comme SCRIPT_FILENAME ou PATH_TRANSLATED telles
289 qu'elles sont définies par le serveur.</p>
291 <p>SCRIPT_FILENAME est un exemple de valeur modifiée par la définition de cette
292 directive. Historiquement, lorsqu'on utilisait le module
293 <module>mod_proxy_fcgi</module>, SCRIPT_FILENAME était préfixé par la chaîne
294 "proxy:fcgi://". C'est cette variable que lisent certaines applications FastCGI
295 génériques en tant que valeur en entrée pour leur script ; cependant, PHP-FPM
296 peut supprimer le préfixe, puis garder en mémoire qu'il communique avec Apache.
297 Avec les versions 2.4.21 à 2.4.25, ce préfixe était automatiquement supprimé par
298 le serveur, empêchant ainsi PHP-FPM de détecter et interopérer avec Apache dans
299 certains scénarios.</p>
304 <name>ProxyFCGISetEnvIf</name>
305 <description>Permet d'adapter la valeur des variables envoyées aux serveurs
306 FastCGI</description>
307 <syntax>ProxyFCGISetEnvIf <var>conditional-expression</var>
308 [!]<var>environment-variable-name</var>
309 [<var>value-expression</var>]</syntax>
310 <contextlist><context>server config</context>
311 <context>virtual host</context><context>directory</context>
312 <context>.htaccess</context></contextlist>
313 <override>FileInfo</override>
314 <compatibility>Disponible à partir de la version 2.4.26 du serveur HTTP Apache.</compatibility>
317 <p>Juste avant la transmission d'une requête au serveur FastCGI configuré, le
318 coeur du programme du serveur web définit un certain nombre de variables
319 d'environnement en fonction de certains détails de la requête considérée. Les
320 programmes FastCGI utilisent souvent ces variables comme données en entrée afin
321 de déterminer quels scripts sous-jacents ils vont exécuter, ou quelles données
322 en sortie doivent être produites.</p>
323 <p>Voici quelques exemples de variables d'environnement importantes :</p>
326 <li>SCRIPT_FILENAME</li>
329 <li>PATH_TRANSLATED</li>
332 <p>Cette directive permet de passer outre les variables d'environnement
333 ci-dessus, entre autres. Elle est évaluée après la définition de la valeur
334 initiale de ces variables ; elle peuvent donc être utilisées comme entrées dans
335 les expressions définissants les conditions et les valeurs.</p>
336 <p>Syntaxe des paramètres :</p>
338 <dt>conditional-expression</dt>
339 <dd>Définit une condition en fonction de laquelle la
340 variable d'environnement qui suit sera modifiée ou non. Pour la syntaxe de cette
341 expression, reportez-vous aux exemples qui suivent ou à la spécification
342 détaillée dans le document <a href="../expr.html">ap_expr</a>.
344 <dt>environment-variable-name</dt>
345 <dd>Spécifie le nom de la variable d'environnement à modifier, par exemple
346 PATH_INFO. Si elle est précédée d'un point d'exclamation, la définition de la
347 variable sera annulée.</dd>
348 <dt>value-expression</dt>
349 <dd>Spécifie la nouvelle valeur de la variable "environment-variable-name". On
351 références arrières, comme "$1", issues de captures en provenance de
352 l'expression rationnelle <var>conditional-expression</var>. Si cette valeur est
353 omise, la variable est définie (ou sa valeur est écrasée) par une chaîne vide
354 — voir cependant la note ci-après.</dd>
358 <highlight language="config">
359 # Une modification basique, inconditionnelle
360 ProxyFCGISetEnvIf "true" PATH_INFO "/example"
362 # Utilisation d'une variable d'environnement pour spécifier la nouvelle valeur
363 ProxyFCGISetEnvIf "true" PATH_INFO "%{reqenv:SCRIPT_NAME}"
365 # Utilisation de captures dans la condition et de références arrières dans la
367 ProxyFCGISetEnvIf "reqenv('PATH_TRANSLATED') =~ m#(/.*prefix)(\d+)(.*)#" PATH_TRANSLATED "$1$3"
371 <note><title>Note : Annulation définition ou valeur vide</title>
372 La ligne suivante annule la définition de la variable <code>VARIABLE</code>,
373 ce qui l'empêche d'être envoyée au serveur FastCGI :
375 <highlight language="config">ProxyFCGISetEnvIf true !VARIABLE</highlight>
377 La ligne suivante, quant à elle, efface la <em>valeur</em> de la variable
378 <code>VARIABLE</code> en lui affectant la chaîne vide ; cette variable
379 <code>VARIABLE</code> sera alors tout de même envoyée au serveur FastCGI :
381 <highlight language="config">ProxyFCGISetEnvIf true VARIABLE</highlight>
383 La spécification CGI/1.1 <a
384 href="https://tools.ietf.org/html/rfc3875#section-4.1">ne fait pas de
385 distinction</a> entre une variable contenant une chaîne vide et une variable qui
386 n'existe pas. De nombreuses implémentations CGI et FastCGI font cependant
387 cette distinction (ou permettent aux scripts de la faire). Le choix de celle
388 que vous allez utiliser dépend de votre implémentation et de la raison qui
389 vous pousse à modifier cette variable.