Wie konfiguriere ich nginx, um statische Inhalte aus dem RAM bereitzustellen?

11

Ich möchte Nginx als meinen Webserver einrichten. Ich möchte, dass Bilddateien im Speicher (RAM) und nicht auf der Festplatte zwischengespeichert werden. Ich bediene eine kleine Seite und möchte, dass immer ein paar Bilder aus dem RAM geliefert werden. Ich möchte hierfür nicht Varnish (oder andere solche Tools) verwenden, da Nginx meiner Meinung nach in der Lage ist, Inhalte im RAM zwischenzuspeichern. Ich bin nicht sicher, wie ich Nginx dafür konfigurieren kann. Ich habe ein paar Kombinationen ausprobiert, aber sie haben nicht funktioniert. Nginx verwendet ständig Festplatten, um die Bilder abzurufen.

Zum Beispiel, als ich Apache Benchmark versuchte, mit folgendem Befehl zu testen:

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

Ich erhalte folgenden Fehler:

socket: Too many open files (24)

Ich denke, dies bedeutet, dass Nginx versucht, zu viele Dateien gleichzeitig von der Festplatte zu öffnen, und das Betriebssystem diesen Vorgang nicht zulässt. Kann mir bitte jemand eine korrekte Konfiguration vorschlagen?

Vijayendra
quelle
Sie raten mit ziemlicher Sicherheit falsch. Woher bekommen Sie den Fehler?
womble
@womble Wie ich unten kommentiere, könnte das Problem Parallelität sein. Es gibt viele Threads, die gleichzeitig versuchen, bevor der Inhalt im Speicher verfügbar ist. Können Sie bitte erklären, warum ich denke, dass ich es falsch errate?
Vijayendra

Antworten:

9

Wenn es sich um statischen Inhalt handelt, wird er standardmäßig im Speicher zwischengespeichert (es sei denn, es ist kein Speicher mehr vorhanden), nur nicht von Nginx, sondern vom Betriebssystem - alles, was auf der Festplatte verbleibt, ist stat ().

Wenn Sie eine 100% ige Speicherlösung wünschen, können Sie einfach die Ramdisk konfigurieren und Daten von dort bereitstellen.

c2h5oh
quelle
Ja, ich verstehe, dass Inhalte vom Betriebssystem im Speicher zwischengespeichert werden. Es wird jedoch davon ausgegangen, dass die Datei bereits im Speicher verfügbar ist. Problem könnte Parallelität sein. Es gibt viele Threads, die gleichzeitig versuchen, bevor der Inhalt aus dem Speicher verfügbar ist. Was denkst du?
Vijayendra
1
Dies ist nur dann ein Problem, wenn die Anzahl der Anforderungen sofort von 0 auf 500 steigt. Sobald die Datei gelesen wurde, wird sie dort gespeichert, bis der Speicher benötigt wird (die zuletzt verwendete Datei wird aus dem Cache entfernt, wenn der Speicher voll ist und neue Dateien benötigt werden zwischengespeichert werden). Die Chancen, dass dies im wirklichen Leben passiert, sind gering bis gar nicht. Wenn Sie sicher sind, dass dies ein echtes Risiko darstellt, verwenden Sie stattdessen die Ramdisk-Lösung. Stellen Sie einfach sicher, dass Sie die Daten auf der Ramdisk nach jedem Neustart wiederherstellen. Ramdisk ist per Definition kein dauerhafter Speicher.
c2h5oh
Ok, ich werde Ramdisk ausprobieren und sehen, wie das funktioniert. Danke für die Rückmeldung.
Vijayendra
9

Sobald der Server eine Datei von der Festplatte gelesen hat, wird sie im RAM zwischengespeichert (und durch eine andere Datei ersetzt, wenn Sie keinen RAM mehr haben). Das Problem liegt in Ihrem Kontolimit. Sie können nicht so viele Dateien öffnen ( run 'ulimit -a'),

Wenn Sie dieses Limit ändern möchten, lesen Sie mehr über /etc/security/limits.conf

Avi Keinan
quelle
1
Sie haben Recht, das Limit für offene Dateien war ein Problem, da das Limit auf meinem System 256 beträgt. Aber ich muss noch herausfinden, wie Nginx so konfiguriert wird, dass Dateien aus dem Speicher und nicht aus der Festplatte gelesen werden. Ich möchte mein Limit für geöffnete Dateien nicht ändern und möchte lieber die Cache-Nutzung für nachfolgende Anforderungen erreichen.
Vijayendra
4
"Ich möchte mein Limit für geöffnete Dateien nicht ändern" - Sie machen es falsch. Oh, so sehr, sehr falsch.
womble
3
@womble Ich verstehe, um das Problem zu beheben. Die einfachste Lösung besteht darin, das Limit zu ändern. Der Grund, warum ich dieses Limit nicht ändern möchte, ist zu sehen, was ich mit der Konfiguration am besten machen kann, ohne das Limit zu ändern. Ich denke, ich kann Dinge verbessern, indem ich einige andere Aspekte des Cachings und der Konfiguration ändere. Übrigens, können Sie bitte Gründe / Vorschläge nennen, während Sie behaupten, warum jemand falsch liegt? Schon in Ihrem ersten Kommentar haben Sie dies ohne Angabe von Gründen getan. Dies ist ein Ort, an dem Sie professionelle Vorschläge machen können. Bitte hören Sie auf, ihn als Ihre Facebook-Pinnwand zu behandeln.
Vijayendra
7

Ich weiß also, dass das wirklich alt ist, aber jetzt geht es los.

  1. Nginx führt kein sofortiges Speicher-Caching durch. Sie sollten sich dazu den Memcache ansehen. Ich würde das openresty-Paket dafür empfehlen: http://openresty.org/. Was Sie aus der Box bekommen (wie oben beantwortet wurde, ist Seiten-Cache)
  2. Ich bin mir fast sicher, dass diese Fehlermeldung von ab stammt, nicht von nginx. Nginx-Fehler für Dateilimits sehen wie folgt aus: "Fehlgeschlagen (24: Zu viele geöffnete Dateien)". Denken Sie daran, dass in Unix-Sockets auch Dateien enthalten sind. Für den Benutzer, den Sie ab ausführen, muss daher das ulimit angepasst werden, damit diese Sitzung ab ausführt. Da Sie sagten, Ihr Limit sei 256, fordern Sie ab auf, 500 Verbindungen zu verwenden. Dies maximiert Ihr Limit.
Ben Whitaker
quelle
Ben Whitaker hatte recht, das Problem kam von ab, die versuchen, 500 Sockets <=> -Dateien (unter Linux OS) zu erstellen.
Bachden
2

Eine im RAM zwischengespeicherte Datei ist immer noch eine Datei!

Versuchen Sie stattdessen, das Memcached-Cache-Modul von Nginx zu verwenden. Trotzdem sind 1000 gleichzeitige Verbindungen riesig. Glauben Sie, dass dies Ihr Fall ist?

Thomas Decaux
quelle