Come configurare nginx per servire contenuti statici dalla RAM?


11

Voglio configurare Nginx come mio web server. Voglio avere i file immagine memorizzati nella memoria (RAM) piuttosto che sul disco. Sto servendo una piccola pagina e voglio alcune immagini sempre servite dalla RAM. Non desidero usare Varnish (o altri strumenti simili) per questo in quanto credo che Nginx abbia la capacità di memorizzare nella cache i contenuti nella RAM. Non sono sicuro di come posso configurare Nginx per questo? Ho provato alcune combinazioni ma non hanno funzionato. Nginx utilizza il disco continuamente per ottenere le immagini.

Ad esempio, quando ho provato il benchmark Apache per testare con il seguente comando:

ab -c 500 -n 1000 http://localhost/banner.jpg

Ottengo il seguente errore:

socket: Too many open files (24)

Immagino che questo significhi che Nginx sta provando ad aprire troppi file contemporaneamente dal disco e il sistema operativo non consente questa operazione. Qualcuno può suggerirmi una configurazione corretta?


Quasi sicuramente indovini. Inoltre, da dove viene visualizzato l'errore?
womble

@womble Come commento di seguito il problema potrebbe essere la concorrenza. Esistono molti thread che provano contemporaneamente prima che il contenuto sia disponibile in memoria. Puoi spiegare perché pensi che stia indovinando?
Vijayendra,

Risposte:


9

Se è contenuto statico, verrà memorizzato nella cache per impostazione predefinita (a meno che non rimanga memoria), non solo da nginx, ma dal sistema operativo: tutto ciò che rimarrà sul lato disco sarà stat ().

Se vuoi una soluzione di memoria al 100%, puoi semplicemente configurare ramdisk e servire i dati da lì.


Sì, capisco che i contenuti sono memorizzati nella cache dal sistema operativo. Ma il presupposto è che il file sia già disponibile in memoria. Il problema potrebbe essere la concorrenza. Esistono molti thread che provano simultaneamente prima che il contenuto sia disponibile dalla memoria. Cosa ne pensi?
Vijayendra,

1
Questo è solo un problema se il numero di richieste va da 0 a 500 in un istante: una volta letto il file verrà archiviato lì fino a quando non sarà necessaria la memoria (il file usato meno di recente viene rimosso dalla cache se la memoria è piena e il nuovo file necessita essere memorizzato nella cache). Le probabilità che ciò accada nella vita reale sono ridotte a nessuno. Se sei sicuro che sia un rischio reale, usa invece la soluzione ramdisk, assicurati di ripristinare i dati su ramdisk dopo ogni riavvio: per definizione ramdisk non è un archivio permanente.
c2h5oh,

Ok, proverò ramdisk e vedrò come funziona. Grazie per il feedback.
Vijayendra,

9

Una volta che il server ha letto un file dal disco, verrà memorizzato nella cache di ram (e verrà sostituito da un file diverso se non si è ram), il problema è con il limite dell'account, non è possibile aprire così tanti file ( eseguire 'ulimit -a'),

Se vuoi cambiare questo limite - leggi su /etc/security/limits.conf


1
Hai ragione, il limite del file aperto è stato un problema in quanto il limite è 256 sul mio sistema. Ma devo ancora capire come configurare Nginx per leggere i file dalla memoria anziché dal disco. Non desidero modificare il mio limite di file aperto e piuttosto desidero ottenere l'utilizzo della cache per le richieste successive.
Vijayendra,

4
"Non desidero modificare il mio limite di file aperto" - stai sbagliando. Oh, molto, molto sbagliato.
womble

3
@womble Ho capito che per risolvere il problema la soluzione più semplice è cambiare il limite. Il motivo per cui non voglio cambiare questo limite è vedere cosa posso fare meglio con la configurazione senza cambiare il limite. Credo di poter migliorare le cose cambiando alcuni altri aspetti della memorizzazione nella cache e della configurazione. E a proposito, puoi per favore darti ragioni / suggerimenti mentre asserisci perché qualcuno ha torto. Anche nel tuo primo commento hai fatto questo senza fornire alcuna motivazione. Questo è un posto dove dare suggerimenti professionali, per favore smetti di trattarlo come la tua bacheca di Facebook.
Vijayendra,

7

So che questo è davvero vecchio ma, ecco qui.

  1. Nginx non esegue il caching della memoria per impostazione predefinita, ti consigliamo di consultare memcache per questo, consiglierei il pacchetto openresty per questo: http://openresty.org/. Quello che fai uscire dalla scatola (come è stato risposto sopra è la cache della pagina)
  2. Quel messaggio di errore, ne sono quasi certo, proviene da ab non da nginx, gli errori nginx per i limiti dei file sembrano così "non riusciti (24: troppi file aperti)". Ricorda che nei socket unix sono presenti anche file, quindi per l'utente su cui stai eseguendo ab as, devi aver regolato il suo ulimit affinché quella sessione esegua ab. Dal momento che hai detto che il tuo limite era 256, stai chiedendo ad ab di utilizzare 500 connessioni, questo sta massimizzando il tuo limite.

Ben Whitaker aveva ragione, il problema proveniva da ab, che tentava di creare 500 file socket <=> (in Linux OS).
bachden

2

Un file memorizzato nella RAM è ancora un file!

Prova invece a utilizzare il modulo cache Memcached di Nginx. Tuttavia, 1000 connessioni simultanee sono enormi, pensi che sia il tuo caso?

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.