Sie ist abgeschaltet. X-Forwarded-Proto ist in meinem Server-Block enthalten. Das einzige Element (bzw. die einzigen Elemente), das/die ich – basierend auf den von Ihnen geteilten Links – nicht verwende, ist Folgendes:
# Basisvorlagen, die verwendet werden; können reduziert werden, um weniger Funktionalität pro Container-Vorlage zu enthalten: # - "templates/cron.template.yml" # Cron ist jetzt im Basis-Image enthalten - "templates/postgres.template.yml" - "templates/redis.template.yml" - "templates/sshd.template.yml" - "templates/web.template.yml" # - "templates/web.ssl.template.yml" # entfernen - HTTPS wird vom äußeren Nginx behandelt - "templates/web.ratelimited.template.yml" - "templates/web.socketed.template.yml" # <-- Hinzugefügt # Welche Ports sollen freigegeben werden? # expose: gesamten Abschnitt auskommentieren
Ich habe die Site in drei Browsern geladen (Edge, Firefox und Chrome Mobile). Als Anonymer erhalte ich ein völlig legitimes Zertifikat. Wie gehen Sie vor, um dies nachzuvollziehen?
Als Benutzer anmelden. Sobald die Anmeldung erfolgreich war und ich eingeloggt bin, geht alles drunter und drüber, und ich bekomme die zuvor genannten Fehler.
Hier ist die Hölle nicht losgebrochen. Ein mögliches Problem ist, dass Ihre E-Mails immer noch den Link http:// enthalten. Allerdings wurde ich ordnungsgemäß zur HTTPS-Seite weitergeleitet, um mein Konto zu aktivieren, und ich sehe hier keine SSL-bezogenen Fehler.
Also ja, ich bin zu 99 % sicher, dass Ihre force_https-Einstellung nicht aktiviert ist oder etwas bei Ihrer Installation extrem falsch ist, was dies verursacht.
Da liegst du falsch. Wenn die Erzwingung von HTTPS aktiviert ist, muss Discourse alle Links als HTTPS ausgeben. Jeder einzelne Link, der mit dem Forum zu tun hat, muss über HTTPS geladen werden. Wenn du immer noch seltsame Dinge machst und nicht den vorgeschlagenen Weg befolgst, bist du auf dich allein gestellt. Wir können nicht über die Standardverfahren hinaus helfen, die funktionieren.
Das ergibt für mich wenig Sinn. Wenn wir das logisch aufschlüsseln, mache ich im Wesentlichen genau das, was force-https bewirken soll, nur innerhalb des server-Blocks.
force_https ist nicht nur eine Umleitung. Intern macht es mehr als das. Wenn du möchtest, dass deine Probleme behoben werden, wurde bereits eine Lösung angeboten. Wenn du die Lösung ablehnst, kannst du die Sache selbst in die Hand nehmen und neue Wege erkunden.
Das liegt an deinem instabilen Reverse-Proxy. Du musst selbst herausfinden, was falsch läuft, und die Dinge auf die richtige Art und Weise lösen. Wir können keine Unterstützung für deine eigenen Lösungen leisten.
Das hat eine ganze Reihe von Auswirkungen, die über das hinausgehen, was du gerade geschrieben hast, und die ich noch untersuchen muss – wir hätten dort anfangen können.
Unmittelbare Fragen:
In der app.yml den Standard-Listening-Port auf 8080 ändern?
Was ist mit SSL 443? Soll 443 erhalten bleiben?
Die Weiterleitung auf Port 80 aus dem Nginx-Serverblock entfernen?
Spielt Punkt 3 eine Rolle, wenn ich nur die proxy_pass-Einstellung auf der internen Seite ändere? Wahrscheinlich nicht? Ich leite ja nur auf 8080 um?
Die größte Frage: Warum? Warum sollte es einen Unterschied machen, von Port 80 auf 8080 zu wechseln?
Alle anderen Templates aktiv lassen? socketed einfach auskommentieren?
Das ist deine Präferenz. Ich habe es als Beispiel geschrieben. Du kannst auch wählen, Port 80 freizugeben.
Es gibt keinen Vorteil oder Sinn darin, SSL in einem lokalen Netzwerk zu aktivieren.
Das muss vorhanden sein.
server {
listen 80;
server_name discourse.example.com;
return 301 https://example.com$request_uri;
}
Genau das passiert. Du leitest alle Anfragen, die von deinem Proxy/Ingress empfangen werden, an einen internen Backend-Server auf Port 8080 (also Discourse) weiter.
In Punkt #1 beantwortet: Es war eine persönliche Präferenz. Du kannst gerne den Port verwenden, der dir gefällt.
Du brauchst auf dem internen Server insbesondere nichts, was mit Sockets oder SSL zu tun hat. SSL sollte ordnungsgemäß am Reverse-Proxy terminiert werden.
Hinweis: Ein Großteil davon basiert auf persönlichen Präferenzen, die sich aus der Bereitstellung für Kunden ergeben.
Das von mir beobachtete Verhalten tritt unter den oben genannten Bedingungen auf.
Der Anfang von app.yml sieht so aus:
## Dies ist die All-in-One, eigenständige Discourse Docker-Container-Vorlage ## ## Nach Änderungen an dieser Datei MUSS Sie neu gebaut werden ## /var/discourse/launcher rebuild app ## ## SEIEN SIE *SEHR* VORSICHTIG BEI DER BEARBEITUNG! ## YAML-DATEIEN SIND SUPER SUPER EMPFINDLICH GEGENÜBER FEHLERN IN LEERZEICHEN ODER AUSRICHTUNG! ## Besuchen Sie http://www.yamllint.com/, um diese Datei bei Bedarf zu validieren
templates: - "templates/postgres.template.yml" - "templates/redis.template.yml" - "templates/web.template.yml" - "templates/web.ratelimited.template.yml" ## Kommentieren Sie diese beiden Zeilen aus, wenn Sie Lets Encrypt (https) hinzufügen möchten #- "templates/web.ssl.template.yml" #- "templates/web.letsencrypt.ssl.template.yml"
## Welche TCP/IP-Ports soll dieser Container exponieren? ## Wenn Sie Discourse einen Port mit einem anderen Webserver wie Apache oder nginx teilen möchten, ## siehe https://meta.discourse.org/t/17247 für Details expose: - "80:80" # http - "443:443" # https
## Setzen Sie db_shared_buffers auf maximal 25 % des gesamten Speichers. ## Wird automatisch vom Bootstrap basierend auf dem erkannten RAM gesetzt, oder Sie können es überschreiben db_shared_buffers: "1024MB"
## Kann die Sortierleistung verbessern, erhöht jedoch den Speicherverbrauch pro Verbindung #db_work_mem: "40MB"
## Welche Git-Revision soll dieser Container verwenden? (Standard: tests-passed) #version: tests-passed
Sie verbinden sich mit Port 80 auf dem zweiten nginx, daher geht dieser davon aus, dass Sie eine HTTP-Verbindung und keine HTTPS-Verbindung herstellen.
Suchen Sie nach X-Forwarded-Proto im inneren nginx und ändern Sie proxy_set_header X-Forwarded-Proto $thescheme; in proxy_set_header X-Forwarded-Proto https;
oder leiten Sie Ihren Verkehr über HTTPS weiter: proxy_pass https://192.168.86.108