Jak skonfigurować nginx do obsługi statycznej zawartości z pamięci RAM?

11

Chcę skonfigurować Nginx jako mój serwer WWW. Chcę, aby pliki obrazów były buforowane w pamięci (RAM), a nie na dysku. Podaję małą stronę i chcę, aby kilka obrazów zawsze było wyświetlanych z pamięci RAM. Nie chcę do tego używać Varnish (ani żadnych innych podobnych narzędzi), ponieważ uważam, że Nginx ma możliwość buforowania zawartości pamięci RAM. Nie jestem pewien, jak mogę w tym celu skonfigurować Nginx? Próbowałem kilku kombinacji, ale one nie działały. Nginx używa dysku przez cały czas, aby uzyskać obrazy.

Na przykład, gdy próbowałem testu porównawczego Apache, aby przetestować za pomocą następującego polecenia:

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

Otrzymuję następujący błąd:

socket: Too many open files (24)

Myślę, że to oznacza, że ​​Nginx próbuje otworzyć zbyt wiele plików jednocześnie z dysku, a system operacyjny nie pozwala na tę operację. Czy ktoś może zasugerować mi prawidłową konfigurację?

Vijayendra
źródło
Prawie na pewno zgadujesz źle. Ponadto, skąd bierze się błąd?
womble
@womble Jak komentuję poniżej, problemem może być współbieżność. Istnieje wiele wątków próbujących jednocześnie, zanim zawartość będzie dostępna w pamięci. Czy możesz wyjaśnić, dlaczego, jak sądzę, źle to zgaduję?
Vijayendra

Odpowiedzi:

9

Jeśli jest to zawartość statyczna, wówczas będzie domyślnie buforowana w pamięci (chyba że nie będzie już żadnej pamięci), tylko nie przez nginx, ale system operacyjny - wszystko, co pozostanie po stronie dysku, będzie stat ().

Jeśli chcesz 100% rozwiązania pamięciowego, możesz po prostu skonfigurować ramdysk i udostępniać stamtąd dane.

c2h5oh
źródło
Tak, rozumiem, że zawartość jest buforowana w pamięci przez system operacyjny. Zakłada się jednak, że plik jest już dostępny w pamięci. Problemem może być współbieżność. Istnieje wiele wątków próbujących jednocześnie, zanim zawartość będzie dostępna z pamięci. Co myślisz?
Vijayendra
1
Jest to problem tylko wtedy, gdy liczba żądań wzrośnie od 0 do 500 w jednej chwili - po odczytaniu plik będzie tam przechowywany do momentu, gdy zajdzie potrzeba pamięci (ostatnio używany plik jest usuwany z pamięci podręcznej, jeśli pamięć jest pełna i potrzebuje nowego pliku do buforowania). Szanse na to, co dzieje się w prawdziwym życiu, są niewielkie. Jeśli masz pewność, że to realne ryzyko, skorzystaj z rozwiązania ramdysku, po prostu przywróć dane na ramdysku po każdym ponownym uruchomieniu - ramdisk z definicji nie jest trwałym pamięcią.
c2h5oh
Ok, spróbuję ramdysku i zobaczę jak to działa. Dzięki za opinie.
Vijayendra
9

Gdy serwer odczyta plik z dysku, zostanie on buforowany do pamięci RAM (i zostanie zastąpiony innym plikiem, jeśli nie masz pamięci RAM), problem dotyczy limitu konta, nie możesz otworzyć tylu plików ( uruchom „ulimit -a”),

Jeśli chcesz zmienić ten limit - przeczytaj o /etc/security/limits.conf

Avi Keinan
źródło
1
Masz rację, limit otwartych plików był problemem, ponieważ limit wynosi 256 w moim systemie. Ale nadal muszę wymyślić, jak skonfigurować Nginx do odczytu plików z pamięci, a nie z dysku. Nie chcę zmieniać limitu otwartych plików i wolę osiągnąć wykorzystanie pamięci podręcznej dla kolejnych żądań.
Vijayendra
4
„Nie chcę zmieniać limitu otwartych plików” - robisz to źle. Och, bardzo, bardzo źle.
womble
3
@womble Rozumiem, że aby rozwiązać problem, najłatwiejszym rozwiązaniem jest zmiana limitu. Powodem, dla którego nie chcę zmieniać tego limitu, jest sprawdzenie, co mogę zrobić z konfiguracją bez zmiany limitu. Chyba mogę coś poprawić, zmieniając niektóre inne aspekty buforowania i konfiguracji. A tak przy okazji, czy możesz podać powody / sugestie, twierdząc, że ktoś się myli? Nawet w pierwszym komentarzu zrobiłeś to bez podania przyczyny. To miejsce, w którym można podać profesjonalne sugestie, przestań traktować to jak ścianę na Facebooku.
Vijayendra
7

Wiem, że to naprawdę stare, ale proszę bardzo.

  1. Nginx nie wykonuje buforowania pamięci po wyjęciu z pudełka, w tym celu warto zajrzeć do memcache, polecam pakiet openresty dla tego: http://openresty.org/. Co dostajesz po wyjęciu z pudełka (jak już wspomniano powyżej, pamięć podręczna strony)
  2. Ten komunikat o błędzie, jestem prawie pewien, pochodzi od ab nie z nginx, błędy nginx dla limitów plików wyglądają tak: „nie powiodło się (24: zbyt wiele otwartych plików)”. Pamiętaj, że w gniazdach unixowych są również pliki, więc dla użytkownika, na którym działa ab, as, należy dostosować ulimit dla tej sesji, aby uruchomić ab. Ponieważ powiedziałeś, że twój limit to 256, pytasz ab, aby używał 500 połączeń, maksymalizuje to limit.
Ben Whitaker
źródło
Ben Whitaker miał rację, problem pochodzi z ab, który próbuje utworzyć 500 plików z gniazdami <=> (w systemie Linux).
bachden
2

Plik buforowany w pamięci RAM jest nadal plikiem!

Spróbuj zamiast tego użyć modułu pamięci podręcznej Memcached firmy Nginx. Ale wciąż 1000 równoczesnych połączeń jest ogromne, czy uważasz, że to twoja sprawa?

Thomas Decaux
źródło