Probablemente no quieras solo esto:
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
Esto solo es correcto si ambas de las siguientes condiciones son verdaderas:
- HAProxy realmente está enviando el protocolo PROXY al contenedor de Discourse.
- Nginx dentro del contenedor de Discourse ve a HAProxy como
127.0.0.1.
En muchas configuraciones de Docker con HAProxy → Discourse, el enfoque más simple y común es usar X-Forwarded-For, no el protocolo PROXY.
Para HAProxy, asegúrate de que envíe el encabezado de IP reenviada:
defaults
mode http
option httplog
option forwardfor
o en el backend:
backend be_discourse
option forwardfor
server app 127.0.0.1:8080 check
Luego, en la configuración del contenedor de Discourse, persiste los cambios de IP real de Nginx a través de app.yml. No edites archivos directamente dentro del contenedor en ejecución, porque se perderán al reconstruirlo.
Agrega algo como esto a /var/discourse/containers/app.yml bajo la sección existente run::
run:
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: "types {"
to: |
set_real_ip_from 127.0.0.1;
# ajusta esto a la red/puente de Docker real desde la que se conecta HAProxy
set_real_ip_from 172.17.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
types {
Luego reconstruye:
cd /var/discourse
./launcher rebuild app
Puede que necesites ajustar set_real_ip_from para que coincida con la IP/rango de origen real que ve Nginx dentro del contenedor de Discourse cuando HAProxy se conecta a él. Con Docker, esto a menudo no es 127.0.0.1; puede ser una dirección de puente de Docker como 172.17.0.1 o un rango de red de Docker definido por el usuario.
Si realmente quieres usar el protocolo PROXY en su lugar, HAProxy debe enviarlo explícitamente:
backend be_discourse
server app 127.0.0.1:8080 check send-proxy
y Nginx debe escuchar con proxy_protocol, no solo leer 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 corrección importante es: real_ip_header proxy_protocol por sí solo es incompleto. Nginx también necesita listen 80 proxy_protocol;, y HAProxy necesita send-proxy. De lo contrario, usa X-Forwarded-For, que es la configuración habitual de HAProxy en modo HTTP. En HAProxy, option forwardfor es la forma estándar de agregar el encabezado de IP del cliente X-Forwarded-For. Con el protocolo PROXY de Nginx, la directiva listen debe incluir proxy_protocol antes de que real_ip_header proxy_protocol pueda funcionar.
Así que la versión corta es:
- Usa
X-Forwarded-For a menos que tengas una razón específica para usar el protocolo PROXY.
- No mezcles los dos modos.
- Si HAProxy no está usando
send-proxy, entonces real_ip_header proxy_protocol no funcionará.
- Si usas Discourse Docker, haz el cambio en
app.yml, no directamente dentro del contenedor en ejecución.