node.js sendiri atau nginx frontend untuk melayani file statis?


90

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?


3
Saya akan mengatakan itu juga tergantung pada jumlah konfigurasi dan kode yang harus Anda tulis untuk menggunakan satu server di atas yang lain. Jika Anda tidak berharap untuk IPO dan server aplikasi Anda sudah dikonfigurasi dan melakukan semua yang Anda butuhkan, maka Anda bisa tetap menggunakannya sampai itu tidak cukup.
m33lky

Jawaban:


119

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.


7
Hanya catatan kecil: node.js juga mendukung sendfile- tetapi tampaknya Anda harus menulis beberapa kode, lihat mis. blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo

Di luar menyajikan konten statis, mengapa kinerja Nginx lebih baik daripada hanya mengekspos server web utama (Tomcat / Jetty / IIS, dll) di domain publik?
raffian

1
Jika ada permintaan yang dibuat ke aplikasi Anda, permintaan itu tidak akan dibuat lebih cepat secara ajaib dengan merutekannya melalui nginx terlebih dahulu (ini bisa terasa lebih cepat dalam kasus terbaik ketika nginx menangani CSS dan js statis, gzip dan SSL). Namun, nginx juga merupakan salah satu penyeimbang beban perangkat lunak terbaik, jadi ini mungkin penting karena sebagian besar server terkenal sering berubah-ubah pada beban yang cukup tinggi.
m33lky

Tetapi Anda dapat melakukan server file dengan cara yang tidak sinkron menggunakan Node.js. Bisakah Anda melakukannya dengan NGINX?
Dragos C.

1
@lwansbrough menghadirkan tolok ukur tersebut ke tabel. Setidaknya satu orang dalam topik ini telah melakukan eksperimennya sendiri.
m33lky

75

Saya melakukan cepat ab -n 10000 -c 100untuk menyajikan 1406 byte statis favicon.ico, membandingkan nginx, Express.js (middleware statis) dan Express.js berkerumun. Semoga ini membantu:

masukkan deskripsi gambar di sini

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 + staticmiddleware (lebih lambat):

masukkan deskripsi gambar di sini


Terima kasih, sangat membantu! Apakah Anda menggunakan middleware ini untuk favicon: senchalabs.org/connect/favicon.html atau hanya menyajikannya sebagai file statis?
artvolk

@artvolk the favicon one :)
gremo

3
Apakah Anda menyetel NODE_ENV = produksi untuk pengujian? Karena itu akan membuat perbedaan yang luar biasa karena staticmiddleware caching akan melakukan produksi.
ruffrey

21
bagi Anda yang tidak bisa berbahasa Italia, sumbu x adalah # permintaan, dan sumbu Y adalah jumlah ms yang diperlukan untuk menyajikan file. Saya harus google menerjemahkan itu karena saya ingin memastikan saya tidak salah membaca data. data ini sangat membantu dan saya sangat menghargai tes benchmark di sini. akan tetap menggunakan nginx
JL Griffin

1
Apakah NODE_ENV = set produksi?
basickarl

11

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.


1
"Tentu latensi dalam respons untuk nginx lebih rendah dengan konstan 20ms, tapi menurut saya pengguna tidak akan selalu melihat perbedaan itu"? Saya sangat berharap kalian tidak melakukan ini. Ada bukti bahwa pengguna akan merasakan perbedaan 1ms!
Navin

4
Kutipan diperlukan
David Burrows

9

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.


0

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.


9
Ini semua tidak masuk akal. Pertanyaan ini tentang nginx bukan Apache. Nginx dan node menggunakan libev untuk event loop mereka. Nginx akan menjadi beberapa kali lebih cepat dari node. Salah satunya tidak memiliki overhead VM, dan ditulis secara khusus untuk melakukan operasi ini pada sistem file Anda.
Evan Carroll

1
libev adalah simpul awal. Libuv telah mengadopsi peran ini untuk memungkinkan node menjalankan lintas platform.
tsturzl

1
Saya tidak melihat bagaimana faktor kode asinkron menjadi ini. Kinerja Node akan jauh lebih buruk daripada Nginx dan kemungkinan besar karena memblokir I / O yang akan Anda hadapi ketika Anda memiliki banyak klien yang meminta Anda untuk membaca file dari disk. Praktik terbaiknya adalah selalu menggunakan Nginx untuk aset statis sehingga aplikasi Node Anda dapat menangani logika aplikasi. Kita bisa berbicara tentang skenario teoritis di mana Node akan berkinerja lebih baik tetapi di dunia nyata Nginx akan menang sejauh satu mil 9 kali dari 10.
wgp

-11

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.


1
Anda perlu membawa beberapa fakta, karena saya ingin percaya apa yang Anda katakan tetapi, perlu tolok ukur, jika didasarkan pada dunia nyata, bagus! tetapi tidak kasus tepi
Stefan Rogin

5
Lucunya, jawaban ini memiliki fakta sebanyak jawaban terpilih dengan suara terbanyak. Saya pikir orang lebih suka server web di depan karena itulah cara mereka diajarkan untuk melakukannya di [masukkan teknologi aplikasi web lain]. Ini bukan jawaban yang bagus tapi +1 karena kasihan.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.