ระหว่าง Apache กับ Nginx จะเลือกอันไหนเป็นเว็บเซิร์ฟเวอร์ดี?
ในยุคที่โลกทั้งใบถูกเชื่อมต่อเข้ากันผ่านเครือข่ายอินเทอร์เน็ตและแลกเปลี่ยนข้อมูลข่าวสารผ่านทาง World Wide Web ซอฟต์แวร์ที่สำคัญเป็นอย่างมาก ที่ใช้ในการให้บริการข้อมูลใน WWW ก็คือเว็บเซิร์ฟเวอร์นั้นเอง แล้วถ้าเราจะพัฒนาเว็บไซต์ดีๆ หรือแอฟพลิเคชั่นเจ๋งๆ สักอันก็ควรจะต้องหาเว็บเซิฟร์เวอร์ที่ดีที่สุดมาใช้งานแน่นอนและในปัจจุบันก็มีเว็บเซิร์ฟเวอร์สองอันที่ได้รับความนิยมอย่างแพร่หลายก็คือ Apache และ Nginx นั่นเอง และแม้ว่าผลการเบนมาคจะออกมาว่า Nginx ทำงานได้มีประสิทธิภาพได้ดีกว่า Apache พอสมควร แต่อย่างไรก็ตามการตัดสินใจเลือกใช้เว็บเซิร์ฟเวอร์ก็ยังไม่ง่ายซะทีเดียวเพราะยังมีปัจจัยอื่นๆ อีกมากมายที่ต้องนำมาพิจารณา วันนี้ผมก็เลยจะลองนำเว็บเซิร์ฟเวอร์ทั้งสองตัวนี้มาเปรียบเทียบอย่างมีหลักการ ตามหลักมารตฐาน ISO/IEC9126 ปี 2000 ที่ได้ระบุคุณลักษณะต่างๆ ของซอฟต์แวร์ที่มีคุณภาพเอาไว้ อ่านคร่าวๆ ได้ที่ https://en.wikipedia.org/wiki/ISO/IEC_9126- ด้านฟังก์ชั่นการทำงาน (Functionality) หมายถึงคุณสมบัติที่ฟังก์ชันการทำงานของซอฟแวร์นั้นสามารถตอบสนองความตั้งการได้มากน้องเพียงใด ซึ่งหน้าที่หลักๆ ของเว็บเซิร์ฟเวอร์ก็คือให้บริการข้อมูลข่าวสารผ่านโปรโทรคอล HTTP(Hypertext transfer protocol) เนื่องจากการใช้งานเว็บของคนเปลี่ยนไปจากเริ่มต้นที่ใช้งานข้อมูลแบบ static ที่ผู้ใช้เปลี่ยนแปลงข้อมูลอะไรในเว็บเองไม่ได้ จนกระทั่งผู้ใช้สามารถเปลี่ยนแปลงข้อมูลเองได้ตลอดเวลาอย่างที่พบเห็นได้ในทุกวันนี้เช่นใน Facebook การทำให้ได้มาซึงความสามารถแบบนี้จำเป็นต้องเพิ่งพาภาษาหรือระบบอื่นๆ มาคอยประมวลผลคำร้องขอต่างๆ จากผู้ใช้เช่น PHP, Python, Ruby, CGI ทำให้การรองรับสิ่งต่างๆ เหล่านี้ เป็นสิ่งที่จะต้องพิจารณาด้วยสำหรับด้านฟังก์ชั่นการทำงาน
Apache – ได้ถูกออกแบบมาให้รองรับการทำงานของ HTTP ได้อย่างครบถ้วน อีกทั้งยังออกแบบมาให้สามารถเพิ่มเติมความสามารถต่างๆ ผ่านทางระบบโมดูล โดยโมดูลจะสามารถประสานการทำงานภายเว็บเวอร์ได้โดยตรงภายในโปรเซสของเว็บเซิร์ฟเวอร์เองไม่ต้องเพิ่งพาการประมวลผลภายนอก ทำให้รองรับการประมวลผลต่างๆ เช่น PHP, Python, Ruby, CGI ได้แบบเนทีฟ ได้โดยการเพิ่มลดความสามารถของเว็บเซิร์ฟเวอร์นี้ทำได้โดยไม่ต้องรีสตาทร์เซิร์ฟเวอร์เลย ทำให้มีความสามารถในการทำงานร่วมกับซอฟแวร์อื่น (Interoperability) มีสูงมาก จะเสียหน่อยก็ตรงที่ยังไม่รองรับ HTTP/2 (HTTP เวอร์ชั่น 2) ที่เพิ่งออกเป็นมารตฐานจริงเมื่อไม่กี่วันก่อนในตัวเองต้องเพิ่งพาโมดูลอยู่
Nginx – การทำงานก็รับรอง HTTP ได้ครบถ้วนเหมือนกัน แต่เนื่องจากการออกแบบที่ค่อนข้างต้องการประสิทธิภาพที่สูงทำให้ต้องตัดการประมวลผลที่เป็นด้วยตัวเองออกไป แล้วไปให้โปรเซสอื่นหรือระบบอื่นจัดการประมวลผลแบบ Dynamic ให้แทนเช่น FastCGI, SCGI, uWSGI, memcache แต่อย่างไรก็ตาม Content ที่เป็น static ก็จะประมวลผลได้เร็วขึ้นด้วย(มีเก็บไว้ในแรมด้วย) และ Nginx ได้พัฒนามาพร้อม HTTP/2 มาด้วยตั้งแต่สมัยที่เรียกว่า SPDY จนกลายมาเป็นมารตฐานในปัจจุบัน ทำให้ในอนาคตอันใกล้ของ Nginx สดใสแน่นอนด้านความปลอดภัย โดยส่วนตัวผมคิดว่าทั้งสองตัวมีความสามารถในการรองรับมารตฐานในด้านความปลดภัยพอๆ กัน จึงไม่ค่อนเป็นประเด็นเพราะการรักษาความปลอดภัยในระดับแอฟพลิเคชันเองนั้นสำคัญกว่าในระดับเว็บเซิร์ฟเวอร์ - ด้านความน่าเชื่อถือ (Reliability) หมายถึงความสามารถในการทำงานได้อย่างมีประสิทธิภาพภายใต้สภาวะที่กำหนดเอาไว้ พูดง่ายๆ ก็คือไม่ใช้อยู่แล้วจู่ๆ ก็หยุดทำงานไปเฉยๆ เลย หรือไม่ถ้าเจ๊งจริงๆ ก็กู้คืนได้ มีระบบสำรองอะไรประมาญนี้ซึ่งทั้งสองตัวก็สามารถทำงานได้น่าเชื่อถือค่อนข้างมากถึงมากที่สุด โดยจะพังจริงๆ ก็ในระดับแอพพลิเคชั่นเช่น เชียน PHP ผิดเป็นต้น Apache มีโมดูลต่างๆ ที่เสถีรมาก แต่ Nginx จะดีกว่าเล็กน้อยเมื่อใช้กับ Dynamic content ที่ได้มีการแยกโปรเซสออกไปทำงาน ลดความเสี่ยงที่จะล่มทั้งเว็บเซิร์ฟเวอร์ได้นิดนึง
- ด้านการใช้งาน (Usability) ว่าด้วยการใช้งานว่ายากง่ายใหม มีอะไรช่วยผู้ใช้ทำงานได้ง่ายๆ ไหม
Apache – ที่เกินก่อนตั้งแต่สมัยปี 1995 ย่อมมีเอกสารคู่มือและบุคคลที่มีประสบการณ์ช่วยเหลือเมื่อยามเกิดปัญหามากกว่า การตั้งค่าผ่าน config ที่ค่อนข้างซับซ้อนพอสมควรก็มีการเตรียมเอาไว้แล้วไช่ใน package ของ Linux Server ต่างๆ อย่าง Ubuntu ก็ลงแล้วใช้งานได้เลยแทบจะไม่ต้องปรับค่าอะไรเพิ่ม เรียกว่าพร้อมตั้งแต่ออกจากกล่อง
Nginx – เกิดทีหลังทำให้เห็นความยากลำบากในการใช้งานของ Apache ทำให้ระบบการตั้งค่าต่างๆ นั้นง่ายๆ และสั้นลงมาก แต่ด้วยความที่มีสมบูรณ์พร้อมในตัวเองทำให้ต้องเพิ่มการตั้งค่าต่างๆ ไปเองเช่นกันทำให้รัน PHP ผ่าน FPM เป็นต้น สุดท้ายแล้วก็ต้องออกแรงเยอะกว่า Apache อยู่ดีถ้าจะให้ทำงานได้ครบถ้วน คู่มือการทำวานก็น้อยกว่า จะเพิ่งพาคนที่พัฒนามันขึ้นมาก็จ้องแต่จะขายของเพิ่ม - ด้านการประสิทธิภาพการทำงาน(Efficiency) ทั้งด้านการใช้ทรัพยากร เวลาตอบสนอง ประสิทธิภาพการใช้งานโดยตรงนั่นเอง
Apache – เนื่องจากใช้โปรเซสเดียวในการทำงานแล้วใช้เธรดแยกกันไปทำงานหลายๆ เธรดทำให้มีส่วนเกินที่ต้องใช้จัดการพวกนี้อยู่ (ดูภาพด้านล่าง) ทำให้ในสภาวะที่รับผู้ใช้งานจำนวนมากไม่สามารถทำงานได้ดีนัก แต่ในระดับหลักร้อยนี่แทบไม่เห็นความแตกต่างๆ ใดๆ มากนัก
Nginx – นอกจากจะประมวลผลใน Static ได้เร็วแล้ว ยังทำงานแบบ Asynchronous โดยไม่มีการหยุดรออะไรทั้งนั้นแยกๆ กันไปทำงานทันทีเลย ทำให้ใช้ทรัพยาน้อยกว่าทำงานได้เร็วกว่า รองรับจำนวนผู้ใช้งานได้หลักหลายพันถึงหมื่นเลยทีเดียว ฉะนั้นแล้วด้านประสิทธิภาพ Nginx ชนะขาดลอย - ด้านการบำรุงรักษา (Maintainability) หมายถึงความสามารถในกับปรับปรุงเปลี่ยนแปลงให้ซอฟต์แวร์เป็นไปตามตวามต้องการใหม่
Apache – ได้ออกแบบมาเป็นโมดูลอยู่แล้วถ้าจะปรับเปลี่ยนอะไรที่ไม่ไช่แกนหลักก็ทำได้ง่ายๆ เลยไม่ต้องรีสตาทร์ด้วยซ้ำ package ของระบบปฏิบัติการที่ออกมาก็ทันสมัยเมื่อเทียบกับโค้ดหลัก อัพเดตบ่อย อุดรูรั่วได้ทันทั่วที มีเครื่องมือในการมอนิเตอร์ใช้กันอย่างแพร่หลายให้ใช้ฟรีๆ ทำให้ความสามารถด้านนี้กินขาด
Nginx – ได้มีการออกแบบให้เป็นโมดูลเช่นกันแต่ไม่ได้ยืดหยุนมากนักทำให้ต้องถึงกับต้องไพล์ใหม่เลยถ้าจะต้องการเพิ่มหรือแก้ไขโมดูลต่างๆ ไม่ค่อยสะดวกอย่างแรง ถ้าจะหวังเพิ่งอัพเดตจาก package ของ OS ก็จะได้ล้าหลังไปหลายเวอร์ชั่นสุดท้ายต้องคอมไฟล์เอง มอนิเตอร์ถ้าอยากให้ได้ซัพพอร์ตดีจริงก็จ่ายตังค์ $$$ ซื้อได้ - ด้านความหอบหิ้วได้ (Portability) คือการเอาไปทำงานได้หลายแพลตฟอร์ม ปรับตัวเข้ากับระบบอื่นได้ อยู่กับระบบอื่นได้โดยไม่ไปตีคนอื่นจนต้องอยู่บนเรือกลางทะเล (นั่นมันโรฮินญา)
Apache – เกิดมานาน คนพอร์ตไปทุกที่แล้ว มีโมดูลที่ไส่ได้เรื่อยๆ เปลี่ยนเป็นอย่างอื่นก็ง่าย ติดตั้งก็ง่าย บาง Linux Server แทบจะประเคนไส่พานมาให้จะไม่ลงก็เสียดายของ เรียกได้ว่าเพียบพร้อมด้านนี้
Nginx – ยังพอร์ตไปไม่ครบนัก ติดตั้งไม่ง่ายนัก การทำงานร่วมกับองค์ประกอบอื่นยังต้องตั้งค่าอีกเยอะ แต่ก็มีการพัฒนาขึ้นอยู่เรื่อยๆ
การใช้ Apache ร่วมกับ Nginx
สามารถทำได้โดยจะเป็นการดึงข้อดีของแต่ละตัวมารวมกัน กันตั้งค่าพื้นฐานคือใช้ Nginx รับโหลดจาก User ด้านหน้า ให้ Nginx จัดการไฟล์ที่เป็น static แล้วใช้ Nginx เป็น reverse proxy ส่งต่อให้ Apache ประมวลผล Dynamic content ได้ ช่วยให้เพิ่มขนาดการรับโหลดของ Backend ได้อย่างมากๆ
สามารถทำได้โดยจะเป็นการดึงข้อดีของแต่ละตัวมารวมกัน กันตั้งค่าพื้นฐานคือใช้ Nginx รับโหลดจาก User ด้านหน้า ให้ Nginx จัดการไฟล์ที่เป็น static แล้วใช้ Nginx เป็น reverse proxy ส่งต่อให้ Apache ประมวลผล Dynamic content ได้ ช่วยให้เพิ่มขนาดการรับโหลดของ Backend ได้อย่างมากๆ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น