ทำไมต้องรัน PHP หลายเวอร์ชันพร้อมกันบนเซิร์ฟเวอร์เดียว
ในการทำงานจริง เรามักมีเว็บไซต์หลายตัวบนเซิร์ฟเวอร์เดียวกัน แต่ละเว็บต้องการ PHP คนละ Version เช่น WordPress เก่าอาจต้องการ PHP 7.4 ในขณะที่ Laravel ตัวใหม่ต้องใช้ PHP 8.2 ขึ้นไป Nginx ไม่มี PHP Module ในตัวเหมือน Apache แต่ใช้ PHP-FPM (FastCGI Process Manager) แทน ข้อดีคือรัน PHP-FPM หลาย Version พร้อมกันได้
บทความนี้จะพาคุณตั้งค่า PHP หลายเวอร์ชันกับ Nginx บน Ubuntu ตั้งแต่ติดตั้งจนถึงแยก Pool สำหรับแต่ละ Site
ติดตั้ง PHP หลายเวอร์ชันบน Ubuntu
เพิ่ม PPA Repository
Ubuntu ไม่ได้มี PHP ทุก Version ใน Official Repo ต้องเพิ่ม PPA ของ Ondrej Sury
sudo apt update
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
ติดตั้ง PHP แต่ละเวอร์ชัน
sudo apt install php7.4-fpm php7.4-mysql php7.4-xml php7.4-mbstring php7.4-curl -y
sudo apt install php8.2-fpm php8.2-mysql php8.2-xml php8.2-mbstring php8.2-curl -y
sudo apt install php8.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-curl -y
เพิ่ม Extension ตามที่ Application ต้องการ เช่น php8.2-gd, php8.2-zip, php8.2-intl ตรวจสอบว่า PHP-FPM ทำงานด้วย sudo systemctl status php8.3-fpm
ตั้งค่า Nginx กับ PHP-FPM แต่ละเวอร์ชัน
Nginx ส่ง PHP Request ผ่าน FastCGI ไปยัง PHP-FPM Socket ที่กำหนดในแต่ละ Site โดย Socket อยู่ที่ /run/php/phpX.X-fpm.sock
Config สำหรับ Site ที่ใช้ PHP 7.4
server {
listen 80;
server_name legacy-app.example.com;
root /var/www/legacy-app;
index index.php index.html;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}
Config สำหรับ Site ที่ใช้ PHP 8.3
server {
listen 80;
server_name new-app.example.com;
root /var/www/new-app;
index index.php index.html;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
ความแตกต่างอยู่ที่บรรทัด fastcgi_pass เท่านั้น เปลี่ยน Socket Path ตาม PHP Version
เปิด Site และ Test Config
sudo ln -s /etc/nginx/sites-available/legacy-app /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/new-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
แยก PHP-FPM Pool สำหรับ Production
สำหรับ Production ที่ต้องการแยก Resource ให้แต่ละ Site ไม่กระทบกัน สร้าง PHP-FPM Pool แยกที่ /etc/php/8.3/fpm/pool.d/new-app.conf
กำหนด user, listen socket แยก และปรับ pm.max_children ตาม Traffic ของแต่ละ Site แล้วแก้ Nginx Config ให้ชี้ไปที่ Socket ของ Pool ใหม่
ข้อดีของการแยก Pool คือจำกัด Resource ได้ แยก User เพิ่มความปลอดภัย และปรับ pm.max_children ตาม Traffic ได้อิสระ
เปลี่ยน Default PHP Version
ถ้าต้องการเปลี่ยน PHP Version สำหรับ Command Line
sudo update-alternatives --set php /usr/bin/php8.3
php -v
วิธีนี้ไม่กระทบ PHP-FPM ที่รันอยู่ เปลี่ยนแค่ CLI Version เท่านั้น
ทดสอบว่าทำงานถูกต้อง
สร้างไฟล์ phpinfo ใน Document Root ของแต่ละ Site เปิด Browser ดูว่า PHP Version ตรงกับที่ตั้งค่า อย่าลืมลบไฟล์ phpinfo หลังทดสอบเสร็จเพราะเปิดเผยข้อมูลเซิร์ฟเวอร์ที่อาจเป็นช่องโหว่
คำถามที่พบบ่อย (FAQ)
ติดตั้ง PHP หลายเวอร์ชันจะกิน RAM เยอะไหม
แต่ละ PHP-FPM Process กิน RAM ประมาณ 20-50MB ถ้ามีหลาย Version พร้อมกัน ควรปรับ pm.max_children ให้เหมาะกับ RAM ที่มี เพื่อไม่ให้ใช้ RAM เกินจน Swap
เปลี่ยน PHP Version ของ Site ที่มีอยู่แล้วทำอย่างไร
แก้ fastcgi_pass ใน Nginx Config ให้ชี้ไปที่ PHP-FPM Socket Version ใหม่ แล้ว sudo systemctl reload nginx ก่อนเปลี่ยนควรทดสอบ Application กับ PHP Version ใหม่บน Staging ก่อน
PHP-FPM Pool แบบ Static กับ Dynamic ต่างกันอย่างไร
Static จะรัน Process ตามจำนวนที่กำหนดตลอดเวลา เหมาะกับ Traffic สม่ำเสมอ Dynamic จะปรับจำนวน Process ตาม Load เหมาะกับ Traffic ที่ขึ้นลงไม่แน่นอน สำหรับส่วนใหญ่แนะนำ Dynamic
รองรับ PHP 8.4 หรือ Version ใหม่กว่าได้ไหม
ได้ เมื่อ PPA ของ Ondrej Sury อัปเดต PHP Version ใหม่ สามารถติดตั้งเพิ่มได้ทันที โดยไม่กระทบ Version เก่าที่รันอยู่
สรุป
การรัน PHP หลาย Version บน Nginx ด้วย PHP-FPM เป็นวิธีที่ยืดหยุ่นและมีประสิทธิภาพ เหมาะกับเซิร์ฟเวอร์ที่ Host หลาย Site จัดการ Pool ให้ดีและ Monitor Resource อย่างสม่ำเสมอ
สำหรับผู้ที่ต้องการเซิร์ฟเวอร์สำหรับ Host PHP Application หลายตัว VPS ของ DriteStudio ให้ Root Access เต็มรูปแบบ ติดตั้ง PHP กี่ Version ก็ได้ หรือถ้าต้องการ Managed Hosting Hosting จาก DriteStudio รองรับ PHP หลาย Version พร้อมใช้งานทันที