Apakah ada benchmark atau perbandingan yang lebih cepat: letakkan nginx di depan node dan biarkan ia melayani file statis secara langsung atau hanya menggunakan node dan melayani file statis yang menggunakannya?
Solusi nginx tampaknya lebih mudah dikelola untuk saya, ada pendapat?
Jawaban:
Saya harus tidak setuju dengan jawaban di sini. Meskipun Node akan berfungsi dengan baik, nginx pasti akan lebih cepat jika dikonfigurasi dengan benar. nginx diimplementasikan secara efisien di C mengikuti pola yang sama (kembali ke koneksi hanya jika diperlukan) dengan footprint memori yang kecil. Selain itu, ini mendukung syscall sendfile untuk melayani file-file itu secepat mungkin yang Anda bisa dapatkan dalam melayani file, karena itu adalah kernel OS itu sendiri yang melakukan pekerjaan itu.
Sekarang nginx telah menjadi standar de facto sebagai server frontend. Anda dapat menggunakannya untuk performanya dalam menyajikan file statis, gzip, SSL, dan bahkan load-balancing nanti.
PS: Ini mengasumsikan bahwa file benar-benar "statis" seperti yang disimpan di disk pada saat permintaan.
sumber
sendfile
- tetapi tampaknya Anda harus menulis beberapa kode, lihat mis. blog.std.in/2010/09/09/using-sendfile-with-nodejsSaya melakukan cepat
ab -n 10000 -c 100
untuk menyajikan 1406 byte statisfavicon.ico
, membandingkan nginx, Express.js (middleware statis) dan Express.js berkerumun. Semoga ini membantu:Sayangnya saya tidak dapat menguji 1000 atau bahkan 10000 permintaan bersamaan karena nginx, di mesin saya, akan mulai membuat kesalahan.
EDIT : seperti yang disarankan oleh artvolk, berikut adalah hasil dari cluster +
static
middleware (lebih lambat):sumber
static
middleware caching akan melakukan produksi.Saya memiliki interpretasi yang berbeda tentang bagan @gremo. Menurut saya, skala node dan nginx memiliki jumlah permintaan yang sama (antara 9-10k). Tentu latensi dalam respons untuk nginx lebih rendah dengan konstan 20ms, tetapi menurut saya pengguna tidak akan selalu melihat perbedaan itu (jika aplikasi Anda dibuat dengan baik). Dengan jumlah mesin yang tetap, akan membutuhkan jumlah beban yang cukup besar sebelum saya mengubah mesin node menjadi nginx mengingat node adalah tempat sebagian besar beban akan terjadi di tempat pertama. Satu tandingan untuk ini adalah jika Anda sudah mendedikasikan mesin ke nginx untuk load balancing. Jika itu masalahnya maka Anda mungkin juga membuatnya melayani konten statis Anda juga.
sumber
Either way, saya akan menyiapkan Nginx untuk menyimpan file statis ... Anda akan melihat perbedaan BESAR di sana. Kemudian, apakah Anda melayani mereka dari node atau tidak, pada dasarnya Anda mendapatkan kinerja yang sama dan bantuan beban yang sama pada aplikasi node Anda.
Saya pribadi tidak menyukai gagasan frontend Nginx saya melayani aset statis dalam banyak kasus, dalam hal itu
1) Proyek sekarang harus berada di mesin yang sama - atau harus dipecah menjadi aset (di mesin nginx) & aplikasi web (di beberapa mesin untuk penskalaan)
2) Konfigurasi Nginx sekarang harus mempertahankan lokasi jalur untuk aset statis / muat ulang saat berubah.
sumber
Itu pertanyaan yang sulit dijawab. Jika Anda menulis server node yang sangat ringan untuk hanya menyajikan file statis, kemungkinan besar performanya lebih baik daripada nginx, tetapi tidak sesederhana itu. ( Ini adalah "patokan" membandingkan server file nodejs dan lighttpd - yang kinerjanya mirip dengan ngingx saat menyajikan file statis).
Kinerja dalam hal melayani file statis sering kali turun ke lebih dari sekadar server web yang melakukan pekerjaan itu. Jika Anda menginginkan performa setinggi mungkin, Anda akan menggunakan CDN untuk menyajikan file Anda guna mengurangi latensi bagi pengguna akhir, dan memanfaatkan edge-caching.
Jika Anda tidak khawatir tentang itu, node dapat melayani file statis dengan baik di banyak situasi. Node cocok untuk kode asynchronous, yang juga diandalkannya karena itu single-threaded dan i / o pemblokiran apa pun dapat memblokir seluruh proses, dan menurunkan kinerja aplikasi Anda. Kemungkinan besar Anda menulis kode dengan cara yang tidak memblokir, tetapi jika Anda melakukan sesuatu secara sinkron, Anda dapat menyebabkan pemblokiran, yang akan menurunkan kecepatan klien lain bisa mendapatkan file statis mereka disajikan. Solusi mudahnya adalah dengan tidak menulis kode pemblokiran, tetapi terkadang itu tidak memungkinkan, atau Anda tidak selalu bisa memaksakannya.
sumber
Saya yakin bahwa node.js murni dapat mengungguli nginx dalam banyak aspek.
Semua mengatakan saya harus tetap NginX memiliki cache built-in, sedangkan node.js tidak datang dengan itu diinstal pabrik (ANDA HARUS MEMBANGUN Cache FILE ANDA SENDIRI). Cache file kustom mengungguli nginx dan server lain di pasar karena sangat sederhana.
Nginx juga berjalan pada banyak inti. Untuk menggunakan potensi penuh Node Anda harus mengelompokkan server node. Jika anda tertarik untuk mengetahui caranya silahkan pm.
Anda perlu menggali lebih dalam untuk mencapai kinerja nirwana dengan node, itu satu-satunya masalah. Setelah selesai ya ... itu mengalahkan Nginx.
sumber