Das Ausführen von 2 Hosts hinter haproxy schlägt mit zufälligen 404-Fehlern fehl

Heute habe ich versucht, einen zweiten Server hinzuzufügen, um eine unserer Discourse-Instanzen zu hosten. Der Container ist so konfiguriert, dass er externe Redis-, PostgreSQL- und Storage-Server verwendet – er dient nur als Webanwendung. Bisher haben wir die einzelnen Server-Sites ohne Probleme hinter HAProxy betrieben. Wenn wir mit zwei Servern hinter HAProxy laufen, sehen wir eine ganze Reihe von 404-Fehlern von nginx für JS-Dateien. Das Entfernen eines der Server aus HAProxy löst das Problem. Die URLs der Dateien, die 404 zurückgeben, scheinen identisch zu sein, daher bin ich ratlos, warum sie nicht von einem der Server ausgeliefert werden.

Es gibt keine Überschreibungen in den Entwicklereinstellungen. Wir verwenden Version 2.4.3 stabil.

Wenn Sie mehr als einen Web-Container betreiben, benötigen Sie eine Lösung, die sicherstellt, dass beide auf die statischen Dateien zugreifen können.

Der einfachste Weg ist Verwendung von Objektspeicher für Uploads (S3-Klone).

@Falco Hi, danke für die Antwort. Die beiden Server nutzen eine gemeinsame Speicherung über NFS. In meiner Container-Konfiguration habe ich Folgendes:

volumes:
  - volume:
      host: {{ discourse_nas_path }}/data
      guest: /shared
  - volume:
      host: {{ discourse_nas_path }}/logs
      guest: /var/log

Jeder Container speichert jedoch seine eigenen Kopien der Assets, die durch den Schritt assets:precompile generiert werden. Ist es erforderlich, die vorkompilierten Assets zu teilen?

Was hast du neben dem Hinzufügen und Entfernen von Backends in HAProxy noch getestet?

Ist deine HAProxy-Konfiguration so eingestellt, dass sie Backends zufällig auswählt oder eine Affinität verwendet? Wird der 404-Fehler von HAProxy protokolliert? Wird er von nginx protokolliert? Ist das erste oder zweite Backend fehlerhaft? Erfordert deine Website eine Anmeldung? Kannst du die Fehler reproduzieren, wenn du dich direkt von hinter dem Proxy-Server mit nginx verbindest? Existieren die angeforderten Dateien auf der Festplatte? Betrifft es alle JS-Dateien oder nur bestimmte?

Dank des Hinweises von @Falco habe ich versucht, Folgendes zu meiner Container-Konfiguration hinzuzufügen, und jetzt funktioniert alles wie erwartet:

  - volume:
      host: {{ discourse_nas_path }}/assets
      guest: /var/www/discourse/public/assets