Bagaimana cara mengkonfigurasi nginx untuk menyajikan konten statis dari RAM?

11

Saya ingin mengatur Nginx sebagai server web saya. Saya ingin memiliki file gambar di-cache dalam memori (RAM) daripada disk. Saya melayani halaman kecil dan ingin beberapa gambar selalu disajikan dari RAM. Saya tidak ingin menggunakan Varnish (atau alat lain semacam itu) untuk ini karena saya percaya Nginx memiliki kemampuan untuk men-cache konten ke dalam RAM. Saya tidak yakin bagaimana cara mengkonfigurasi Nginx untuk ini? Saya memang mencoba beberapa kombinasi tetapi tidak berhasil. Nginx menggunakan disk setiap saat untuk mendapatkan gambar.

Misalnya, ketika saya mencoba benchmark Apache untuk menguji dengan perintah berikut:

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

Saya mendapatkan kesalahan berikut:

socket: Too many open files (24)

Saya kira ini berarti Nginx sedang mencoba untuk membuka terlalu banyak file secara bersamaan dari disk dan OS tidak memungkinkan operasi ini. Adakah yang bisa menyarankan saya konfigurasi yang benar?

Vijayendra
sumber
Anda hampir pasti salah menebak. Dari mana Anda mendapatkan kesalahan?
womble
@ womble Seperti yang saya komentari di bawah ini, masalahnya bisa berupa konkurensi. Ada banyak utas yang mencoba secara bersamaan sebelum konten tersedia dalam memori. Bisakah Anda jelaskan mengapa Anda berpikir saya salah menebak?
Vijayendra

Jawaban:

9

Jika konten statis maka akan di-cache dalam memori secara default (kecuali tidak ada memori yang tersisa), hanya saja tidak dengan nginx, tetapi OS - semua yang akan tersisa di sisi disk akan stat ().

Jika Anda menginginkan solusi 100% memori, Anda bisa mengkonfigurasi ramdisk dan menyajikan data dari sana.

c2h5oh
sumber
Ya, saya mengerti bahwa konten di-cache dalam memori oleh OS. Tetapi asumsinya adalah file tersebut sudah tersedia dalam memori. Masalahnya bisa konkurensi. Ada banyak utas yang mencoba secara bersamaan sebelum konten tersedia dari memori. Bagaimana menurut anda?
Vijayendra
1
Itu hanya masalah jika jumlah permintaan berubah dari 0 hingga 500 dalam sekejap - setelah file dibaca akan disimpan di sana sampai memori diperlukan (file yang paling baru digunakan dihapus dari cache jika memori penuh dan kebutuhan file baru di-cache). Kemungkinan hal itu terjadi dalam kehidupan nyata tidak ada artinya. Jika Anda yakin itu adalah risiko nyata gunakan solusi ramdisk sebagai gantinya, pastikan untuk mengembalikan data pada ramdisk setelah setiap reboot - ramdisk tidak penyimpanan persisten menurut definisi.
c2h5oh
Ok, saya akan mencoba ramdisk dan melihat cara kerjanya. Terima kasih untuk umpan baliknya.
Vijayendra
9

Setelah server membaca file dari disk, itu akan di-cache ke ram (dan akan digantikan oleh file berbeda jika Anda kehabisan ram), masalahnya adalah pada batas akun Anda, Anda tidak dapat membuka begitu banyak file ( jalankan 'ulimit -a'),

Jika Anda ingin mengubah batas ini - baca tentang /etc/security/limits.conf

Avi Keinan
sumber
1
Anda benar, batas file terbuka adalah masalah karena batasnya 256 pada sistem saya. Tapi saya masih perlu mencari cara untuk mengkonfigurasi Nginx untuk membaca file dari memori daripada disk. Saya tidak ingin mengubah batas file terbuka saya dan lebih suka mencapai penggunaan cache untuk permintaan berikutnya.
Vijayendra
4
"Saya tidak ingin mengubah batas file terbuka saya" - Anda salah melakukannya. Oh, sangat, sangat salah.
womble
3
@ Womble Saya mengerti untuk memperbaiki masalah, solusi termudah adalah mengubah batas. Alasan saya tidak ingin mengubah batas ini adalah untuk melihat apa yang terbaik yang bisa saya lakukan dengan konfigurasi tanpa mengubah batas. Saya bisa memperbaiki beberapa hal dengan mengubah beberapa aspek lain dari caching dan konfigurasi. Omong-omong, bisakah Anda memberikan alasan / saran sambil mengklaim mengapa seseorang salah. Bahkan dalam komentar pertama Anda, Anda melakukan ini tanpa memberikan alasan apa pun. Ini adalah tempat untuk memberikan saran profesional, tolong berhenti memperlakukannya sebagai dinding facebook Anda.
Vijayendra
7

Jadi saya tahu ini benar-benar tua tetapi, ini dia.

  1. Nginx tidak melakukan cache memori di luar kotak, Anda akan ingin melihat memcache untuk ini, saya akan merekomendasikan paket openresty untuk ini: http://openresty.org/. Apa yang Anda dapatkan dari kotak (seperti yang dijawab di atas adalah cache halaman)
  2. Pesan kesalahan itu, saya hampir pasti, dari ab bukan dari nginx, kesalahan nginx untuk batas file terlihat seperti ini "gagal (24: Terlalu banyak file terbuka)". Ingat di unix sockets adalah file juga, jadi untuk pengguna yang Anda jalankan ab, perlu memiliki ulimit yang disesuaikan untuk sesi itu untuk menjalankan ab. Karena Anda mengatakan batas Anda adalah 256, Anda diminta untuk menggunakan 500 koneksi, ini adalah batas maksimum Anda.
Ben Whitaker
sumber
Ben Whitaker benar, masalahnya berasal dari ab, yang mencoba membuat 500 soket <=> file (di os linux).
bachden
2

File yang di-cache dalam RAM masih berupa file!

Coba gunakan modul cache Memcached dari Nginx sebagai gantinya. Tapi tetap saja, 1000 koneksi konkuren sangat besar, apakah menurut Anda kasus Anda?

Thomas Decaux
sumber