Nginx stellt beim Lastenausgleich zwischen Docker-Containern nicht immer JS und CSS bereit – funktioniert beim Aktualisieren

Nginx stellt beim Lastenausgleich zwischen Docker-Containern nicht immer JS und CSS bereit – funktioniert beim Aktualisieren

Ich habe Nginx als Reverse-Proxy-Lastausgleich zwischen zwei Docker-Containern eingerichtet, die alle auf demselben Server laufen. Wenn ich eine Seite zum ersten Mal lade, wird sie zwar geladen, aber ich erhalte viele 404-Fehler für alle CSS- und JS-Dateien:

404-Fehler beim Laden der Seite

Beim Aktualisieren oder Öffnen eines zweiten Tabs verschwinden alle diese Fehler und die Seite wird einwandfrei geladen. Wenn ich dies auf die Bereitstellung nur eines Containers reduziere, funktioniert es ebenfalls einwandfrei.

Ich hatte zunächst gedacht, dass dies daran lag, dass JS und CSS von derselben Stamm-URL angefordert wurden und ein Aspekt der Lastverteiler und Container Fehler verursachte, da ein Cluster von Anfragen für einen einzelnen Benutzer zwischen den beiden Servern verteilt wurde. Durch ein wenig Experimentieren habe ich versucht, proxy_set_header Host $host(nach dem Aussehen)HierUndHierfür Antworten) - ich würde es so verstehen, dass die nachfolgenden Anfragen eines einzelnen Benutzers an denselben Upstream-Server gesendet werden sollten. Dadurch trat das Problem anscheinend seltener auf, wurde aber nicht vollständig behoben.

Meine restlichen Fragen (von einem Lern-Laien!):

  • Ist dies die richtige Verwendung von proxy_set_headerund ist es somit möglich, einem einzelnen Benutzer JS/CSS vom selben Upstream-Server bereitzustellen, anstatt die Last dieser relativ kleinen Anfragen auf zwei Server zu verteilen?
  • Ist dies die wahrscheinliche Ursache des Problems, dass diese Antworten irgendwie nicht übereinstimmen, weil der zweite Container auf einige der Anfragen reagieren muss, die durch das Laden der Seite für den ersten Container ausgelöst werden?
  • Meine Benutzerbasis würde aus 100-200 Benutzern bestehen, die gleichzeitig von einem einzigen Standort aus auf eine Remote-URL zugreifen. Ich glaube nicht, dass ip_hashdas funktionieren würde, da alle Anfragen von derselben IP-Adresse kommen würden? Gibt es andere Möglichkeiten, einen einzelnen Benutzer effizienter an einen einzelnen Server zu binden?

Meine Nginx-Konfigurationsdatei:

upstream backend {
        least_conn;
        server localhost:4000;
        server localhost:4001;
}

server {
        listen 80;
        listen [::]:80;

        server_name xxxxxxxxxx;

        location / {
                proxy_pass http://backend;
                proxy_redirect http://backend/ $scheme://$host/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Host $host;
                proxy_set_header Connection $connection_upgrade;
                proxy_read_timeout 20d;
                proxy_buffering off;
        }
}

verwandte Informationen