Servire file statici con nginx su NFS?


9

Ho un sito Web che riceve circa 7k richieste al secondo su un server nginx. Questo server gestisce sia le riscritture su un server Apache che serve direttamente file statici, immagini, ecc. I file statici sono la parte più grande con circa 5k richieste.

Con un aggiornamento dell'architettura, penso all'utilizzo di un file server centrale che esporta una directory contenente questi file statici tramite NFS. Non ci sarà accesso in scrittura a questi file, quindi la directory potrebbe essere montata in sola lettura sulla macchina nginx. La mia preoccupazione principale è:

NFS è abbastanza veloce per questo? Esiste un limite al numero di richieste che NFS può gestire? Ci sono alcune opzioni "indispensabili" quando vai in questo modo?

Bonus: ci sono altre alternative per questa configurazione oltre a NFS?

Grazie!


Nessun accesso in lettura o "solo" accesso in lettura?
pauska,

Grazie! Solo accesso in lettura, nessun accesso in scrittura.
j0nes,

2
7k richieste al secondo sono ~ 6.048,00.000 richieste al giorno, se lo stai eseguendo su un singolo server NGINX noi (e le aziende che usano cluster di server per metà del carico) ci piacerebbe conoscere la tua configurazione.
Macchia il

Risposte:


2

Configurando un server NFS centrale si introduce un singolo punto di errore nella progettazione. Questo da solo dovrebbe essere un problema. Altrimenti, NFS può essere abbastanza veloce per un carico come questo. I fattori critici saranno la RAM sufficiente per memorizzare nella cache i file, le interconnessioni a bassa latenza (Gig-E o superiore) e l'ottimizzazione (meno della precedente).

Dovresti anche prendere in seria considerazione l'utilizzo di rsync o di uno strumento simile per conservare copie locali degli aggiornamenti dei file statici su ogni singolo server web. Un'altra opzione potrebbe essere una SAN o una soluzione server NFS ridondante (entrambe saranno molto più complicate e costose dell'idea rsync).


2
NFS non deve essere uno SPoF
gWaldo

@gWaldo Come si può impostare esattamente "un server NFS centrale" e non essere SPoF?
Chris S,

Lo fai rendendoti conto che, come hai detto, un server NFS centrale è un SPoF e invece scegli di implementare un cluster NFS. In realtà non sono in disaccordo con te ....
gWaldo,

Grazie - accettando questa soluzione perché penso che seguirò la strada rsync, evitando il punto singolo di fallimento (che dovrebbe essere la mia principale preoccupazione).
j0nes,

È abbastanza semplice implementare un server NFS replicato a doppia disponibilità ad alta disponibilità usando GlusterFS e CTDB. In termini di prestazioni, il mio cluster riceveva circa 10k richieste al secondo e si sta rompendo bene. L'unico problema è che i server NFS avranno bisogno di molta RAM.
Alpha01

2

Uso cachefilesd (e un kernel Linux recente, con cachefs) per memorizzare nella cache i file NFS su un HD locale. In questo modo, ogni lettura in nfs copierà il file in una directory / var / cache / fs e le letture successive verranno consegnate da lì, con il kernel che controlla in nfs se il contenuto è ancora valido.

In questo modo puoi avere un NFS centrale, ma senza perdere le prestazioni dei file locali

Cachefilesd si occuperà della pulizia dei vecchi file quando le dimensioni / gli inode liberi raggiungono un livello configurato, in modo da poter servire dati non comuni dall'NFS e richieste comuni dall'HD

Naturalmente, usa anche una vernice per memorizzare nella cache le richieste più comuni e salvare quindi nginx / NFS.

Ecco un piccolo file cached howto


1

La velocità dipende da molti fattori:

  • In che modo i tuoi server saranno connessi al target NFS? Un singolo disco SAS a doppia porta può utilizzare 6 gbit / s di velocità di trasferimento. Tienilo a mente se stai pianificando di utilizzare 1gig Ethernet (da cui puoi sottrarre il 20% di spese generali TCP).
  • Che tipo di cache otterrà il server NFS? Stai utilizzando un controller di array di livello enterprise con molta cache? La cache di lettura è fondamentale in questa configurazione
  • Quanti server accederanno allo stesso file contemporaneamente? Il blocco NFS può danneggiare - gravemente

Il limite di file aperti tramite NFS è una limitazione del sistema operativo host. Ad esempio FreeBSD ha molte diverse opzioni di ottimizzazione per supportare un gran numero di file aperti, ma dipende dalla quantità di RAM nel tuo server.

Un'alternativa a un file server centrale è utilizzare la sincronizzazione / replica tra i server Web (come suggerisce Chris S). rsync o DRBD potrebbe essere una scelta eccellente ed economica.


1

Vorrei sconsigliare NFS a meno che non ci si inserisca un po 'di cache. La cache di nginx è migliore di niente, ma Varnish è migliore.

Detto questo, se il tuo carico cambierà in contenuto più dinamico che statico, diventerà più importante pubblicare i file delle app dal disco locale.

Se si inserisce NFS, assicurarsi di avere ridondanza.


Ciò potrebbe richiedere un po 'di modifica dell'architettura. Oltre a utilizzare un livello di memorizzazione nella cache come Varnish, è anche una buona idea utilizzare un'installazione CDN di origine pull per tutti i file statici che saranno sulla condivisione NFS. Questo allevierà il carico che colpisce il backend NFS.
Alpha01
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.