Vous ne voulez probablement pas simplement utiliser :
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
Cette configuration n’est correcte que si les deux conditions suivantes sont remplies :
- HAProxy envoie effectivement le protocole PROXY vers le conteneur Discourse.
- Nginx, à l’intérieur du conteneur Discourse, voit HAProxy comme
127.0.0.1.
Dans de nombreuses configurations Docker HAProxy → Discourse, l’approche plus simple et plus courante consiste à utiliser X-Forwarded-For, et non le protocole PROXY.
Pour HAProxy, assurez-vous qu’il envoie l’en-tête d’IP transférée :
defaults
mode http
option httplog
option forwardfor
ou dans la section backend :
backend be_discourse
option forwardfor
server app 127.0.0.1:8080 check
Ensuite, dans la configuration du conteneur Discourse, appliquez les modifications de l’IP réelle de Nginx via app.yml. Ne modifiez pas les fichiers directement à l’intérieur du conteneur en cours d’exécution, car ces modifications seront perdues lors d’une reconstruction.
Ajoutez quelque chose comme ceci dans /var/discourse/containers/app.yml, sous la section run: existante :
run:
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: "types {"
to: |
set_real_ip_from 127.0.0.1;
# ajustez ceci à la plage réelle du pont/réseau Docker depuis laquelle HAProxy se connecte
set_real_ip_from 172.17.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
types {
Puis reconstruisez le conteneur :
cd /var/discourse
./launcher rebuild app
Il est possible que vous deviez ajuster set_real_ip_from pour qu’il corresponde à l’IP/plage source réelle que Nginx, à l’intérieur du conteneur Discourse, voit lorsque HAProxy se connecte. Avec Docker, il s’agit souvent non pas de 127.0.0.1, mais d’une adresse de pont Docker telle que 172.17.0.1 ou d’une plage de réseau Docker définie par l’utilisateur.
Si vous souhaitez vraiment utiliser le protocole PROXY, HAProxy doit explicitement l’envoyer :
backend be_discourse
server app 127.0.0.1:8080 check send-proxy
et Nginx doit écouter avec proxy_protocol, et non simplement lire real_ip_header proxy_protocol :
run:
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: "listen 80;"
to: "listen 80 proxy_protocol;"
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: "types {"
to: |
set_real_ip_from 127.0.0.1;
set_real_ip_from 172.17.0.0/16;
real_ip_header proxy_protocol;
types {
La correction importante est la suivante : real_ip_header proxy_protocol seul est incomplet. Nginx a également besoin de listen 80 proxy_protocol;, et HAProxy doit utiliser send-proxy. Sinon, utilisez X-Forwarded-For, qui est la configuration standard pour le mode HTTP d’HAProxy. Dans HAProxy, option forwardfor est la méthode standard pour ajouter l’en-tête d’IP client X-Forwarded-For. Avec le protocole PROXY de Nginx, la directive listen doit inclure proxy_protocol avant que real_ip_header proxy_protocol puisse fonctionner.
En résumé :
- Utilisez
X-Forwarded-For sauf si vous avez une raison spécifique d’utiliser le protocole PROXY.
- Ne mélangez pas les deux modes.
- Si HAProxy n’utilise pas
send-proxy, alors real_ip_header proxy_protocol ne fonctionnera pas.
- Si vous utilisez Discourse Docker, apportez la modification dans
app.yml, et non directement à l’intérieur du conteneur en cours d’exécution.