Esecuzione di 2 host dietro haproxy fallisce con 404 casuali

Oggi ho provato ad aggiungere un secondo server per ospitare una delle nostre istanze di Discourse. Il container è configurato per utilizzare server Redis, Postgres e di archiviazione esterni: si tratta solo dell’applicazione web. Fino ad ora abbiamo gestito i siti su un singolo server dietro HAProxy senza problemi. Quando eseguiamo due server dietro HAProxy, notiamo molti errori 404 da parte di nginx per i file JS. Rimuovendo uno dei due server da HAProxy il problema si risolve. Gli URL dei file che restituiscono 404 sembrano identici, quindi non capisco perché non vengano serviti da entrambi i server.

Non ci sono sovrascritture nelle impostazioni Sviluppatore. Stiamo eseguendo la versione stabile 2.4.3.

Se stai eseguendo più di un contenitore web, hai bisogno di qualcosa che garantisca l’accesso ai file statici per entrambi.

La soluzione più semplice è Utilizzare l’archiviazione oggetti per i caricamenti (cloni S3)

@Falco Ciao, grazie per la risposta. I due server utilizzano storage condiviso tramite NFS. Nella mia configurazione del container ho quanto segue:

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

Tuttavia, ogni container conserva le proprie copie delle risorse generate dallo step assets:precompile. È necessario condividere le risorse precompilate?

Oltre ad aggiungere e rimuovere backend in HAProxy, cosa hai fatto per testarlo?

La configurazione di HAProxy utilizza backend casuali o affinità? L’errore 404 viene registrato da HAProxy? Viene registrato da nginx? È il primo o il secondo backend che genera l’errore? Il tuo sito richiede il login? Riesci a riprodurre gli errori quando ti connetti direttamente a nginx dal server dietro il proxy? I file richiesti esistono sul disco? Si tratta di tutti i file JS o solo di alcuni specifici?

Grazie al suggerimento di @Falco, ho provato ad aggiungere quanto segue alla configurazione del mio container e ora tutto funziona come previsto:

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