node.js เองหรือส่วนหน้า nginx สำหรับให้บริการไฟล์แบบคงที่?


92

มีเกณฑ์มาตรฐานหรือการเปรียบเทียบใดที่เร็วกว่า: วาง nginx ไว้ด้านหน้าโหนดและปล่อยให้แสดงไฟล์แบบคงที่โดยตรงหรือใช้เพียงโหนดและให้บริการไฟล์แบบคงที่โดยใช้

โซลูชัน nginx ดูเหมือนจะจัดการได้มากกว่าสำหรับฉันมีความคิดอย่างไร


3
ฉันจะบอกว่ามันขึ้นอยู่กับจำนวนการกำหนดค่าและรหัสที่คุณต้องเขียนเพื่อใช้เซิร์ฟเวอร์หนึ่งกับอีกเซิร์ฟเวอร์หนึ่ง หากคุณไม่คาดหวังที่จะเสนอขายหุ้น IPO และเซิร์ฟเวอร์แอปของคุณได้รับการกำหนดค่าและทำทุกอย่างที่คุณต้องการแล้วคุณก็สามารถยึดติดกับมันได้จนกว่าจะไม่เพียงพอ
m33lky

คำตอบ:


121

ฉันจะไม่เห็นด้วยกับคำตอบที่นี่ แม้ว่า Node จะทำงานได้ดี แต่ nginx จะเร็วขึ้นอย่างแน่นอนเมื่อกำหนดค่าอย่างถูกต้อง nginx ถูกนำไปใช้อย่างมีประสิทธิภาพใน C ตามรูปแบบที่คล้ายกัน (กลับไปที่การเชื่อมต่อเมื่อจำเป็นเท่านั้น) ด้วยรอยเท้าหน่วยความจำขนาดเล็ก นอกจากนี้ยังรองรับsyscall sendfileเพื่อให้บริการไฟล์เหล่านั้นซึ่งเร็วที่สุดเท่าที่คุณจะทำได้ในการให้บริการไฟล์เนื่องจากเป็นเคอร์เนลของระบบปฏิบัติการที่ทำงานได้

ตอนนี้ nginx ได้กลายเป็นมาตรฐานโดยพฤตินัยในฐานะเซิร์ฟเวอร์ส่วนหน้า คุณสามารถใช้เพื่อเพิ่มประสิทธิภาพในการให้บริการไฟล์แบบคงที่, gzip, SSL และแม้กระทั่งการโหลดบาลานซ์ในภายหลัง

PS: สิ่งนี้ถือว่าไฟล์เป็น "คงที่" จริงๆเหมือนอยู่ในดิสก์ในเวลาที่มีการร้องขอ


7
หมายเหตุเล็กน้อย: node.js ยังรองรับsendfile- แต่ดูเหมือนว่าคุณต้องเขียนโค้ดดูเช่น blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo

นอกเหนือจากการแสดงเนื้อหาคงที่เหตุใด Nginx จึงมีประสิทธิภาพดีกว่าการเปิดเผยเว็บเซิร์ฟเวอร์หลัก (Tomcat / Jetty / IIS ฯลฯ ) บนโดเมนสาธารณะ
raffian

1
หากมีการร้องขอไปยังแอปของคุณคำขอนั้นจะไม่ถูกทำให้เร็วขึ้นอย่างน่าอัศจรรย์โดยกำหนดเส้นทางผ่าน nginx ก่อน (อาจเร็วกว่าอย่างเห็นได้ชัดในกรณีที่ดีที่สุดเมื่อ nginx จัดการ CSS แบบคงที่และ js, gzip และ SSL) อย่างไรก็ตาม nginx ยังเป็นหนึ่งในโหลดบาลานเซอร์ซอฟต์แวร์ที่ดีที่สุดดังนั้นสิ่งนี้อาจมีความสำคัญเนื่องจากเซิร์ฟเวอร์ส่วนใหญ่มีชื่อเสียงในการพลิกออกเมื่อโหลดสูงพอสมควร
m33lky

แต่คุณสามารถเซิร์ฟเวอร์ไฟล์ในลักษณะที่ไม่ตรงกันโดยใช้ Node.js คุณสามารถทำได้ด้วย NGINX หรือไม่?
Dragos C.

1
@lwansbrough นำเกณฑ์มาตรฐานเหล่านั้นมาสู่ตาราง มีคนอย่างน้อยหนึ่งคนในหัวข้อนี้ได้ทำการทดลองของเขาเอง
m33lky

76

ฉันทำอย่างรวดเร็วab -n 10000 -c 100ในการให้บริการ 1406 ไบต์แบบคงที่favicon.icoโดยเปรียบเทียบ nginx, Express.js (มิดเดิลแวร์แบบคงที่) และ Express.js แบบคลัสเตอร์ หวังว่านี่จะช่วยได้:

ป้อนคำอธิบายภาพที่นี่

น่าเสียดายที่ฉันไม่สามารถทดสอบคำขอพร้อมกัน 1,000 รายการหรือแม้แต่ 10,000 รายการเป็น nginx บนเครื่องของฉันได้จะเริ่มส่งข้อผิดพลาด

แก้ไข : ตามที่ artvolk แนะนำนี่คือผลลัพธ์ของคลัสเตอร์ + staticมิดเดิลแวร์ (ช้ากว่า):

ป้อนคำอธิบายภาพที่นี่


ขอบคุณมากช่วยได้มาก! คุณใช้มิดเดิลแวร์นี้สำหรับFavicon : senchalabs.org/connect/favicon.htmlหรือแค่ทำหน้าที่เป็นไฟล์คงที่?
artvolk

@artvolk the favicon one :)
gremo

3
คุณตั้งค่า NODE_ENV = การผลิตสำหรับการทดสอบหรือไม่ เพราะนั่นจะสร้างความแตกต่างอย่างไม่น่าเชื่อเนื่องจากstaticตัวกลางการแคชจะทำในการผลิต
ruffrey

21
สำหรับพวกคุณที่ไม่พูดภาษาอิตาลีแกน x คือ # ของคำขอและแกน Y คือจำนวนมิลลิวินาทีที่ใช้ในการให้บริการไฟล์ ฉันต้อง Google แปลเพราะฉันต้องการให้แน่ใจว่าฉันไม่ได้อ่านข้อมูลผิด แม้ว่าข้อมูลนี้จะเป็นประโยชน์อย่างไม่น่าเชื่อและฉันขอขอบคุณการทดสอบเกณฑ์มาตรฐานที่นี่ จะติดกับ nginx หลังจากนั้น
JL Griffin

1
NODE_ENV = ชุดการผลิตหรือไม่
basickarl

11

ฉันมีการตีความแผนภูมิของ @ gremo ที่แตกต่างกัน สำหรับฉันดูเหมือนทั้งโหนดและสเกล nginx ที่จำนวนคำขอเท่ากัน (ระหว่าง 9-10k) แน่นอนว่าเวลาในการตอบสนองในการตอบสนองสำหรับ nginx จะต่ำลงโดยค่าคงที่ 20 มิลลิวินาที แต่ฉันไม่คิดว่าผู้ใช้จะต้องรับรู้ความแตกต่างนั้น (หากแอปของคุณสร้างมาดี) เมื่อพิจารณาถึงจำนวนเครื่องคงที่แล้วจะต้องใช้โหลดค่อนข้างมากก่อนที่ฉันจะแปลงเครื่องโหนดเป็น nginx โดยพิจารณาว่าโหนดเป็นจุดที่โหลดส่วนใหญ่จะเกิดขึ้นตั้งแต่แรก สิ่งหนึ่งที่ตรงข้ามกับเรื่องนี้คือหากคุณได้อุทิศเครื่องให้กับ nginx สำหรับการทำโหลดบาลานซ์แล้ว หากเป็นเช่นนั้นคุณอาจให้บริการเนื้อหาคงที่ของคุณเช่นกัน


1
"แน่นอนว่าเวลาแฝงในการตอบสนองสำหรับ nginx ต่ำกว่า 20 มิลลิวินาทีคงที่ แต่ฉันคิดว่าผู้ใช้ไม่จำเป็นต้องรับรู้ความแตกต่างนั้น" ฉันหวังเป็นอย่างยิ่งว่าพวกคุณจะไม่ทำเช่นนี้ มีหลักฐานว่าผู้ใช้จะรับรู้ถึงความแตกต่าง 1 มิลลิวินาที!
นาวิน

4
จำเป็นต้องอ้างอิง
David Burrows

9

ไม่ว่าจะด้วยวิธีใดฉันจะตั้งค่า Nginx เพื่อแคชไฟล์แบบคงที่ ... คุณจะเห็นความแตกต่างอย่างมากที่นั่น จากนั้นไม่ว่าคุณจะให้บริการจากโหนดหรือไม่ก็ตามโดยพื้นฐานแล้วคุณจะได้รับประสิทธิภาพที่เหมือนกันและการผ่อนแรงแบบเดียวกันในแอปโหนดของคุณ

โดยส่วนตัวแล้วฉันไม่ชอบแนวคิดของส่วนหน้า Nginx ของฉันที่ให้บริการเนื้อหาแบบคงที่ในกรณีส่วนใหญ่ในนั้น

1) ตอนนี้โปรเจ็กต์ต้องอยู่ในเครื่องเดียวกันหรือต้องแยกเป็นสินทรัพย์ (บนเครื่อง nginx) และเว็บแอพ (บนเครื่องหลายเครื่องสำหรับการปรับขนาด)

2) การกำหนดค่า Nginx ต้องรักษาตำแหน่งเส้นทางสำหรับสินทรัพย์คงที่ / โหลดซ้ำเมื่อมีการเปลี่ยนแปลง


0

นั่นเป็นคำถามที่ตอบยาก หากคุณเขียนเซิร์ฟเวอร์โหนดที่มีน้ำหนักเบามากเพื่อเพียงแค่ให้บริการไฟล์แบบคงที่ก็น่าจะทำงานได้ดีกว่า nginx แต่ก็ไม่ง่ายอย่างนั้น ( นี่คือ "เกณฑ์มาตรฐาน"เปรียบเทียบไฟล์เซิร์ฟเวอร์ nodejs และ lighttpd ซึ่งมีประสิทธิภาพใกล้เคียงกับ ngingx เมื่อให้บริการไฟล์คงที่)

ประสิทธิภาพในการให้บริการไฟล์แบบคงที่มักจะมาจากเว็บเซิร์ฟเวอร์ที่ทำงานมากกว่า หากคุณต้องการประสิทธิภาพสูงสุดคุณจะใช้ CDN เพื่อให้บริการไฟล์ของคุณเพื่อลดเวลาในการตอบสนองสำหรับผู้ใช้ปลายทางและได้รับประโยชน์จากการแคชขอบ

หากคุณไม่กังวลเกี่ยวกับเรื่องนี้โหนดสามารถให้บริการไฟล์คงที่ได้ดีในสถานการณ์ส่วนใหญ่ โหนดยืมตัวเองไปใช้รหัสอะซิงโครนัสซึ่งมันต้องอาศัยเนื่องจากเป็นเธรดเดียวและการปิดกั้น i / o ใด ๆ สามารถบล็อกกระบวนการทั้งหมดและลดประสิทธิภาพของแอปพลิเคชันของคุณ เป็นไปได้มากกว่าที่คุณจะเขียนโค้ดของคุณแบบไม่ปิดกั้น แต่ถ้าคุณทำอะไรพร้อมกันคุณอาจทำให้เกิดการบล็อกซึ่งจะลดความเร็วที่ไคลเอ็นต์อื่น ๆ สามารถรับไฟล์แบบคงที่ได้ วิธีแก้ปัญหาง่ายๆคืออย่าเขียนโค้ดบล็อก แต่บางครั้งก็ไม่เป็นไปได้หรือคุณไม่สามารถบังคับใช้ได้ตลอดไป


9
ทั้งหมดนี้เป็นเรื่องไร้สาระ คำถามนี้เกี่ยวกับnginxไม่ใช่ Apache ทั้ง nginx และโหนดใช้ libev สำหรับลูปเหตุการณ์ Nginx จะเร็วกว่า node หลายเท่า หนึ่งในนั้นไม่มีเหนือศีรษะของ VM และเขียนขึ้นโดยเฉพาะเพื่อดำเนินการนี้ในระบบไฟล์ของคุณ
Evan Carroll

1
Libev เป็นจุดเริ่มต้น Libuv ได้ใช้บทบาทนี้เพื่ออนุญาตให้โหนดทำงานข้ามแพลตฟอร์ม
tsturzl

1
ฉันไม่เห็นว่ารหัสอะซิงโครนัสมีปัจจัยในเรื่องนี้อย่างไร ประสิทธิภาพของโหนดจะแย่กว่า Nginx มากและน่าจะเป็นเพราะการบล็อก I / O ที่คุณพบเมื่อคุณมีลูกค้าจำนวนมากขอให้คุณอ่านไฟล์จากดิสก์ แนวทางปฏิบัติที่ดีที่สุดคือใช้ Nginx สำหรับเนื้อหาคงที่เสมอเพื่อให้แอป Node ของคุณสามารถจัดการตรรกะของแอปพลิเคชันได้ เราสามารถพูดคุยเกี่ยวกับสถานการณ์ทางทฤษฎีที่ Node จะทำงานได้ดีขึ้น แต่ในโลกแห่งความเป็นจริง Nginx จะชนะหนึ่งไมล์ 9 ครั้งจาก 10 ครั้ง
wgp

-11

ฉันมั่นใจว่า node.js สามารถทำได้ดีกว่า nginx ในหลาย ๆ ด้าน

ทั้งหมดกล่าวว่าฉันต้องอยู่ NginX มีแคชในตัวในขณะที่ node.js ไม่ได้ติดตั้งมาจากโรงงาน (คุณต้องสร้างแคชไฟล์ของคุณเอง) แคชไฟล์ที่กำหนดเองมีประสิทธิภาพดีกว่า nginx และเซิร์ฟเวอร์อื่น ๆ ในตลาดเนื่องจากมันง่ายมาก

นอกจากนี้ Nginx ยังทำงานบนหลายคอร์ ในการใช้ Node อย่างเต็มศักยภาพคุณต้องคลัสเตอร์โหนดเซิร์ฟเวอร์ สนใจอยากทราบวิธีกรุณา pm.

คุณต้องขุดลึกเพื่อให้บรรลุนิพพานประสิทธิภาพด้วยโหนดนั่นคือปัญหาเดียว เมื่อทำนรกแล้ว ... มันเต้น Nginx


1
คุณต้องนำข้อเท็จจริงบางอย่างมาด้วยเพราะฉันอยากจะเชื่อในสิ่งที่คุณพูด แต่ต้องการเกณฑ์มาตรฐานหากอิงจากโลกแห่งความเป็นจริงเยี่ยมมาก! แต่ไม่ใช่เคสขอบ
Stefan Rogin

5
สิ่งที่น่าตลกคือคำตอบนี้มีข้อเท็จจริงมากพอ ๆ กับคำตอบที่เลือกและมีผู้โหวตมากที่สุด ฉันคิดว่าผู้คนชอบเว็บเซิร์ฟเวอร์ที่อยู่ตรงหน้าเพราะนั่นเป็นวิธีที่พวกเขาได้รับการสอนให้ทำใน [ใส่เทคโนโลยีเว็บแอปพลิเคชันอื่น ๆ ] นี่ไม่ใช่คำตอบที่ดี แต่ +1 ด้วยความสงสาร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.