Anpassen des Verhaltens des Discourse-Webservers mit Outlets

Zusammenfassung

Seit diesem Commit enthält die Standard-Nginx-Konfiguration für Discourse sogenannte „Outlets“ – eine unterstützte Methode, um zusätzliche Anweisungen an geeigneten Stellen in die Nginx-Konfiguration einzufügen.

Diese Änderung ermöglicht einen robusteren Ansatz zur Verwaltung der Konfiguration und des Verhaltens eines Webservers, bei dem wir uns zuvor auf relativ brüchige Such-/Ersetzungsbefehle verlassen haben.

Im Laufe der Zeit werden wir unsere eigenen Konfigurationstemplates an die Verwendung von Outlets anpassen.

Verwendung

Es gibt drei unterstützte Outlet-Abschnitte:

  • before-server: Konfigurationsanweisungen im http-Kontext
  • server: Konfigurationsanweisungen im server-Kontext
  • discourse: Konfigurationsanweisungen im location-Kontext – diese werden auf Anfragen angewendet, die an Discourse weitergeleitet werden.

Beispiele

Hier sind einige Beispiele, wie Sie diese Outlets in Ihrer app.yml-Konfigurationsdatei verwenden können, um Ziele zu erreichen.

Diese können überall dort hinzugefügt werden, wo Sie einen run- oder file-Befehl verwenden können. Meine Empfehlung ist, dies im after_code-Hook zu tun, damit der Neuaufbau schnell fehlschlagen kann, wenn die Syntax falsch ist.

Hinzufügen eines Antwort-Headers

Dieses Beispiel fügt jedem Antwort-Header hinzu, der an Discourse weitergeleitet wird:

hooks:
  after_code:
    - file:
        path: /etc/nginx/conf.d/outlets/discourse/clacks-overhead.conf
        chmod: 444
        contents: |
          add_header x-clacks-overhead "GNU Terry Pratchett";

Ergebnis:

○ → curl -I https://example.contoso.com/
HTTP/2 200 
…
x-clacks-overhead: GNU Terry Pratchett

Hinzufügen einer statischen Datei unter einem einzelnen Pfad

Dieses Beispiel fügt eine statische Datei hinzu, die von Nginx unter einem einzelnen Pfad außerhalb des normalen Discourse-Baums bereitgestellt wird.

hooks:
  after_code:
    - file:
        path: /etc/nginx/conf.d/outlets/server/well-known-important-file.conf
        chmod: 444
        contents: |
          location = /.well-known/important-file {
            default_type application/json;
            root /var/www/static/;
          }
    - file:
        path: /var/www/static/.well-known/important-file
        chmod: 444
        contents: |
          {"content-free":true}

Ergebnis:

○ → curl -i https://example.contoso.com/.well-known/important-file
HTTP/2 200 
server: nginx
date: Fri, 07 Mar 2025 23:22:38 GMT
content-type: application/json
content-length: 22
last-modified: Fri, 07 Mar 2025 23:12:08 GMT
strict-transport-security: max-age=63072000
accept-ranges: bytes

{"content-free":true}
8 „Gefällt mir“

Ich denke, ich bin wirklich aufgeregt wegen das hier, außer… Ich verstehe es nicht sehr gut. Gibt uns das zweite Beispiel eine Möglichkeit, eine statische Seite unserer Wahl zu servieren?

Genau das ist es.

Es ist keine sehr skalierbare Lösung in Bezug auf die Verwaltung des Inhalts, aber sie hat den Vorteil, dass sie einfach zu implementieren ist.

1 „Gefällt mir“

Danke Michael, zumindest habe ich genug verstanden, um herauszufinden, was los ist.

nett, danke für die Hinweise