5 เคล็ดลับในการเพิ่มประสิทธิภาพของเว็บเซิร์ฟเวอร์ Apache ของคุณ
ตามรายงานล่าสุดโดย Netcraft (บริษัทอินเทอร์เน็ตที่มีชื่อเสียงซึ่งให้บริการสถิติการใช้งานเว็บเบราว์เซอร์อื่นๆ) Apache ยังคงเป็นเว็บเซิร์ฟเวอร์ที่ใช้กันอย่างแพร่หลายมากที่สุดในบรรดาไซต์และคอมพิวเตอร์ที่เชื่อมต่อกับอินเทอร์เน็ต
นอกจากนี้ Apache ยังคงพบกับการเติบโตที่ใหญ่ที่สุดในบรรดาเว็บเซิร์ฟเวอร์ชั้นนำ ตามมาด้วย Nginx และ IIS ดังนั้น หากคุณเป็นผู้ดูแลระบบที่รับผิดชอบการจัดการการติดตั้ง Apache คุณจำเป็นต้องรู้วิธีตรวจสอบให้แน่ใจว่าเว็บเซิร์ฟเวอร์ของคุณทำงานเต็มประสิทธิภาพสูงสุดตามความต้องการของคุณ (หรือลูกค้าของคุณ)
ในบทความนี้ เราจะพูดถึงเคล็ดลับเล็กๆ น้อยๆ ที่จะช่วยให้คุณมั่นใจได้ว่า Apache จะทำงานได้อย่างราบรื่น และสามารถรองรับคำขอจำนวนที่คุณคาดหวังจากไคลเอนต์ระยะไกลได้
อย่างไรก็ตาม โปรดทราบว่า Apache ไม่ได้ได้รับการออกแบบโดยมีวัตถุประสงค์เพื่อตั้งค่าบันทึกเกณฑ์มาตรฐาน แต่ถึงกระนั้นก็ยังสามารถให้ประสิทธิภาพสูงในเกือบทุกกรณีการใช้งานที่คุณนึกออก
เคล็ดลับ #1: อัปเดต Apache ให้เป็นเวอร์ชันล่าสุดอยู่เสมอ
ดำเนินไปโดยไม่ได้บอกว่าการติดตั้ง Apache เวอร์ชันล่าสุดอาจเป็นหนึ่งในสิ่งแรกที่คุณต้องพิจารณา ณ วันที่ 19 พฤศจิกายน 2015 Apache เวอร์ชันล่าสุดที่มีอยู่ในที่เก็บ CentOS 7 คือ 2.4.6 ในขณะที่ใน Debian's คือ >2.4.10.
อย่างไรก็ตาม อาจมีการปรับปรุงล่าสุดหรือแก้ไขข้อบกพร่องที่เพิ่มเข้าไปในเวอร์ชันเสถียรที่เพิ่งเปิดตัว ซึ่งจากนั้นจะพร้อมให้ดาวน์โหลดและติดตั้งจากแหล่งที่มา คำแนะนำในการคอมไพล์และการติดตั้งมีให้ที่นี่ด้วย เพียงจำไว้ว่าหากคุณเลือกวิธีการอัพเดตนี้ คุณอาจต้องการสำรองไฟล์การกำหนดค่าปัจจุบัน/ไซต์/โฮสต์เสมือน เพื่อเป็นการป้องกันไว้ก่อน
ไม่ว่าในกรณีใด คุณสามารถตรวจสอบเวอร์ชันที่ติดตั้งอยู่ในปัจจุบันได้ดังนี้:
httpd -v [On RedHat/CentOS based systems]
apache2 –v [On Debian/Ubuntu based systems]
ตามหลักทั่วไป ให้ยึดวิธีการอัปเดตที่ผู้จัดการแพ็คเกจของการกระจายที่คุณเลือกไว้ (yum update httpd
หรือ aptitude safe-upgrade apache2
สำหรับ CentOS หรือ Debian ตามลำดับ) เว้นแต่จะไม่มีวิธีอื่น คุณสามารถอ่านบันทึกประจำรุ่นล่าสุดได้ในส่วนเอกสารประกอบ Apache ในเว็บไซต์โครงการเซิร์ฟเวอร์ Apache HTTP
เคล็ดลับ #2: หากคุณใช้เคอร์เนลที่เก่ากว่า 2.4 ให้พิจารณาอัปเกรดทันที
ทำไม เคอร์เนลเวอร์ชัน 2.4 ขึ้นไปมีการเปิดใช้การเรียกระบบเคอร์เนล sendfile เป็นค่าเริ่มต้น ซึ่งในทางกลับกัน จะอำนวยความสะดวกในการถ่ายโอนไฟล์เครือข่ายประสิทธิภาพสูง (ซึ่งเป็นที่ต้องการในบริบทของการสื่อสารระหว่างเว็บเซิร์ฟเวอร์กับไคลเอนต์) และช่วยให้ Apache สามารถส่งมอบเนื้อหาแบบคงที่ได้เร็วขึ้น และด้วยการใช้งาน CPU ที่ต่ำกว่าโดยการดำเนินการอ่านและส่งพร้อมกัน
คุณสามารถดูเคอร์เนลที่ติดตั้งอยู่ในปัจจุบันด้วย:
uname -r
และเปรียบเทียบกับเคอร์เนลเสถียรล่าสุดใน www.kernel.org (4.3 ในขณะที่เขียนบทความนี้)
แม้ว่าจะเป็นกระบวนการที่ไม่ได้มีไว้สำหรับผู้เริ่มต้น แต่การอัพเกรดเคอร์เนลของคุณเป็นแบบฝึกหัดที่น่าสนใจในการเรียนรู้เพิ่มเติมเกี่ยวกับระบบภายในของ Linux
เคล็ดลับ #3: เลือก Multi-Processing Module (MPM) ที่เหมาะกับกรณีของคุณมากที่สุด
ในทางปฏิบัติ MPM ขยายฟังก์ชันการทำงานแบบโมดูลาร์ของ Apache โดยการอนุญาตให้คุณตัดสินใจว่าจะกำหนดค่าเว็บเซิร์ฟเวอร์เพื่อเชื่อมโยงกับพอร์ตเครือข่ายบนเครื่อง ยอมรับคำขอจากไคลเอ็นต์ และใช้กระบวนการลูก (และเธรด ทางเลือกอื่น) เพื่อจัดการกับคำขอดังกล่าว
ตั้งแต่เวอร์ชัน 2.4 เป็นต้นไป Apache นำเสนอ MPM ที่แตกต่างกันสามแบบให้เลือก ขึ้นอยู่กับความต้องการของคุณ:
- MPM
prefork
ใช้กระบวนการย่อยหลายรายการโดยไม่มีเธรด แต่ละกระบวนการจัดการการเชื่อมต่อครั้งละหนึ่งรายการโดยไม่ต้องสร้างเธรดแยกกันสำหรับแต่ละรายการ โดยไม่ต้องลงรายละเอียดมากเกินไป เราสามารถพูดได้ว่าคุณจะต้องการใช้ MPM นี้เฉพาะเมื่อทำการดีบั๊กแอปพลิเคชันที่ใช้ หรือหากแอปพลิเคชันของคุณจำเป็นต้องจัดการกับโมดูลที่ไม่ปลอดภัยต่อเธรด เช่น mod_php - MPM
ผู้ปฏิบัติงาน
ใช้หลายเธรดต่อกระบวนการลูก โดยที่แต่ละเธรดจะจัดการการเชื่อมต่อครั้งละหนึ่งรายการ นี่เป็นตัวเลือกที่ดีสำหรับเซิร์ฟเวอร์ที่มีการรับส่งข้อมูลสูง เนื่องจากช่วยให้สามารถจัดการการเชื่อมต่อพร้อมกันได้มากขึ้นโดยใช้ RAM น้อยกว่าในกรณีก่อนหน้า - สุดท้ายนี้
เหตุการณ์
MPM จะเป็น MPM เริ่มต้นในการติดตั้ง Apache ส่วนใหญ่สำหรับเวอร์ชัน 2.4 ขึ้นไป คล้ายกับ MPM ของผู้ปฏิบัติงานตรงที่ยังสร้างหลายเธรดต่อกระบวนการย่อย แต่มีข้อดี: ทำให้การเชื่อมต่อ KeepAlive หรือ ไม่ได้ใช้งาน (ในขณะที่ยังคงอยู่ในสถานะนั้น) ที่จะจัดการโดยเธรดเดียว จึงทำให้มีหน่วยความจำว่างที่สามารถจัดสรรให้กับเธรดอื่นได้ MPM นี้ไม่เหมาะสำหรับการใช้กับโมดูลที่ไม่ปลอดภัยสำหรับเธรด เช่น mod_php ซึ่งต้องใช้ PHP-FPM แทน
หากต้องการตรวจสอบ MPM ที่ใช้โดยการติดตั้ง Apache ของคุณ คุณสามารถทำได้ดังนี้
httpd -V
รูปภาพด้านล่างแสดงว่าเว็บเซิร์ฟเวอร์นี้ใช้ prefork MPM
หากต้องการเปลี่ยนแปลง คุณจะต้องแก้ไข:
/etc/httpd/conf.modules.d/00-mpm.conf [On RedHat/CentOS based systems]
/etc/apache2/mods-available/<mpm>.load [On Debian/Ubuntu based systems]
โดยที่
และยกเลิกหมายเหตุบรรทัดที่โหลดโมดูลที่ต้องการดังนี้:
LoadModule mpm_event_module modules/mod_mpm_event.so
หมายเหตุ: เพื่อให้ MPM ของเหตุการณ์ทำงานใน Debian คุณอาจต้องติดตั้งแพ็คเกจ libapache2-mod-fastcgi จากแพ็คเกจที่ไม่ฟรี ที่เก็บ
นอกจากนี้ สำหรับ CentOS คุณจะต้องใช้ php-fpm (พร้อมด้วย fcgi และ mod_fcgid) ในขณะที่ Debian เรียกว่า php5-fpm< (พร้อมด้วย apache2-mpm-event)
สุดท้ายแต่ไม่ท้ายสุด ให้รีสตาร์ทเว็บเซิร์ฟเวอร์และบริการ php-fpm (หรือ php5-fpm) ที่เพิ่งติดตั้งใหม่:
บน RedHat/CentOS
systemctl restart httpd php-fpm && systemctl enable httpd php-fpm
บนเดเบียน/อูบุนตู
systemctl restart apache2 php5-fpm && systemctl enable apache2 php5-fpm
แม้ว่าคุณจะสามารถตั้งค่า Apache ให้ใช้ MPM ที่เฉพาะเจาะจงได้ แต่การกำหนดค่านั้นสามารถแทนที่ได้บนโฮสต์เสมือนต่อรายในลักษณะเดียวกับที่ระบุไว้ก่อนหน้านี้
เพียงวางแท็กที่เกี่ยวข้องลงในไฟล์การกำหนดค่าสำหรับโฮสต์เสมือนแต่ละโฮสต์ และคุณก็พร้อมที่จะใช้งานแล้ว แต่ต้องแน่ใจว่าคุณใช้ MPM หนึ่งรายการต่อ vhost เท่านั้น
สุดท้ายนี้ โปรดทราบว่าไม่ว่าคุณจะเลือกการเผยแพร่แบบใดก็ตาม php-fpm ขึ้นอยู่กับการใช้งาน FastCGI ซึ่งเป็นเหตุผลว่าทำไมฉันจึงแนะนำการติดตั้งแพ็คเกจเพิ่มเติมก่อนหน้านี้
หากต้องการรายละเอียดและตัวอย่างเพิ่มเติมเกี่ยวกับ php-fpm และวิธีที่ PHP-fpm สามารถเพิ่มประสิทธิภาพของ Apache ร่วมกับเหตุการณ์ MPM ได้ โปรดดูเอกสารประกอบอย่างเป็นทางการ
นี่คือสิ่งที่ฉันเห็นหลังจากเปลี่ยน MPM เริ่มต้นจาก prefork เป็นเหตุการณ์ในกล่องเดียวกับที่แสดงในรูปภาพก่อนหน้า:
ใน CentOS 7 คุณจะต้องตรวจสอบให้แน่ใจว่าบริการ http และ https ได้รับการเปิดใช้งานผ่านไฟร์วอลล์ และอินเทอร์เฟซเครือข่าย ) จะถูกเพิ่มเข้าไปในโซนเริ่มต้นอย่างถูกต้อง
ตัวอย่างเช่น:
firewall-cmd --zone=internal --add-interface=tun6to4
firewall-cmd --zone=internal --add-interface=tun6to4 --permanent
firewall-cmd --set-default-zone=internal
firewall-cmd --add-service=http
firewall-cmd --add-service=https
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
เหตุผลที่ฉันหยิบยกเรื่องนี้ขึ้นมาก็เพราะฉันเพิ่งประสบปัญหาที่การตั้งค่าเริ่มต้นของไฟร์วอลล์ใน VPS บนคลาวด์ทำให้ php-fpm และ Apache ประมวลผลไฟล์ php ได้
จากการทดสอบขั้นพื้นฐาน (ฉันแน่ใจว่าคุณสามารถนึกถึงสิ่งที่ซับซ้อนหรือเครียดกว่านี้ได้) ฉันจะสร้างไฟล์ php ที่ตรวจสอบการมีอยู่ของไฟล์อื่นชื่อ test.php
ในไดเร็กทอรีเดียวกันของ CentOS สองตัว เซิร์ฟเวอร์ 7 เครื่องที่มีคุณสมบัติฮาร์ดแวร์และโหลดเหมือนกัน แต่มี MPM ต่างกัน หนึ่งในนั้นจะใช้เหตุการณ์และอีกอันจะใช้ prefork:
นี่คือโค้ด php ที่ฉันบันทึกไว้ในไฟล์ชื่อ checkiffileexists.php
:
<?php
$filename = 'test.php';
if (file_exists($filename)) {
echo "The file $filename exists";
} else {
echo "The file $filename does not exist";
}
?>
จากนั้น เราจะเรียกใช้เครื่องมือเปรียบเทียบ Apache (ab) พร้อมกับคำขอ 200 พร้อมกันจนกว่าคำขอ 2000 จะเสร็จสมบูรณ์:
ab -k -c 100 -n 2000 localhost/checkiffileexists.php
ลองทำการทดสอบและเปรียบเทียบผลลัพธ์กัน ให้ความสนใจกับสถิติประสิทธิภาพ:
อย่างที่คุณเห็น ประสิทธิภาพของเซิร์ฟเวอร์ที่มีเหตุการณ์นั้นเหนือกว่า prefork ที่เทียบเท่ากันในทุกด้านของการทดสอบนี้
เคล็ดลับ #4: จัดสรร RAM อย่างชาญฉลาดสำหรับ Apache
บางทีรายการฮาร์ดแวร์ที่สำคัญที่สุดที่ต้องคำนึงถึงก็คือจำนวน RAM ที่จัดสรรให้กับแต่ละกระบวนการของ Apache แม้ว่าคุณไม่สามารถควบคุมสิ่งนี้ได้โดยตรง แต่คุณสามารถจำกัดจำนวนกระบวนการย่อยได้โดยใช้คำสั่ง MaxRequestWorkers (เดิมชื่อ MaxClients ใน Apache 2.2) ซึ่งจะจำกัดการใช้ RAM โดย Apache ขอย้ำอีกครั้งว่าคุณสามารถตั้งค่านี้ตามโฮสต์หรือต่อโฮสต์เสมือนได้
ในการดำเนินการนี้ คุณควรจดจำนวน RAM โดยเฉลี่ยที่ Apache ใช้ จากนั้นคูณด้วยจำนวน MaxRequestWorkers และนั่นคือจำนวนหน่วยความจำที่จะถูกจัดสรรสำหรับกระบวนการของ Apache สิ่งหนึ่งที่คุณไม่ต้องการให้เว็บเซิร์ฟเวอร์ของคุณทำคือเริ่มใช้ swap เนื่องจากจะทำให้ประสิทธิภาพลดลงอย่างมาก ดังนั้น คุณควรรักษาการใช้ RAM โดย Apache ให้อยู่ในขอบเขตที่คุณสามารถจ่ายได้เสมอ และอย่าพึ่งการแลกเปลี่ยน
ตัวอย่างเช่น บล็อกต่อไปนี้จะจำกัดจำนวนไคลเอ็นต์พร้อมกันไว้ที่ 30 หากมีไคลเอ็นต์เข้าถึงโฮสต์มากขึ้น พวกเขาอาจประสบกับความล่าช้าหรือความล้มเหลวชั่วขณะ ซึ่งสามารถแก้ไขได้ง่ายด้วยการรีเฟรชเบราว์เซอร์ แม้ว่าสิ่งนี้อาจถือได้ว่าไม่เป็นที่พึงปรารถนา แต่ก็มีประโยชน์ต่อเซิร์ฟเวอร์มากกว่าและในระยะยาวจะดีที่สุดสำหรับเว็บไซต์ของคุณเช่นกัน
คุณสามารถวางบล็อกนี้ไว้ใน /etc/httpd/conf/httpd.conf
หรือ /etc/apache2/apache2.conf
ขึ้นอยู่กับว่าคุณใช้ CentOS หรือ Debian
โปรดทราบว่าหลักการเดียวกันนี้ใช้กับ MPM ทั้งหมด ฉันใช้เหตุการณ์ที่นี่เพื่อดำเนินการต่อตามแนวคิดที่ระบุไว้ในเคล็ดลับก่อนหน้านี้:
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 30
MaxConnectionsPerChild 1000
</IfModule>
ไม่ว่าในกรณีใดก็ตาม ขอแนะนำเป็นอย่างยิ่งให้คุณอ้างอิงเอกสาร Apache 2.4 เพื่อดูว่าคำสั่งใดที่ได้รับอนุญาตสำหรับ MPM ที่คุณเลือก
เคล็ดลับ #5: รู้จักแอปพลิเคชันของคุณ
ตามหลักการทั่วไป คุณไม่ควรโหลดโมดูล Apache ใดๆ ที่ไม่จำเป็นอย่างเคร่งครัดเพื่อให้แอปพลิเคชันของคุณทำงานได้ สิ่งนี้จะต้องมีความรู้โดยรวมเกี่ยวกับแอปพลิเคชันที่ทำงานบนเซิร์ฟเวอร์ของคุณเป็นอย่างน้อย โดยเฉพาะอย่างยิ่งหากคุณเป็นผู้ดูแลระบบและมีทีมอื่นที่รับผิดชอบการพัฒนา
คุณสามารถแสดงรายการโมดูลที่โหลดในปัจจุบันด้วย:
httpd -M [On RedHat/CentOS based systems]
apache2ctl -M [On Debian/Ubuntu based systems]
หากต้องการยกเลิกการโหลด/ปิดการใช้งานโมดูลใน CentOS คุณจะต้องใส่เครื่องหมายความคิดเห็นในบรรทัดที่ขึ้นต้นด้วย LoadModule (ไม่ว่าจะในไฟล์การกำหนดค่าหลักหรือในไฟล์เสริมภายใน /etc/httpd/conf.modules.d
ในทางกลับกัน Debian มีเครื่องมือที่เรียกว่า a2dismod เพื่อปิดการใช้งานโมดูลและใช้งานดังต่อไปนี้:
a2dismod module_name
หากต้องการเปิดใช้งานอีกครั้ง:
a2enmod module_name
ไม่ว่าในกรณีใด อย่าลืมรีสตาร์ท Apache เพื่อให้การเปลี่ยนแปลงมีผล
สรุป
ในบทความนี้ เราได้อ่าน 5 เคล็ดลับ ที่จะช่วยคุณปรับแต่งเว็บเซิร์ฟเวอร์ Apache และเพิ่มประสิทธิภาพ นอกจากนี้ คุณควรจำไว้ว่าการเพิ่มประสิทธิภาพและประสิทธิภาพที่ไม่มีการรักษาความปลอดภัยนั้นไม่มีประโยชน์ ดังนั้นคุณอาจต้องการดูบทความการติดตั้ง mod_pagespeed เพื่อปรับปรุงประสิทธิภาพของเว็บเซิร์ฟเวอร์ และบทความเคล็ดลับการทำให้แข็งของ Apache ใน linux-console.net เช่นกัน
เนื่องจากเราไม่สามารถครอบคลุมทุกแง่มุมของหัวข้อนี้ในบทความนี้ได้เพียงพอ บางทีคุณอาจนึกถึงแนวคิดอื่นๆ ที่คุณต้องการแบ่งปันกับคนอื่นๆ ในชุมชน หากเป็นเช่นนั้น โปรดแจ้งให้เราทราบโดยใช้แบบฟอร์มความคิดเห็นด้านล่าง