Apache vs Nginx


29

ฉันได้ตรวจสอบความแตกต่างระหว่าง Apache และ Nginx เมื่อเร็ว ๆ นี้และสับสนเกี่ยวกับสิ่งที่ฉันควรเลือก

ฉันทำการค้นหาบางอย่างแล้ว แต่ไม่มีการเปรียบเทียบที่ชัดเจนระหว่างทั้งสองและฉันสงสัยว่าใครบางคนที่นี่สามารถให้มุมมองเกี่ยวกับความแตกต่างระหว่างทั้งสอง

ความรู้ในปัจจุบันของฉันทำให้ฉันเข้าใจว่า mod_php นั้นเร็วกว่าและปลอดภัยกว่า fastcgi อย่างไรก็ตาม Apache นั้นแย่กว่ามากเมื่อมันมาถึงการเชื่อมต่อและการใช้หน่วยความจำพร้อมกัน

เว็บไซต์ของฉันใช้โพลจำนวนมาก แต่มีเว็บที่ไม่ใช่ AJAX (เช่น Apache ที่มีโพลแบบยาวอยู่ด้านบน)

โซลูชันดั้งเดิมของฉันสำหรับปัญหาหน่วยความจำของ Apaches คือการส่งการสำรวจแบบยาวผ่าน node.js จากนั้นรับ node.js เพื่อเข้าถึง Apache ทุก 2 วินาทีในกรณีนี้ Apache จะไม่มีการเชื่อมต่อที่เปิดอยู่ แต่แทนที่จะเป็น node.js ฉันได้ตระหนักว่านี่อาจไม่ดีพอและกำลังมองหาวิธีแก้ไขปัญหาที่แตกต่างกัน ฉันยังคงสนใจว่าแนวคิดดั้งเดิมของฉันจะใช้ได้หรือไม่

แล้วเว็บไหนดีกว่ากัน? Apache หรือ Nginx

อัปเดต: คำแนะนำทั้งหมดที่ให้ไว้นั้นดีและถูกต้อง ฉันได้ไปกับแนวคิดที่สองดั้งเดิมซึ่งใช้เซิร์ฟเวอร์ Nginx แบบเต็ม ฉันพอใจที่เป็นเซิร์ฟเวอร์เฉพาะฉันไม่สามารถประสบปัญหาด้านความปลอดภัยจาก fastcgi และเนื่องจากสคริปต์การสำรวจความยาวของฉันจำเป็นต้องเขียนใน PHP ฉันต้องการเซิร์ฟเวอร์ที่สามารถจัดการกับการเชื่อมต่อพร้อมกันที่โหลดสูงและ Apache ไม่สามารถทำได้ ฉันเปลี่ยนโครงสร้างมันจะยังคงหิวอยู่ในความทรงจำ

ฉันทำเครื่องหมายคำตอบของ Martin F ตั้งแต่เขาให้คำตอบที่ชัดเจนและครบถ้วนเกี่ยวกับคำถามของฉันซึ่งฉันรู้สึกว่าเขาสมควรได้รับเครื่องหมายอย่างไรก็ตามคำตอบทั้งสามข้อนั้นดีและถูกต้องและจะตรวจสอบการใช้ reverse proxy สำหรับเว็บไซต์อื่นที่ฉันเป็นเจ้าของ เนื่องจากฉันเพิ่งพบสิ่งที่คูลมากที่ Nginx สามารถทำได้ในการมอบฉันทะ

ขอบคุณ

คำตอบ:


28

คุณดูเหมือนจะมีความเข้าใจผิดบางประการซึ่งฉันรู้สึกว่าจำเป็นต้องได้รับการแก้ไข

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

ถ้าโลกเป็นขาวดำฉันจะบอกว่าไปกับการติดตั้ง nginx บริสุทธิ์และรวบรวม php ด้วย php-fpm หากคุณใช้งาน Apache อยู่แล้วให้ทำ nginx เป็น reverse proxy ให้กับ apache และคุณอาจประหยัดเวลาในการเซ็ตอัพสองสามชั่วโมงและความแตกต่างของประสิทธิภาพจะเล็กน้อย

แต่สมมติว่าโลกเป็นขาวดำเป็นวินาทีเพราะมันทำให้การตั้งค่าที่ยอดเยี่ยมกว่านี้มาก คุณใช้ nginx + php-fpm สำหรับเว็บเซิร์ฟเวอร์ของคุณ เพื่อแก้ปัญหาการอัพโหลดคุณใช้โมดูลอัพโหลดและโมดูลความคืบหน้าการอัปโหลดสำหรับ nginx ซึ่งหมายความว่าเว็บเซิร์ฟเวอร์ของคุณยอมรับการอัปโหลดและส่งผ่านไฟล์พา ธ ไปยัง PHP เมื่อเสร็จสิ้นดังนั้นไฟล์ไม่จำเป็นต้องสตรีมระหว่าง nginx และ PHP ผ่านโปรโตคอล fastcgi (ฉันมีสิ่งนี้ในการตั้งค่าแบบสดและมันใช้งานได้ดีมาก btw!)

สำหรับผู้ใช้ที่ดาวน์โหลดคุณใช้คุณสมบัติคล้ายกับ x-send-file ที่เรียกว่า x-accel-redirect, โดยพื้นฐานแล้วคุณต้องทำการพิสูจน์ตัวตนของคุณใน PHP และตั้งค่าส่วนหัวที่ nginx เลือกและเริ่มถ่ายโอนไฟล์นั้น PHP หยุดการทำงานและเว็บเซิร์ฟเวอร์ของคุณกำลังจัดการกับการถ่ายโอน (อีกครั้งฉันมีสิ่งนี้ในการตั้งค่าแบบสดและมันใช้งานได้ดี)

สำหรับการกระจายไฟล์ในเซิร์ฟเวอร์หรือการดำเนินการระยะยาวอื่น ๆ ที่เราตระหนักดีว่า PHP ไม่เหมาะจริงๆดีที่สุดสำหรับการนี้เพื่อให้เราติดตั้ง gearman ซึ่งเป็นเซิร์ฟเวอร์งานที่สามารถกระจายงานระหว่างคนงานในเซิร์ฟเวอร์ต่างกันคนงานเหล่านี้สามารถเขียนในใด ๆภาษา. ดังนั้นคุณสามารถสร้างผู้ปฏิบัติงานแจกจ่ายและวางไข่ 5 คนโดยใช้หน่วยความจำทั้งหมด 200 KB แทนที่จะเป็น 100 MB PHP ที่จะใช้ หวาน. (ฉันยังมีการแสดงสดอยู่ดังนั้นจึงเป็นไปได้จริงทั้งหมด)

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

ฉันขอแนะนำ nginx แต่ฉันคิดว่าคุณควรพิจารณาตัวเลือกอื่น ๆ สำหรับปัญหาอื่น ๆ ของคุณหากคุณมีปัญหาเรื่องการปรับขนาดหรือประสิทธิภาพการทำงานอย่าลังเลที่จะเขียนถึงฉัน ฉันไม่ทราบว่าคุณสามารถส่งข้อความผ่านที่นี่ แต่อย่างอื่นเขียนฉันที่ martin@bbtn.us เพราะฉันไม่ผิดพลาดเซิร์ฟเวอร์ stalk สำหรับสิ่งที่ไม่ได้ติดแท็กด้วย nginx :)


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

ฉันเคยดูเรื่องนี้: joeandmotorboat.com/2008/02/28/…และสิ่งนี้: blog.webfaction.com/a-little-holiday-presentและมันทำให้ฉันคิดว่าตัวเองสามารถอยู่ได้นาน สำรวจความคิดเห็นในใจของฉันจริงๆ ไม่เป็นปัญหาหน่วยความจำเดียวแตกต่างจาก Apache :)
Sammaye

รอดังนั้นคุณบอกว่าฉันจะทำให้คนงานหลายเธรดในจาวาและ PHP สามารถทำงานได้อย่างสมบูรณ์? ฉันหมายถึงปัญหาที่ใหญ่ที่สุดที่ฉันเห็นคือเซิร์ฟเวอร์เนื่องจากฉันได้รับปัญหาหน่วยความจำขนาดใหญ่กับ Apache โดยใช้การสำรวจแบบยาวซึ่งเป็นเรื่องปกติ ... ofc แก้ไขโดย Nginx
Sammaye

1
โดยพื้นฐานแล้วใช่ฉันมีพนักงานแจกจ่ายไฟล์ที่เขียนด้วยภาษาซีโดยใช้ส่วนขยายเกียร์สำหรับ PHP ฉันส่งงานกระจายไปยังเซิร์ฟเวอร์งานเกียร์แมนและส่งไปยังพนักงานซึ่งสามารถเขียนเป็นภาษาใดก็ได้ PHP, Java, C, ฯลฯ ผู้ปฏิบัติงานนี้จะทำหน้าที่และรายงานสถานะกลับไปที่เกียร์ซึ่งรายงานกลับไปที่ PHP (ยกเว้นงานพื้นหลังที่ได้รับเลือกซึ่งในกรณีนี้ PHP จะจบลงโดยไม่ต้องรอ)
Martin Fjordvald

2
ฉันรู้ว่านี่เป็นการโพสต์เก่า แต่ฉันต้องบอกว่านี่เป็นหนึ่งในโพสต์ข้อมูลมากที่สุดที่ฉันได้พบในหัวข้อของ nginx vs apache ธานส์มาร์ติน +1
Akoi Meexx

5

ฉันขอแนะนำให้เรียกใช้ nginx เป็น reverse proxy มันจะจัดการไฟล์สแตติกและแคชทั้งหมดของคุณ (ซึ่งเร็วกว่า Apache / โอเวอร์เฮดหน่วยความจำน้อยกว่า) จากนั้นส่งต่อคำขอทั้งหมดสำหรับเนื้อหาแบบไดนามิกไปยัง Apache


ใช่นี่คือสิ่งที่คนส่วนใหญ่ดูเหมือนจะทำ ATM แน่นอนฉันจะต้องมองเข้าไปในนี้ :)
Sammaye

1
อย่าลืมติดตั้ง mod_rpaf สำหรับ Apache เพื่อให้คุณสามารถส่งผ่านที่อยู่ IP ของลูกค้าเพื่อวัตถุประสงค์ในการเข้าสู่ระบบ (มิฉะนั้นบันทึกของ Apache จะแสดงคำขอทั้งหมดจาก 127.0.0.1) เพิ่มสิ่งต่อไปนี้ลงใน nginx config: proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for
Greg Annandale

ฉันสงสัยสิ่งหนึ่งก่อนที่จะลองคืนนี้ หากฉันกำหนดเส้นทางผ่าน Nginx ไปยัง Apache ซึ่งให้บริการ PHP ของฉันนั่นหมายความว่าการสำรวจระยะยาวจะยังคงมีปัญหาเช่นเดียวกับ Apache หรือเรียกใช้ในพร็อกซีย้อนกลับทำให้ Apache ทำหน้าที่แตกต่างไปจากเดิมหรือไม่?
Sammaye

1

ฉันไม่แน่ใจว่า mod_php นั้นเร็วกว่าตัวเลือกอื่นคุณอ่านข้อความนี้ที่ไหน ฉันได้ทำการทดสอบในห้องปฏิบัติการด้วย nginx + php-fpm และจากสิ่งที่ฉันวัดได้ก็จะทำให้การตั้งค่าอื่น ๆ ดีขึ้น

ดูการตั้งค่านี้: http://interfacelab.com/nginx-php-fpm-apc-awesome/

ฉันตั้งค่ามันเกือบจะเหมือนกันยกเว้นว่าฉันใช้แพ็คเกจ PHP จากhttp://www.dotdeb.org/ - ซึ่งมีแพ็คเกจ php-fpm และสคริปต์ init พร้อมใช้งาน ฉันไม่ได้ใช้ memecache หรือ syck


stackoverflow.com/questions/78108/…ได้จากที่นี่และฉันได้ตรวจสอบคู่มือ php แล้วและมันก็บอกว่า php_mod ให้ประโยชน์ที่สำคัญกว่า cgi เวอร์ชั่น การตั้งค่าของคุณดูดี มันดูง่ายมากเช่นกัน ฉันจะดูเป็นมัน :)
Sammaye

2
มันระบุ CGI ที่เป็นได้ช้ากว่าโมดูลในตัว - ไม่ FastCGI :)
pauska

1
ถ้าคุณกังวลเกี่ยวกับกระบวนการของ PHP ที่กำลังจะตาย (หรือหมดเวลา) FastCGI (หรือ PHP-FPM) คือหนทางที่จะไป มันสามารถฆ่ากระบวนการผลิตเด็กที่ตายแล้วโดยไม่ขัดจังหวะกิจกรรมอื่น ๆ
pauska

1
ใช่. หรือว่ามันขึ้นอยู่กับ คุณจะประมวลผลคำขอช้าจำนวนกี่ครั้งในเวลาเดียวกัน ตั้งค่าเธรด FPM PHP สูงสุดเป็นบวกด้วยจำนวน cgi "เร็ว" ที่คุณต้องการ ฉันเคยได้ยินเกี่ยวกับผู้ใช้ PHP-FPM 200 childs บนเซิร์ฟเวอร์ที่มี 4GB RAM ดังนั้นฉันไม่ต้องกังวลเกี่ยวกับเรื่องนี้ถ้าฉันเป็นคุณ PHP เวอร์ชั่นถัดไป (5.3.3) จะรวม PHP-FPM ตามมาตรฐานซึ่งมีเอ็นจิ้น adpative รวมอยู่ด้วย - มันจะขยายตามจำนวนคำขอที่คุณรออยู่
pauska

1
ฉันจะเรียกใช้ผ่านเซิร์ฟเวอร์หลายเครื่องได้อย่างง่ายดาย (อาจมากถึง 10) แต่ถ้าฉันสามารถบรรจุคำขอได้ 200 คำขอที่สามารถโพลแบบยาวบนเซิร์ฟเวอร์ 4GB นี่ควรจะเกือบครึ่งหนึ่งของเซิร์ฟเวอร์ 20 เครื่องที่ฉันต้องใช้ Apache hmmmm ... ฉันจะต้องทดสอบสิ่งนี้คืนนี้
Sammaye
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.