HTTPS funktioniert einwandfrei, aber die HTTP-URL zeigt die NGINX-Willkommensseite an und leitet nicht weiter

Ich habe kürzlich Discourse auf einem Ubuntu Focal Fossa VPS installiert, und es funktioniert hervorragend. Allerdings habe ich Schwierigkeiten, einige URL-Sonderheiten zu beheben.

Das folgende Verhalten beobachte ich (in Safari). Ich habe bei meinem Registrar A-NAME-Einträge für @, WWW und * erstellt.

example.com [zeigt die Seite „Willkommen bei nginx!“ an] FEHLGESCHLAGEN
www.example.com [leitet auf https://example.com weiter] ERFOLGREICH
http://example.com [zeigt die Seite „Willkommen bei nginx!“ an] FEHLGESCHLAGEN
http://www.example.com [leitet auf https://example.com weiter und funktioniert einwandfrei] ERFOLGREICH
https://example.com [funktioniert wie erwartet, keine Umleitung] ERFOLGREICH
https://www.example.com [liefert die Fehlermeldung „Diese Verbindung ist nicht privat“] FEHLGESCHLAGEN

Ich möchte, dass meine Installation im Root-/Apex-Bereich läuft, daher habe ich bei der Einrichtung example.com eingegeben.

Jeglicher Rat wird sehr geschätzt!

Betreiben Sie einen externen Nginx auf dem Discourse-Server? Warum?

Discourse wird bereits mit einem vorkonfigurierten Nginx ausgeliefert, der diese Aufgabe übernimmt, sofern Sie es so einrichten, dass es auf die Ports 80 und 443 lauscht.

1 „Gefällt mir“

Hallo @Falco, danke für deine Antwort. Mir ist nichts bekannt, nein. Das Image des VPS-Anbieters heißt einfach „Focal Fossa Clean OS“, was vermutlich bedeutet, dass es keine Tools von Drittanbietern enthält.

Dies ist eine Installation direkt aus dem Kasten, wie sie im veröffentlichten „30-Minuten“-Installationsweg beschrieben wird.

sudo su

wget -qO- https://get.docker.com/ | sh

git clone https://github.com/discourse/discourse_docker.git /var/discourse

cd /var/discourse

./discourse-setup
1 „Gefällt mir“

Oh, das ist dann wirklich ein seltsames Verhalten!

Kannst du deine app.yml hier teilen (entferne dabei sensible Daten wie Passwörter)? Die Datei befindet sich unter /var/discourse/containers/app.yml.

Außerdem die Ausgabe von docker ps -a.

Gerne, danke. Könnte es Probleme geben, wenn meine Domain eine ungewöhnliche TLD hat? (Es ist eine .community).

## Dies ist die All-in-One, eigenständige Discourse Docker-Container-Vorlage
##
## Nach Änderungen an dieser Datei MÜSSEN Sie neu aufbauen
## /var/discourse/launcher rebuild app
##
## SEIEN SIE *SEHR* VORSICHTIG BEI DER BEARBEITUNG!
## YAML-DATEIEN SIND EXTREM 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 sollte dieser Container exponieren?
## Wenn Sie möchten, dass Discourse einen Port mit einem anderen Webserver wie Apache oder nginx teilt,
## siehe https://meta.discourse.org/t/17247 für Details
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Setzen Sie db_shared_buffers auf maximal 25% des gesamten Speichers.
  ## wird automatisch durch bootstrap basierend auf dem erkannten RAM gesetzt, oder Sie können überschreiben
  db_shared_buffers: "768MB"

  ## Kann die Sortierleistung verbessern, erhöht aber die Speichernutzung pro Verbindung
  #db_work_mem: "40MB"

  ## Welche Git-Revision sollte dieser Container verwenden? (Standard: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Wie viele gleichzeitige Webanfragen werden unterstützt? Hängt von Speicher und CPU-Kernen ab.
  ## wird automatisch durch bootstrap basierend auf den erkannten CPUs gesetzt, oder Sie können überschreiben
  UNICORN_WORKERS: 8

  ## TODO: Der Domainname, auf den diese Discourse-Instanz reagieren wird
  ## Erforderlich. Discourse funktioniert nicht mit einer bloßen IP-Nummer.
  DISCOURSE_HOSTNAME: example.com

  ## Kommentieren Sie dies aus, wenn Sie möchten, dass der Container mit demselben
  ## Hostnamen (-h-Option) wie oben angegeben gestartet wird (Standard: "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Liste der durch Komma getrennten E-Mails, die bei der ersten Registrierung zu Administratoren und Entwicklern gemacht werden
  ## Beispiel 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'email@gmail.com'

  ## TODO: Der SMTP-Mailserver, der zur Validierung neuer Konten und zum Senden von Benachrichtigungen verwendet wird
  # SMTP-Adresse, Benutzername und Passwort sind erforderlich
  # WARNUNG: Das Zeichen '#' im SMTP-Passwort kann Probleme verursachen!
  DISCOURSE_SMTP_ADDRESS: smtp.postmarkapp.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: username
  DISCOURSE_SMTP_PASSWORD: "password"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, Standard true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (von einigen Anbietern erforderlich)

  ## Wenn Sie die Lets Encrypt-Vorlage hinzugefügt haben, kommentieren Sie unten aus, um ein kostenloses SSL-Zertifikat zu erhalten
  LETSENCRYPT_ACCOUNT_EMAIL: email@gmail.com


  ## Die http- oder https-CDN-Adresse für diese Discourse-Instanz (konfiguriert zum Abrufen)
  ## siehe https://meta.discourse.org/t/14857 für Details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## Der Maxmind-Geolokalisierungs-IP-Schlüssel für die IP-Adressen-Nachschlage
  ## siehe https://meta.discourse.org/t/-/137387/23 für Details
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Der Docker-Container ist zustandslos; alle Daten werden in /shared gespeichert
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins gehen hier
## siehe https://meta.discourse.org/t/19157 für Details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Alle benutzerdefinierten Befehle, die nach dem Erstellen ausgeführt werden sollen
run:
  - exec: echo "Beginn der benutzerdefinierten Befehle"
  ## Wenn Sie die 'Von'-E-Mail-Adresse für Ihre erste Registrierung festlegen möchten, kommentieren Sie aus und ändern Sie:
  ## Nach Erhalt der ersten Anmelde-E-Mail diesen Kommentar entfernen. Es muss nur einmal ausgeführt werden.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Ende der benutzerdefinierten Befehle"

und

CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                      NAMES
465fbf1c3fb8   local_discourse/app   "/sbin/boot"   47 minutes ago   Up 46 minutes   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   app

Vielleicht wird diese Distribution, die Ihr Anbieter bereitstellt, mit einem vorinstallierten nginx geliefert?

Was gibt curl -I localhost aus?

HTTP/1.1 301 Moved Permanently
Server : nginx/1.18.0
Datum : Mo, 25. Jan 2021 20:18:00 GMT
Content-Type : text/html
Content-Length : 169
Connection : keep-alive
Location : https://example.com

Bedeutet das, dass es bereits installiert war? (Entschuldigung, ich bin hier noch ein Anfänger)

Das ist die erwartete Antwort, wenn alles funktioniert. Wird also auf http://example.com immer noch die Nginx-Willkommensseite angezeigt?

https://example.com funktioniert einwandfrei, aber http://example.com (HTTP) führt zur Seite Willkommen bei nginx! :sob:

Können Sie die tatsächliche Domain teilen?

Sooo, das liefert mir überhaupt nicht die nginx-Willkommensseite.

Könntest du es auf einem anderen Gerät, zum Beispiel deinem Handy, ausprobieren?

curl -I example.com -L
HTTP/1.1 301 Moved Permanently
Server: nginx/1.18.0
Date: Mon, 25 Jan 2021 20:35:21 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/

HTTP/2 200 
server: nginx
date: Mon, 25 Jan 2021 20:35:22 GMT
content-type: text/html; charset=utf-8
vary: Accept-Encoding
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
x-discourse-route: finish_installation/index
cache-control: no-cache, no-store
content-security-policy: base-uri 'none'; object-src 'none'; script-src https://example.com/logs/ https://example.com/sidekiq/ https://example.com/mini-profiler-resources/ https://example.com/assets/ https://example.com/brotli_asset/ https://example.com/extra-locales/ https://example.com/highlight-js/ https://example.com/javascripts/ https://example.com/plugins/ https://example.com/theme-javascripts/ https://example.com/svg-sprite/; worker-src 'self' https://example.com/assets/ https://example.com/brotli_asset/ https://example.com/javascripts/ https://example.com/plugins/
x-request-id: 8755d4fa-387f-4509-8709-b6075f274d09
x-runtime: 0.026020
strict-transport-security: max-age=31536000
1 „Gefällt mir“

Okay, ich bin offensichtlich ein Idiot. Ich habe es über mein Handy mit 4G getestet (um den lokalen DNS zu prüfen) – alle diese URLs funktionierten einwandfrei. Als ich mich wieder mit dem WLAN verbunden habe, funktionierte alles ebenfalls. Also habe ich daraufhin den Cache von Safari auf dem Desktop gelöscht und – schwupps – funktioniert dort auch alles.

Das muss von der Zeit stammen, als ich den Host ursprünglich getestet habe, und der Cache wurde seitdem nicht geleert. Vielen Dank für deine Hilfe beim Troubleshooting und entschuldige bitte, dass ich deine Zeit in Anspruch genommen habe.

2 „Gefällt mir“

fwiw bin ich heute auf dasselbe Problem mit Ubuntu 22.04 gestoßen. Das Leeren des Safari-Caches und das Aktualisieren haben das Problem ebenfalls behoben.