Wahrscheinlich möchten Sie nicht nur Folgendes verwenden:
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
Das ist nur korrekt, wenn beide der folgenden Bedingungen zutreffen:
- HAProxy sendet tatsächlich das PROXY-Protokoll an den Discourse-Container.
- Nginx innerhalb des Discourse-Containers sieht HAProxy als
127.0.0.1.
In vielen HAProxy → Discourse Docker-Setups ist der einfachere und häufigere Ansatz die Verwendung von X-Forwarded-For, nicht des PROXY-Protokolls.
Für HAProxy stellen Sie sicher, dass es den weitergeleiteten IP-Header sendet:
defaults
mode http
option httplog
option forwardfor
```\n
oder im Backend:
```haproxy
backend be_discourse
option forwardfor
server app 127.0.0.1:8080 check
Dann passen Sie in der Discourse-Container-Konfiguration die Nginx-Real-IP-Einstellungen über app.yml an. Bearbeiten Sie keine Dateien direkt im laufenden Container, da diese beim erneuten Aufbau verloren gehen.
Fügen Sie etwas wie Folgendes in /var/discourse/containers/app.yml unter dem vorhandenen run:-Abschnitt hinzu:
run:
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: "types {"
to: |
set_real_ip_from 127.0.0.1;
# passen Sie dies an den tatsächlichen Docker-Brücken-/Netzwerkbereich an, von dem HAProxy verbindet
set_real_ip_from 172.17.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
types {
Dann bauen Sie neu auf:
cd /var/discourse
./launcher rebuild app
Sie müssen möglicherweise set_real_ip_from an die tatsächliche Quell-IP/den -Bereich anpassen, den Nginx innerhalb des Discourse-Containers sieht, wenn HAProxy eine Verbindung herstellt. Bei Docker ist dies oft nicht 127.0.0.1; es kann sich um eine Docker-Brücken-Adresse wie 172.17.0.1 oder einen benutzerdefinierten Docker-Netzwerkbereich handeln.
Wenn Sie wirklich das PROXY-Protokoll verwenden möchten, muss HAProxy es explizit senden:
backend be_discourse
server app 127.0.0.1:8080 check send-proxy
und Nginx muss mit proxy_protocol hören, nicht nur real_ip_header proxy_protocol lesen:
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 {
Die wichtige Korrektur lautet: real_ip_header proxy_protocol allein ist unvollständig. Nginx benötigt auch listen 80 proxy_protocol;, und HAProxy benötigt send-proxy. Andernfalls verwenden Sie X-Forwarded-For, was die übliche HAProxy-HTTP-Modus-Konfiguration ist. In HAProxy ist option forwardfor der Standardweg, um den X-Forwarded-For-Client-IP-Header hinzuzufügen. Bei Nginx mit PROXY-Protokoll muss die listen-Direktive proxy_protocol enthalten, bevor real_ip_header proxy_protocol funktioniert.
Die Kurzversion lautet also:
- Verwenden Sie
X-Forwarded-For, es sei denn, Sie haben einen spezifischen Grund, das PROXY-Protokoll zu verwenden.
- Mischen Sie die beiden Modi nicht.
- Wenn HAProxy
send-proxy nicht verwendet, funktioniert real_ip_header proxy_protocol nicht.
- Wenn Sie Discourse Docker verwenden, nehmen Sie die Änderung in
app.yml vor, nicht direkt im laufenden Container.