เมื่อใดที่ฉันควรเปลี่ยนเป็น NGinx


11

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

ไม่ว่าด้วยวิธีใดฉันได้ยินข่าวเกี่ยวกับ NGinx มากมายซึ่งดูเหมือนว่าจะมีประสิทธิภาพมากกว่า Apache ดังนั้นฉันจึงถามตัวเองว่ามันคุ้มค่ากับการทำงานกับโครงการใหม่หรือไม่ มันไม่ชัดเจนในใจของฉันเพราะฉันไม่รู้ว่าคอขวดประสิทธิภาพการทำงานชนิดใด NGinx แก้ไขได้อย่างแน่นอน

ฉันไม่ใช่ผู้ใช้พลังงานของ Apache ฉันเป็นผู้ดูแลระบบ linux ที่ไม่ดีและฉันไม่ได้พัฒนาเว็บแอปมากนัก (แต่ฉันมีพัฒนาการ) ฉันทุ่มเทเพื่อการเขียนซอฟต์แวร์เป็นส่วนใหญ่ดังนั้นบางครั้งส่วนเว็บเซิร์ฟเวอร์ก็ไม่ชัดเจนสำหรับฉัน ทุกครั้งที่ฉันต้องกำหนดค่าเว็บไซต์ผ่าน apach ฉันต้องใช้เวลามากในการค้นหาเอกสารเพื่อให้แน่ใจว่าฉันจะไม่ทำลายทุกสิ่ง

ที่ถูกกล่าวว่าฉันคิดว่าฉันดีขึ้นมากในด้านนี้ แต่ยังต้องการคำแนะนำ ฉันได้เห็นไฟล์การกำหนดค่า nginx อยู่รอบ ๆ และดูเหมือนว่าจะเข้าใจได้ดีกว่า Apache มากกว่า แต่บางทีฉันผิด

จากข้อมูลที่ฉันรวบรวม NGinx จะเป็นตัวเลือกที่ดีที่สุดเมื่อคุณต้องการโหลดบาลานซ์ดังนั้นหากคุณมีแอปพลิเคชันของคุณกระจายอยู่ในเครื่องหลายเครื่องใช่ไหม ขณะที่ฉันกำลังคิดว่าแอปพลิเคชันของฉันสำหรับการ scalling (และการแสดง) ดูเหมือนว่าเป็นสิ่งที่ฉันต้องการ แต่บางทีฉันอาจต้องรู้เพิ่มเติมเกี่ยวกับสิ่งที่น่าสนใจเมื่อต้องย้ายจาก Apache ไปยัง NGinx มันคุ้มค่าที่จะเปลี่ยนมาใช้ NGinx สำหรับแอพปัจจุบันทั้งหมดของฉันด้วยหรือไม่? ราคาเท่าไหร่? (ฉันหมายความว่ามันมีราคาแพงตรงเวลาที่จะเปลี่ยนจากที่หนึ่งไปยังอีก?) ฉันสามารถใช้ Apache และ NGinx ทั้งสองในเครื่องเดียวกันโดยไม่มีปัญหาใด ๆ ?

หมายเหตุด้านข้าง : โปรดอย่ากระตุ้นให้ฉันใช้ภาษาที่แปลแล้วแทน C ++ มันไม่เกี่ยวข้องกับคำถาม ดูหน้าเหตุผล CPPCSMเพื่อดูว่าแอปพลิเคชันชนิดใดที่จะได้ประโยชน์จากมัน ฉันเข้าใจข้อเสียอย่างสมบูรณ์ (เทียบกับแอพใน Ruby และ Python ที่ฉันใช้สำหรับ webapps ที่ใช้พลังงานน้อยกว่า) และฉันก็ใช้ได้ดี

คำตอบ:


10

หลายจุด:

ความแตกต่างที่สำคัญระหว่าง Apache กับ Nginx หรือ Lighttpd (ที่ฉันชอบมาก ๆ ) คือสถาปัตยกรรม:

  1. Apache จัดการหนึ่งการเชื่อมต่อต่อกระบวนการหรือต่อเธรด (ขึ้นอยู่กับ mod-XYZ)
  2. Nginx และ Lighttpd เป็นเธรดเดี่ยวที่จัดการหลายการเชื่อมต่อในเหตุการณ์ลูปเดียว

ผลที่ตามมา:

  1. Nginx และ Lighttpd ปรับขนาดได้ดีขึ้นมากภายใต้การเชื่อมต่อพร้อมกันจำนวนมากสมมติว่าการเชื่อมต่อ 1,000 ครั้ง Apache เกือบจะตายเพราะมันต้องการกระบวนการ 1000 ใน mod-prefork หรือ 1000 เธรดใน mod-workers

    หากคุณวางแผนที่จะใช้เทคโนโลยี Comet ซึ่งการเชื่อมต่อแต่ละครั้งต้องใช้การเชื่อมต่อ HTTP แบบโพลนานดังนั้น Apache จะไม่ยอมรับเนื่องจากไม่ได้ปรับขนาดได้ดี

  2. Nginx และ Lighttpd ใช้หน่วยความจำน้อยลงเนื่องจากการเชื่อมต่อแต่ละอย่างต้องการ + - สองซ็อกเก็ต (HTTP และ FastCGI) บัฟเฟอร์หน่วยความจำระดับกลางและบางสถานะขณะที่ Apache จะต้องการเธรดทั้งหมดรวมถึงสแต็กและสิ่งอื่น ๆ

จากประสบการณ์ส่วนตัวของฉันในการวัดประสิทธิภาพฉันทำ Lighttpd (และฉันคิดว่า Nginx ด้วย) จะเร็วขึ้นเล็กน้อยด้วยแบ็กเอนด์ FastCGI จากนั้น Apache แต่นี่เป็นการเชื่อมต่อในปริมาณที่น้อย

จุดอื่นคือเมื่อคุณต้องการทำ load-balancings โดยใช้การเชื่อมต่อ FastCGI

ในสถาปัตยกรรมดั้งเดิมนั้นมี

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

เนื่องจาก Apache จัดการกับกลุ่มกระบวนการแต่ละกระบวนการที่เรียกใช้ mod-PHP (หรือโหมดอื่น ๆ )

เมื่อคุณใช้ CppCMS ที่จัดการพูลด้วยตนเองคุณสามารถทำสิ่งที่แตกต่าง:

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

ดังนั้นโดยทั่วไปคุณไม่ต้องการระดับทางอ้อมอีกเนื่องจาก CppCMS จัดการกระบวนการเธรดและพูลการเชื่อมต่อสำหรับคุณ ในขณะที่ PHP / Ruby / Perl ต้องการ Apache mod-XYZ หรือจัดการตัวเชื่อมต่อ FastCGI ของตัวเอง


+1 อธิบายอย่างสมบูรณ์โดยผู้เขียน CppCMS;) ตกลงตอนนี้ฉันเห็นปัญหาโดยรวมดีขึ้น ดังนั้นกรณีที่คุณมีเซิร์ฟเวอร์เดียว (เริ่มต้นด้วย) คือ HTTP-> Balancer-> FCGI-> CPPCMS ถ้าฉันเข้าใจถูกต้องหรือไม่ คุณคิดอย่างไรเกี่ยวกับคำแนะนำจากความคิดเห็นของ Jesper Mortensen ที่บอกว่า FastCGI ไม่เร็ว?
Klaim

@ คำติชม: ดูภาพวาดที่ดีเยี่ยมด้านบน - ในสถาปัตยกรรมนี้ FastCGI ถูกใช้เป็นการเชื่อมต่อระหว่างเซิร์ฟเวอร์หลายตัว ความเร็วสัมพัทธ์ของ FastCGI มีความสำคัญน้อยกว่าในกรณีนี้ ทางเลือกของคุณคือ HTTP, AJP และโปรโตคอลอื่น ๆ ที่สามารถใช้เครือข่ายซึ่งยังไม่ 'เร็ว' คำตอบนี้ควรถูกทำเครื่องหมายว่ายอมรับแล้วและคำถามของคุณจะถูกแก้ไขเพราะนี่ไม่เกี่ยวกับเมื่อ nginx มีค่า
Jesper M

@Jesper Mortensen> ฉันเห็นด้วย แต่คำถามอะไรที่คุณแนะนำอย่างแม่นยำ?
Klaim

6

Nginx พูดมาก ( มาก ) โดยทั่วไปสามารถรับปริมาณงานได้สูงกว่า Apache มากเนื่องจากวิธีการทางสถาปัตยกรรมที่แตกต่างกับปัญหาการแสดงหน้าเว็บไปยังเว็บ Nginx ถูกสร้างขึ้นเป็นหลักเป็นพร็อกซีย้อนกลับและจะเติมบทบาทนั้นให้ดีเป็นพิเศษ (นี่คือบิตดุลการโหลดที่คุณพูดถึง) ในทางตรงกันข้าม Apache ถูกสร้างขึ้นเพื่อให้บริการหน้าเว็บและต่อมาได้รับความสามารถในการ proxy

ที่กล่าวว่ามีพื้นที่เกือบแน่นอนว่า Apache จะมีประสิทธิภาพเหนือกว่า Nginx อย่างต่อเนื่องในขณะที่มีบางพื้นที่ที่ Nginx จะมีประสิทธิภาพสูงกว่า Apache อย่างสม่ำเสมอ

คำตอบสั้น ๆ คือถ้า Apache ใช้งานได้สำหรับคุณคุณไม่จำเป็นต้องเปลี่ยน (และฉันกำลังพูดถึงสิ่งนี้ในฐานะผู้ใช้ Apache คนเก่าที่กลายเป็นศิษย์ของ Nginx ที่ถูกแปลงทั้งหมด) เฉพาะเมื่อปริมาณการใช้งานเซิร์ฟเวอร์ของคุณเริ่มถึงระดับที่ Apache กำลังกลายเป็นคอขวดของคุณ (นี่คือคำสั่งของการเชื่อมต่อ แต่จะแตกต่างกันไปตามข้อมูลจำเพาะเซิร์ฟเวอร์ของคุณและโหลดเซิร์ฟเวอร์อื่น ๆ ) หรือหากคุณพยายามเรียกใช้ Apache ในสภาพแวดล้อมที่มีทรัพยากรไม่ดีพอที่จะแทบจะไม่พอดีการสลับไปใช้ Nginx ให้ประโยชน์ที่มั่นคงแก่คุณ

ที่กล่าวว่าหากคุณต้องการเปลี่ยนไปใช้ Nginx (ซึ่งฉันสนับสนุน!) ให้ไปหามัน คุณจะเห็นประโยชน์ใด ๆ บ้างไหม? 9 ครั้งจาก 10: ไม่คุณจะไม่ทำ แต่คุณบอกว่าคุณชอบภาษาไฟล์การตั้งค่าของ Nginx ดีกว่าดังนั้นถ้ามันทำให้คุณรู้สึกสบายใจที่จะตั้งค่า Nginx มากกว่า Apache ดีนั่นเป็นประโยชน์สำหรับคุณ! (โดยส่วนตัวแล้วฉันพบว่าการกำหนดค่า Apache ง่ายต่อการอ่านโดยทั่วไป แต่อาจเป็นเพราะฉันใช้เวลาหลายปีในการอ่านและใช้เวลาเพียงไม่กี่เดือนใน Nginx!)

จากหมายเหตุด้านข้าง: คุณพูดถึงความต้องการในการสร้างเว็บแอปใน C ++ เพื่อความมีสติของคุณฉันขอแนะนำให้คุณใช้ภาษาระดับสูงกว่าเช่น PHP, Python หรือ Java แทน จากนั้นโปรไฟล์รหัสของคุณและพิจารณาการสร้างโมดูลที่ใช้ C ++ เพื่อระบุที่อยู่คอขวดเฉพาะ (Python และ PHP ทั้งคู่อนุญาตสิ่งนี้ค่อนข้างง่ายไม่ทราบเกี่ยวกับ Java) หากคุณกังวลเกี่ยวกับประสิทธิภาพโดยรวมให้พิจารณาสิ่งนี้: EVE Online MMORPG ที่ไม่เคยมีผู้ใดที่ใหญ่ที่สุดในโลกถูกสร้างขึ้นด้วยตัวแปรของ Python (Stackless Python) โดยมีองค์ประกอบหลักเท่านั้น (เช่นไลบรารีกราฟิก) ที่เขียนด้วย C ++ ถ้า Python สามารถจัดการกับมันได้แน่นอนมันสามารถจัดการกับแอปพลิเคชันเว็บของคุณ


+1 ขอบคุณ เกี่ยวกับ C ++ ดูความคิดเห็นของฉันในคำตอบ Jesper Mortensen ยิ่งไปกว่านั้นแม้ว่า Python จะใช้งานที่ฝั่งเซิร์ฟเวอร์ของ Eve Online (ฉันรู้เรื่องนี้มาก) AFAIK มันจัดการเฉพาะรหัสการเล่นเกม (ที่มีขนาดใหญ่) และส่วนอื่น ๆ เป็นจริงใน C ++ รหัสกราฟิกอยู่บนฝั่งไคลเอ็นต์ดังนั้น C ++ จึงเป็น alsmot ซึ่งจำเป็นสำหรับประสิทธิภาพกราฟิกประเภทดังกล่าว ดังที่ฉันพูดไปดูหน้าเหตุผล CPPCMS เกี่ยวกับสาเหตุที่ฉันเลือก ถ้าฉันจะทำตามคำแนะนำของคุณฉันจะต้องเขียนใบสมัครของฉันสองครั้งในขณะที่ฉันรู้อยู่แล้วว่ามันหิวมาก นอกจากนี้ฉันเข้าใจข้อเสียและฉันก็สบายดี
Klaim

3

ไม่มีใครสามารถตอบส่วน "เมื่อใดที่ฉันควรเปลี่ยน" - ขึ้นอยู่กับโหลดของคุณประสิทธิภาพของรหัสแอปพลิเคชันของคุณ ฯลฯ

NGinx ดูเหมือนจะมีประสิทธิภาพมากกว่า Apache

nginx ใช้กระบวนการเดียว (หรือกระบวนการของผู้ปฏิบัติงานจำนวนน้อยมาก) เพื่อจัดการการเชื่อมต่อลูกค้าทั้งหมดโดยใช้ I / O ที่มีเหตุการณ์ Apache มีโมดูล "Multi-Processing" หลายแห่งให้เลือกใช้ แต่พวกมันทั้งหมดพึ่งพากระบวนการหลายอย่าง / หลายเธรด ดังนั้นโดยทั่วไป Apache จะใช้ RAM และ CPU มากกว่า nginx สำหรับการจัดการการเชื่อมต่อ HTTP พื้นฐาน คุณจะได้รับภาพรวมของการจัดการการเชื่อมต่อที่แตกต่างกันวิธีการบนหน้า C10K Kegel ของ

เว็บแอปพลิเคชั่นที่เน้นประสิทธิภาพมาก (ใช้ C ++ กับ CPPCMS)

ฉันขอแนะนำอย่างยิ่งให้คุณพิจารณาทำ webapp พื้นฐานในภาษาระดับสูงกว่า (Python หรือ Ruby, Scala) และใช้คิว messsage เพื่อส่งตั๋วงานไปยังเครื่องจักรของผู้ปฏิบัติงานซึ่งจัดการงาน "เน้นประสิทธิภาพ" แบบอะซิงโครนัส

NGinx จะเป็นตัวเลือกที่ดีที่สุดเมื่อคุณต้องการโหลดบาลานซ์

nginx เป็น load balancer ที่ดี แต่มีตัวเลือกมากมายในพื้นที่นั้น

ฉันสามารถใช้ Apache และ NGinx บนเครื่องเดียวกันได้โดยไม่มีปัญหาหรือไม่?

ใช่. เพียงแค่เรียกใช้พวกเขาในหมายเลขพอร์ต IP ที่แตกต่างกันและ / หรือที่อยู่ IP


"ฉันขอแนะนำอย่างยิ่งให้พิจารณาทำ webapp พื้นฐานเป็นภาษาระดับสูงกว่า"> ฉันไม่ได้บอกว่ามันเป็น webapp พื้นฐาน - มันไม่สำคัญเลย หากคุณเห็นเหตุผลในการใช้ CPPCMS ผู้เขียนกรณีจุดไม่กี่ที่มันอาจมีประโยชน์และฉันในกรณีเหล่านั้น ฉันได้พิจารณาทางเลือกอื่น แต่พบว่าแพงกว่าการใช้ C ++ อย่างน้อยก็ในรูปแบบของเว็บแอพที่ฉันเขียน ดังนั้นมันจึงไม่ใช่ส่วนหนึ่งของคำถาม แต่ฉันเข้าใจคำแนะนำของคุณและให้สิ่งเดียวกันกับคนที่ถามฉันว่าพวกเขาควรใช้ C ++ สำหรับเว็บแอปหรือไม่ ฉันวางแผนที่จะใช้ Python สำหรับแอพที่ง่ายกว่านี้อีก
Klaim

อย่างไรก็ตาม +1 สำหรับรายละเอียด
Klaim

@ คำประกาศ: หากคุณต้องการทราบถึงการปรับปรุงประสิทธิภาพ "ลำดับความสำคัญ" ที่อ้างสิทธิ์เหนือการใช้ C # / Java ที่ได้รับการปรับมาอย่างดีแล้วให้ดูว่าคุณสามารถเรียกใช้ CppCMS และรหัสแอปพลิเคชันที่อยู่ระหว่างดำเนินการกับเว็บเซิร์ฟเวอร์ของคุณหรือไม่ nginx / Apache หน้า CppCMS ดูเหมือนจะแสดง FastCGI เป็นการเชื่อมต่อระหว่างเว็บเซิร์ฟเวอร์และ CppCMS; และจริง ๆ แล้ว FastCGI ไม่เร็ว ...
Jesper M

> แนวคิดที่น่าสนใจ คำแนะนำส่วนใหญ่คือคุณควรใช้ fastcgi เพราะเร็วกว่าทางเลือกอื่น ฉันจะตรวจสอบว่าฉันสามารถทำเช่นนี้อาจจะเห็นกับผู้เขียน CPPCMS ว่าทำไมเขาคิดว่ามันเร็วที่สุด
Klaim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.