Wie kann ich die Nginx-Konfiguration direkt innerhalb von discourse/docker ändern?

Ich möchte die Nginx/Docker-Konfiguration ändern, da meine Discourse-Installation hinter HAProxy liegt. Das Problem, das ich habe, ist wie folgt:
Alle IPs, die sich mit meiner Discourse-Installation verbinden, erscheinen als HAProxy-IP-Adresse.
Ich muss die folgenden Zeilen zur Nginx-Konfigurationsdatei hinzufügen:

set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;

…um die öffentlichen IPs, die sich mit meiner Discourse-Installation verbinden, an Nginx weiterzuleiten.
Danke für Ihre Hilfe.

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:

  1. HAProxy sendet tatsächlich das PROXY-Protokoll an den Discourse-Container.
  2. 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.