Ich habe 1Panel auf meinem VPS installiert, Discourse (Container-Deployment) eingerichtet und OpenResty (Container-Deployment) als Reverse-Proxy verwendet. Die Domain wird bei Cloudflare gehostet, und der CDN-Service (gelbe Wolke) ist aktiviert. Nachfolgend finden Sie die Lösung für das Problem, dass die Benutzer-IP-Adresse als Cloudflare-IP und nicht als die tatsächliche IP-Adresse des Browser-Benutzers angezeigt wird.
1. Erstellen Sie in 1Panel einen geplanten Task, um wöchentlich die neueste Cloudflare-IP-Liste herunterzuladen und im Konfigurationsverzeichnis von OpenResty zu speichern.
-
Klicken Sie im linken Menü von 1Panel auf “Geplante Tasks”.
-
Klicken Sie oben rechts auf “Geplanten Task erstellen”.
-
Füllen Sie die Parameter wie folgt aus (Sie können sie direkt kopieren und einfügen):
-
Task-Typ: Wählen Sie Shell-Skript.
-
Task-Name: z. B.
Automatische Aktualisierung der Cloudflare-IP-Bereiche. -
Ausführungszyklus: Es wird empfohlen, wöchentlich auszuwählen (z. B. jeden Samstag um 03:00 Uhr).
-
Skriptinhalt: Kopieren Sie den folgenden vollständigen Code direkt hinein (Hinweis: Bitte ändern Sie zuerst den Container-Namen und den Pfad zum Konfigurationsverzeichnis am Anfang des Codes):
#!/bin/bash
# Konfigurationsbereich
CONTAINER_NAME="Name des OpenResty-Containers in 1Panel"
# Ändern Sie dies in das angegebene Proxy-Verzeichnis der Website
CONF_DIR="/opt/1panel/www/sites/www.IhreDomain.club/proxy"
echo "[$(date)] Starte das Abrufen der neuesten IP-Bereiche von Cloudflare..."
TEMP_DIR=$(mktemp -d)
# IP-Liste abrufen und in ein von Nginx erkennbares Format konvertieren
curl -fsS https://www.cloudflare.com/ips-v4 | sed 's/.*/set_real_ip_from \&;/' > $TEMP_DIR/cf-ips-v4.conf
curl -fsS https://www.cloudflare.com/ips-v6 | sed 's/.*/set_real_ip_from \&;/' > $TEMP_DIR/cf-ips-v6.conf
# Dateien prüfen und verschieben
if [[ -s $TEMP_DIR/cf-ips-v4.conf ]] && [[ -s $TEMP_DIR/cf-ips-v6.conf ]]; then
mv $TEMP_DIR/cf-ips-v4.conf $CONF_DIR/
mv $TEMP_DIR/cf-ips-v6.conf $CONF_DIR/
echo "[$(date)] Konfigurationsdateien wurden erfolgreich in $CONF_DIR aktualisiert."
else
echo "[$(date)] Fehler: Das Abrufen der Cloudflare-IPs ist fehlgeschlagen!"
rm -rf $TEMP_DIR
exit 1
fi
rm -rf $TEMP_DIR
# Nginx testen und neu laden
echo "[$(date)] Nginx-Konfiguration wird getestet..."
if docker exec $CONTAINER_NAME nginx -t; then
docker exec $CONTAINER_NAME nginx -s reload
echo "[$(date)] Erfolg! OpenResty-Konfiguration wurde neu geladen."
else
echo "[$(date)] Fehler! Nginx-Konfigurationstest fehlgeschlagen."
exit 1
fi
Nachdem der Task erstellt wurde, müssen Sie nicht bis Samstag warten, um ihn zu testen: Finden Sie den gerade erstellten Task in der Liste der “Geplanten Tasks”.
Klicken Sie auf der rechten Seite auf die Schaltfläche “Bericht”. Überprüfen Sie das angezeigte Protokollfenster. Wenn die letzten Zeilen Erfolg! OpenResty-Konfiguration wurde neu geladen anzeigen, bedeutet dies, dass der gesamte Prozess innerhalb von 1Panel einwandfrei funktioniert!
2. Ergänzen Sie die realip-Konfiguration in OpenResty
Erstellen Sie im Verzeichnis /opt/1panel/www/sites/www.IhreDomain/proxy/ auf dem Host einen neuen Datei (der Dateiname kann beliebig sein, muss jedoch auf .conf enden, damit sie automatisch von der Hauptkonfiguration über include *.conf geladen wird): realip.conf
# Verwenden Sie den Pfad innerhalb des Containers
include /www/sites/www.IhreDomain/proxy/cf-ips-v4.conf;
include /www/sites/www.IhreDomain/proxy/cf-ips-v6.conf;
real_ip_header CF-Connecting-IP;
real_ip_recursive on;
3. OpenResty neu laden
docker exec Name_des_OpenResty_Containers_in_1Panel nginx -t
docker exec Name_des_OpenResty_Containers_in_1Panel nginx -s reload
4. Überprüfen, ob OpenResty die echte IP erhalten hat
Überprüfen Sie das Access-Log von OpenResty:
tail -f /opt/1panel/www/sites/www.IhreDomain/log/access.log
Wenn die Konfiguration korrekt ist, sollte die erste IP-Adresse im Protokoll Ihre echte öffentliche IP-Adresse sein und nicht ein Cloudflare-Bereich wie 173.245.x.x.
5. Discourse-Seite
Bearbeiten Sie app.yml und fügen Sie im run:-Codeblock Folgendes hinzu:
# Nach der Docker-Installation von Discourse müssen die folgenden drei Abschnitte hinzugefügt werden, um sicherzustellen, dass die echte IP des Forum-Benutzers weitergeleitet wird
- file:
path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-docker.conf
chmod: 644
contents: |
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 127.0.0.1;
- file:
path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
chmod: 644
contents: |
real_ip_header x-forwarded-for;
- file:
path: /etc/nginx/conf.d/outlets/server/real-ip-recursive.conf
chmod: 644
contents: |
real_ip_recursive on;
Dadurch wird der integrierte Nginx von Discourse:
- Das Docker-Netzwerksegment (
172.16.0.0/12) vertrauen - Die echte IP aus
x-forwarded-forlesen - Mehrere Proxy-Ebenen rekursiv auflösen
6. Anmerkungen
Das Hinzufügen von - "templates/cloudflare.template.yml" zur app.yml von Discourse ist nur wirksam, wenn Discourse direkt mit Cloudflare kommuniziert. Da hier OpenResty als Reverse-Proxy dazwischengeschaltet ist, ist die Quell-IP, die der Discourse-Container sieht, eigentlich die Docker-Gateway-IP (z. B. 172.17.0.1 oder 172.18.0.1). Daher würde set_real_ip_from <CloudflareIP> in dieser Vorlage nicht übereinstimmen.
Daher ist es nicht erforderlich, - "templates/cloudflare.template.yml" zur app.yml von Discourse hinzuzufügen.
Aktualisierung am 03.07.2026