ค้นหาเว็บไซต์

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 ที่แตกต่างกันสามแบบให้เลือก ขึ้นอยู่กับความต้องการของคุณ:

  1. MPM prefork ใช้กระบวนการย่อยหลายรายการโดยไม่มีเธรด แต่ละกระบวนการจัดการการเชื่อมต่อครั้งละหนึ่งรายการโดยไม่ต้องสร้างเธรดแยกกันสำหรับแต่ละรายการ โดยไม่ต้องลงรายละเอียดมากเกินไป เราสามารถพูดได้ว่าคุณจะต้องการใช้ MPM นี้เฉพาะเมื่อทำการดีบั๊กแอปพลิเคชันที่ใช้ หรือหากแอปพลิเคชันของคุณจำเป็นต้องจัดการกับโมดูลที่ไม่ปลอดภัยต่อเธรด เช่น mod_php
  2. MPM ผู้ปฏิบัติงาน ใช้หลายเธรดต่อกระบวนการลูก โดยที่แต่ละเธรดจะจัดการการเชื่อมต่อครั้งละหนึ่งรายการ นี่เป็นตัวเลือกที่ดีสำหรับเซิร์ฟเวอร์ที่มีการรับส่งข้อมูลสูง เนื่องจากช่วยให้สามารถจัดการการเชื่อมต่อพร้อมกันได้มากขึ้นโดยใช้ RAM น้อยกว่าในกรณีก่อนหน้า
  3. สุดท้ายนี้ เหตุการณ์ 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]

โดยที่ สามารถเป็น mpm_event, mpm_worker หรือ mpm_prefork

และยกเลิกหมายเหตุบรรทัดที่โหลดโมดูลที่ต้องการดังนี้:

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 เช่นกัน

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