เกือบทุก tutorial ติดตั้ง LAMP stack (Linux, Apache, MySQL, PHP) แนะนำใช้ built-in Apache module ประมวลผล PHP scripts เช่น Ubuntu ใช้คำสั่ง sudo apt install libapache2-mod-php ติดตั้งแพ็กเกจ จะบังคับ Apache ใช้ mpm_prefork ทุกครั้ง visitor เข้าเว็บ จะ launch process ใหม่จัดการ connection ทำงานดีตอน traffic ต่ำ
แตกลายเป็นปัญหาใหญ่ถ้าได้ traffic burst หนะ เช่น Reddit post รวมเว็บไซต์คุณ post ได้ popular อาจได้ thousands of visitors ในไม่กี่นาที
Best case: Apache จัดการ traffic burst ได้ บาง visitors รอ 30-60 วินาทีโหลดหน้า ซึ่ง absurd ในโลกวันนี้ Worst case: server lag สลบ connections drop เพราะขาดทรัพยากร visitors เห็น error บน browser
ไม่ดีทั้งคู่ เพราะอาจสูญเสีย attention ของร้อยหรือพัน interested readers, customers หรือ fans
น่าเสียดาย PHP resource hog ทั้งคู่ แตกับ mpm_event Apache จัดการ traffic bursts ได้มีประสิทธิภาพมากกว่า แนะนำ server ควรมี RAM อย่างน้อย 2GB และ 2 CPU cores real หรือ virtual และมากกว่านี้ถ้าคาดว่าจะมี intense traffic spikes เช่น >10 visitors/second ถ้าใช้ VPS เพิ่ม virtual CPU cores และ SSD storage RAM เป็นรอง
วิธีใช้ Apache MPM Event และ PHP-FPM บน Debian-based Distributions
บน Debian, Ubuntu หรือ distros ใน họนี้ หลีกเลี่ยงติดตั้งแพ็กเกจ "libapache2-mod-php" ติดตั้ง Apache ใช้ MPM event default แตติดตั้งแพ็กเกจกล่าว script disable MPM event enable MPM prefork Apache PHP module ทำงาน (อย่างปลอดภัย) กับ mpm_prefork เท่านั้น โดยไม่มี "libapache2-mod-php" ไม่มี processor สำหรับ PHP files ใช้ PHP-FPM แทน PHP module ใน Apache วิธีติดตั้ง LAMP stack บน fresh server ปรับขั้นตอนตาม web application requirements
ล็อกอินเป็น root ติดตั้ง Apache
apt update && apt install apache2
จุดนี้เห็นว่า Apache ship ด้วย MPM event enabled default
apachectl -V
ติดตั้ง PHP-FPM
apt install php-fpm
จะเห็นคำแนะนำ enable PHP processor ใน Apache
เปิดใช้งาน FastCGI protocol
a2enmod proxy_fcgi
เปิดใช้งาน PHP-FPM default configuration สำหรับ Apache
a2enconf php7.0-fpm
หมายเหตุ: รุ่น Debian/Ubuntu อนาคต คำสั่งอาจเปลี่ยน เช่น a2enconf php7.6-fpm เพราะ PHP-FPM จะเป็นรุ่นต่าง
Restart Apache
systemctl restart apache2
ติดตั้ง requirements ที่เหลือสำหรับ PHP application ตัวอย่าง:
apt install mariadb-server php-mysql
ติดตั้ง database server และ PHP MySQL module ให้ PHP application connect database ได้
วิธีใช้ Apache MPM Event และ PHP-FPM บน RedHat-based Distributions
อีกตัวเลือก server distribution ยอดนิยมคือ RedHat หรือ CentOS 同样的方式 例清洁安装 Apache MPM event enabled และ PHP-FPM
ล็อกอิน root ติดตั้ง Apache
yum install httpd
ต่างจาก Debian-based distros ที่นี่ Apache ใช้ MPM prefork default อย่างน้อย CentOS 7 latest เวลาเขียน
apachectl -V
เพื่อ enable MPM event ต้องแก้ไข config file
sed -i '/mpm_prefork\.so$/s/^/#/' /etc/httpd/conf.modules.d/00-mpm.conf
จะเพิ่ม # sign comment (inactivate) บรรทัด LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
ตอนนี้ uncomment (activate) บรรทัด #LoadModule mpm_event_module modules/mod_mpm_event.so ลบ # นำหน้าด้วยคำสั่ง:
sed -i '/mpm_event\.so$/s/^#//' /etc/httpd/conf.modules.d/00-mpm.conf
Start Apache และ enable autostart ตอนบูต
systemctl start httpd.service systemctl enable httpd.service
เช็คว่า Apache ใช้ MPM event ตอนนี้
apachectl -V
ติดตั้ง PHP-FPM และ FastCGI module
yum install php-fpm mod_fcgid
สร้าง "/etc/httpd/conf.d/php.conf" สั่ง Apache จัดการ PHP files คัดลอกเนื้อหาด้านล่างทั้งหมด วางใน terminal กด ENTER
cat </etc/httpd/conf.d/php.conf # Redirect to local php-fpm if mod_php is not available PASTE # Enable http authorization headers SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1 #SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost" SetHandler "proxy:fcgi://127.0.0.1:9000" # 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 # Deny access to files without filename (e.g. '.php')Require all denied
Credit config ดีนี้ไปที่ Debian แหล่งอื่นแนะนำ simple config file เช่น:
SetHandler "proxy:fcgi://127.0.0.1:9000"
แต vulnerable ต่อบาง attacks ถ้าบริการบางอย่าง fail อาจ expose PHP files สู่สาธารณะ จน expose stored passwords, code และ sensitive data
Restart Apache
systemctl restart httpd.service
Start PHP-FPM และ enable autostart ตอนบูต
systemctl start php-fpm.service systemctl enable php-fpm.service
สรุป
ตอนนี้มี Apache server scale ดีกว่ากับ traffic แตจำว่าใช้ default settings คือ "best" สำหรับคนส่วนใหญ่ ถ้าอยากขย้ำ HTTP server ต้องอ่าน variables ที่ tune ได้ ค่าที่เหมาะสม up to server resources, expected traffic และ PHP application