เกือบทุกบทช่วยสอนเกี่ยวกับวิธีการติดตั้ง LAMP stack (Linux, Apache, MySQL, PHP) จะแนะนำให้คุณใช้โมดูล Apache ในตัวสำหรับการประมวลผลสคริปต์ PHP ตัวอย่างเช่น ใน Ubuntu คุณจะเปิดใช้งานสิ่งนี้เมื่อคุณใช้คำสั่งเช่น sudo apt install libapache2-mod-php
เพื่อติดตั้งแพ็คเกจ สิ่งนี้จะบังคับให้ Apache ใช้ mpm_prefork ทุกครั้งที่ผู้เยี่ยมชมเข้าถึงเว็บไซต์ของคุณ จะมีการเปิดตัวกระบวนการใหม่เพื่อจัดการกับการเชื่อมต่อนั้น วิธีนี้ใช้ได้ผลดีเมื่อปริมาณการใช้ข้อมูลต่ำ
แต่จะกลายเป็นปัญหาใหญ่หากคุณมีการจราจรติดขัดอย่างกะทันหัน ตัวอย่างเช่น โพสต์ใน Reddit อาจรวมเว็บไซต์ของคุณด้วย และหากโพสต์ดังกล่าวได้รับความนิยม คุณอาจมีผู้เข้าชมหลายพันคนในเวลาเพียงไม่กี่นาที
ในกรณีที่ดีที่สุด หาก Apache สามารถจัดการกับการรับส่งข้อมูลที่ล้นหลาม ผู้เยี่ยมชมที่โชคไม่ดีบางคนอาจต้องรอประมาณสามสิบถึงหกสิบวินาทีจนกว่าหน้าจะโหลดขึ้น ซึ่งเป็นเรื่องไร้สาระในโลกปัจจุบัน ในกรณีที่เลวร้ายที่สุด เซิร์ฟเวอร์จะเริ่มล่าช้าอย่างรุนแรง และการเชื่อมต่อบางส่วนจะหายไปเนื่องจากขาดทรัพยากร ในกรณีนี้ผู้เข้าชมจะเห็นข้อผิดพลาดในเบราว์เซอร์
ไม่ใช่สถานการณ์ที่ดีแต่อย่างใด เนื่องจากคุณอาจสูญเสียความสนใจจากผู้อ่าน ลูกค้า หรือแฟนๆ ที่สนใจหลายร้อยหรือหลายพันคน
น่าเสียดายที่ PHP เป็นทรัพยากรที่ค่อนข้างใหญ่ แต่ด้วย mpm_event Apache สามารถจัดการกับการรับส่งข้อมูลอย่างกะทันหันได้อย่างมีประสิทธิภาพมากขึ้น ขอแนะนำว่าเซิร์ฟเวอร์ของคุณควรมี RAM อย่างน้อย 2GB และคอร์ CPU 2 คอร์ ทั้งแบบจริงหรือแบบเสมือน และมากยิ่งขึ้นหากคุณคาดว่าจะมีการรับส่งข้อมูลที่พุ่งสูงขึ้นอย่างรวดเร็ว เช่น ผู้เข้าชมมากกว่าสิบคนต่อวินาที หากคุณกำลังใช้เซิร์ฟเวอร์ส่วนตัวเสมือน ให้เพิ่มแกน CPU เสมือนเพิ่มเติมให้กับสถานการณ์และพื้นที่จัดเก็บ SSD ของคุณ RAM เป็นเรื่องรอง
วิธีใช้เหตุการณ์ Apache MPM และ PHP-FPM บนการกระจายแบบเดเบียน
บน Debian, Ubuntu หรือ distros อื่น ๆ จากตระกูลนี้ ให้หลีกเลี่ยงการติดตั้งแพ็คเกจ “libapache2-mod-php” เมื่อคุณติดตั้ง Apache จะใช้เหตุการณ์ MPM โดยค่าเริ่มต้น แต่เมื่อติดตั้งแพ็คเกจดังกล่าว สคริปต์จะปิดใช้งานเหตุการณ์ MPM และเปิดใช้งาน MPM prefork โมดูล Apache PHP สามารถทำงานได้ (อย่างปลอดภัย) กับ mpm_prefork เท่านั้น แน่นอน ถ้าไม่มี “libapache2-mod-php” คุณจะไม่มีตัวประมวลผลสำหรับไฟล์ PHP ดังนั้น คุณจะใช้ PHP-FPM แทนโมดูล PHP ที่รวมอยู่ใน Apache นี่คือวิธีที่คุณจะติดตั้ง LAMP stack บนเซิร์ฟเวอร์ใหม่ คุณสามารถปรับขั้นตอนตามความต้องการของเว็บแอปพลิเคชันของคุณได้
ขั้นแรกให้เข้าสู่ระบบในฐานะรูท จากนั้นติดตั้ง Apache
apt update && apt install apache2
ณ จุดนี้คุณจะเห็นว่า Apache จัดส่งโดยเปิดใช้งานเหตุการณ์ MPM ตามค่าเริ่มต้น
apachectl -V
ติดตั้ง PHP-FPM
apt install php-fpm
คุณจะเห็นคำแนะนำเกี่ยวกับวิธีการเปิดใช้งานโปรเซสเซอร์ PHP ใน Apache
เปิดใช้งานโปรโตคอล FastCGI
a2enmod proxy_fcgi
เปิดใช้งานการกำหนดค่าเริ่มต้น PHP-FPM สำหรับ Apache
a2enconf php7.0-fpm
หมายเหตุ :ใน Debian/Ubuntu เวอร์ชันต่อๆ ไป คำสั่งนี้สามารถเปลี่ยนเป็นอย่างอื่นได้ เช่น a2enconf php7.6-fpm
เพราะ PHP-FPM จะเป็นเวอร์ชันอื่น
รีสตาร์ท Apache
systemctl restart apache2
ติดตั้งข้อกำหนดที่เหลือสำหรับแอปพลิเคชัน PHP ของคุณ นี่คือตัวอย่าง:
apt install mariadb-server php-mysql
ซึ่งจะติดตั้งเซิร์ฟเวอร์ฐานข้อมูลและโมดูล PHP MySQL เพื่อให้แอปพลิเคชัน PHP ของคุณสามารถเชื่อมต่อกับฐานข้อมูลได้
วิธีใช้เหตุการณ์ Apache MPM และ PHP-FPM บน RedHat-Based Distributions
ตัวเลือกการกระจายเซิร์ฟเวอร์ยอดนิยมอื่น ๆ คือ RedHat หรือ CentOS ในลักษณะเดียวกับข้างต้น จะมีการนำเสนอตัวอย่างการติดตั้ง Apache ใหม่ทั้งหมดโดยเปิดใช้งานเหตุการณ์ MPM และ PHP-FPM
เข้าสู่ระบบในฐานะรูทและติดตั้ง Apache
yum install httpd
แตกต่างจาก distros ที่ใช้ Debian ในที่นี้ คุณจะเห็นว่า Apache ใช้ MPM prefork เป็นค่าเริ่มต้น อย่างน้อยใน CentOS 7 ล่าสุดที่มีให้ในขณะที่เขียน
apachectl -V
หากต้องการเปิดใช้งานเหตุการณ์ MPM คุณต้องแก้ไขไฟล์การกำหนดค่า
sed -i '/mpm_prefork\.so$/s/^/#/' /etc/httpd/conf.modules.d/00-mpm.conf
นี่จะเพิ่ม #
ลงชื่อเข้าใช้เพื่อแสดงความคิดเห็น (ปิดใช้งาน) บรรทัด LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
.
ตอนนี้ยกเลิกความคิดเห็น (เปิดใช้งาน) บรรทัด #LoadModule mpm_event_module modules/mod_mpm_event.so
โดยการลบ #
. ก่อนหน้า ลงชื่อด้วยคำสั่งถัดไป
sed -i '/mpm_event\.so$/s/^#//' /etc/httpd/conf.modules.d/00-mpm.conf
เริ่ม Apache และเปิดใช้งานเพื่อเริ่มอัตโนมัติเมื่อบูต
systemctl start httpd.service systemctl enable httpd.service
ตรวจสอบว่าตอนนี้ Apache ใช้เหตุการณ์ MPM หรือไม่
apachectl -V
ติดตั้งโมดูล PHP-FPM และ FastCGI
yum install php-fpm mod_fcgid
สร้าง “/etc/httpd/conf.d/php.conf” เพื่อสั่ง Apache เกี่ยวกับวิธีประมวลผลไฟล์ PHP คัดลอกเนื้อหาทั้งหมดด้านล่าง และวางทั้งหมดพร้อมกันในเทอร์มินัล จากนั้นกด ENTER
cat <<PASTE > /etc/httpd/conf.d/php.conf # Redirect to local php-fpm if mod_php is not available <IfModule !mod_php7.c> <IfModule proxy_fcgi_module> # Enable http authorization headers <IfModule setenvif_module> SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 </IfModule> <FilesMatch ".+\.ph(p[3457]?|t|tml)$"> #SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost" SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch> <FilesMatch ".+\.phps$"> # Deny access to raw php sources by default # To re-enable it's recommended to enable access to the files # only in specific virtual host or directory Require all denied </FilesMatch> # Deny access to files without filename (e.g. '.php') <FilesMatch "^\.ph(p[3457]?|t|tml|ps)$"> Require all denied </FilesMatch> </IfModule> </IfModule> PASTE
เครดิตสำหรับการกำหนดค่าที่ยอดเยี่ยมนี้ตกเป็นของ Debian แหล่งข้อมูลอื่นแนะนำไฟล์การกำหนดค่าอย่างง่าย เช่น:
<FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch>
แต่สิ่งนี้เสี่ยงต่อการโจมตีบางอย่าง และหากบริการบางอย่างล้มเหลว คุณอาจเปิดเผยไฟล์ PHP ต่อสาธารณะ ในทางกลับกันก็อาจเปิดเผยรหัสผ่านที่เก็บไว้ รหัสและข้อมูลที่ละเอียดอ่อน
รีสตาร์ท Apache
systemctl restart httpd.service
เริ่ม PHP-FPM และเปิดใช้งานการเริ่มอัตโนมัติเมื่อบูต
systemctl start php-fpm.service systemctl enable php-fpm.service
บทสรุป
ตอนนี้คุณมีเซิร์ฟเวอร์ Apache ที่ขยายขนาดได้ดีขึ้นมากกับการรับส่งข้อมูล อย่างไรก็ตาม โปรดจำไว้ว่าคุณกำลังใช้การตั้งค่าเริ่มต้น เช่นเดียวกับการตั้งค่าที่ "ดีที่สุด" สำหรับคนส่วนใหญ่ หากคุณต้องการได้รับประโยชน์สูงสุดจากเซิร์ฟเวอร์ HTTP ของคุณ คุณต้องอ่านเกี่ยวกับตัวแปรต่างๆ ที่คุณปรับแต่งได้ ค่าที่เหมาะสมสำหรับสิ่งเหล่านี้ขึ้นอยู่กับทรัพยากรของเซิร์ฟเวอร์ของคุณ ปริมาณการใช้งานที่คาดหวัง และแอปพลิเคชัน PHP