RAM'den statik içerik sunmak için nginx nasıl yapılandırılır?


11

Nginx'i web sunucum olarak ayarlamak istiyorum. Görüntü dosyalarını disk yerine bellekte (RAM) önbelleğe almak istiyorum. Küçük bir sayfa sunuyorum ve her zaman RAM'den sunulan birkaç resim istiyorum. Nginx'in içeriği RAM'e önbelleğe alma yeteneğine sahip olduğuna inandığım için bunun için Vernik (veya başka herhangi bir araç) kullanmak istemiyorum. Bunun için Nginx'i nasıl yapılandırabileceğimden emin değilim? Birkaç kombinasyon denedim ama işe yaramadı. Nginx görüntüleri almak için her zaman disk kullanır.

Örneğin, aşağıdaki komutla test etmek için Apache karşılaştırmasını denediğimde:

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

Aşağıdaki hatayı alıyorum:

socket: Too many open files (24)

Sanırım bu Nginx diskten aynı anda çok fazla dosya açmaya çalışıyor ve işletim sistemi bu işleme izin vermiyor. Birisi bana doğru bir yapılandırma önerebilir mi?


Neredeyse kesinlikle yanlış tahmin ediyorsun. Ayrıca, hatayı nereden alıyorsunuz?
womble

@womble Aşağıda yorum yaptığım gibi problem eşzamanlılık olabilir. İçerik bellekte kullanılabilir olmadan önce aynı anda çalışan birçok iş parçacığı vardır. Lütfen neden yanlış tahmin ettiğimi düşündüğümü açıklar mısınız?
Vijayendra

Yanıtlar:


9

Statik içeriğe sahipse, varsayılan olarak bellekte önbelleğe alınır (kalan bellek yoksa), sadece nginx tarafından değil, OS - disk tarafında kalan tek şey stat () olacaktır.

% 100 bellek çözümü istiyorsanız, ramdisk'i yapılandırabilir ve oradan veri sunabilirsiniz.


Evet, içeriğin bellekte işletim sistemi tarafından önbelleğe alındığını anlıyorum. Ancak, dosyanın zaten bellekte mevcut olduğu varsayımı. Sorun eşzamanlılık olabilir. İçerik bellekten kullanılabilir duruma gelmeden önce aynı anda çalışan birçok iş parçacığı vardır. Ne düşünüyorsun?
Vijayendra

1
Bu sadece istek sayısı anında 0'dan 500'e çıkarsa bir sorundur - dosya okunduktan sonra bellek gerekene kadar orada saklanır (bellek doluysa ve yeni dosya gerekiyorsa en son kullanılan dosya önbellekten kaldırılır) önbelleklenmelidir). Gerçek hayatta olanların hiçbiri ince değildir. Bunun gerçek bir risk olduğundan eminseniz, ramdisk çözümünü kullanın, her yeniden başlatmadan sonra ramdisk'teki verileri geri yüklediğinizden emin olun - ramdisk tanımı gereği kalıcı depolama alanı değildir.
c2h5oh

Tamam, ramdisk'i deneyeceğim ve bunun nasıl çalıştığını göreceğim. Geri dönüşünüz için teşekkür ederiz.
Vijayendra

9

Sunucu diskten bir dosya okuduktan sonra, ram olarak önbelleğe alınır (ve ram dışındaysanız farklı dosya ile değiştirilir), sorun hesap sınırınızdadır, çok fazla dosya açamazsınız ( 'ulimit -a' çalıştır),

Bu sınırı değiştirmek istiyorsanız - /etc/security/limits.conf adresini okuyun.


1
Haklısınız, sistemimde sınır 256 olduğu için açık dosya sınırı bir sorundu. Ama yine de dosyaları disk yerine bellekten okumak için Nginx'in nasıl yapılandırılacağını anlamaya ihtiyacım var. Açık dosya sınırımı değiştirmek istemiyorum ve daha sonraki istekler için önbellek kullanımına ulaşmak istiyorum.
Vijayendra

4
"Açık dosya sınırımı değiştirmek istemiyorum" - bunu yanlış yapıyorsunuz. Oh, çok çok, çok yanlış.
womble

3
@womble Sorunu çözmek için en kolay çözümün sınırı değiştirmek olduğunu anlıyorum. Bu limiti değiştirmek istemememin nedeni, limiti değiştirmeden konfigürasyonla en iyi ne yapabileceğimi görmektir. Önbellekleme ve yapılandırmanın diğer bazı yönlerini değiştirerek işleri geliştirebileceğim bir şey. Ve bu arada, birisinin neden yanlış olduğunu iddia ederken size neden / öneri verebilir misiniz? İlk yorumunuzda bile bunu herhangi bir sebep göstermeden yaptınız. Bu, profesyonel önerilerde bulunmak için bir yer, lütfen facebook duvarınız gibi davranmayı bırakın.
Vijayendra

7

Yani bunun çok eski olduğunu biliyorum ama işte gidiyor.

  1. Nginx kutunun dışına bellek önbellekleme yapmaz, bunun için memcache bakmak isteyeceksiniz, bunun için openresty paketini tavsiye ederim: http://openresty.org/. Kutudan çıkardığınız şey (yukarıda yanıtlandığı gibi sayfa önbelleğidir)
  2. Bu hata mesajı, neredeyse eminim, ab'den nginx değil, dosya sınırları için nginx hataları bu "başarısız oldu (24: Çok fazla açık dosya)" gibi görünüyor. Unix soketlerinin de dosyalar olduğunu unutmayın, bu nedenle ab çalıştırdığınız kullanıcı için, bu oturumun ab çalışması için ulimit ayarının yapılması gerekir. Sınırınızın 256 olduğunu söylediğiniz için, ab'den 500 bağlantı kullanmasını istiyorsunuz, bu sınırınızı en üst düzeye çıkarıyor.

Ben Whitaker haklıydı, sorun 500 soket <=> dosya oluşturmaya çalışan ab'den geldi (linux işletim sisteminde).
bachden

2

RAM'de önbelleğe alınan bir dosya hala bir dosyadır!

Bunun yerine Nginx'in Memcached önbellek modülünü kullanmayı deneyin. Ama yine de, 1000 eşzamanlı bağlantı çok büyük, bence senin durumun mu?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.