
ตั้งค่า Nginx + PHP-FPM บน VPS สำหรับ WordPress ให้เร็วสุดๆ
หากคุณรัน WordPress บน VPS และยังใช้ Apache + mod_php อยู่ บทความนี้จะเปลี่ยนชีวิตคุณ การเปลี่ยนมาใช้ Nginx + PHP-FPM คือการอัปเกรดที่คุ้มค่าที่สุดที่คุณทำได้กับเว็บไซต์ WordPress ความเร็วที่เพิ่มขึ้น 3-5 เท่าด้วย RAM เท่าเดิม ไม่ใช่เรื่องเกินจริง
สารบัญ
Nginx + PHP-FPM คืออะไร
Nginx (อ่านว่า "Engine-X") คือ Web Server และ Reverse Proxy ที่ออกแบบมาเพื่อรับ connection จำนวนมากพร้อมกันโดยใช้ทรัพยากรน้อย ต่างจาก Apache ที่ใช้ process หรือ thread ต่อหนึ่ง connection Nginx ใช้ event-driven architecture ทำให้รับได้หลายพันการเชื่อมต่อต่อ CPU core
PHP-FPM (PHP FastCGI Process Manager) คือวิธีรัน PHP แยกออกจาก web server โดยจัดการ PHP worker process เป็น pool สื่อสารกับ Nginx ผ่าน socket ทำให้ควบคุมการใช้ทรัพยากรได้แม่นยำ
WordPress ส่ง request ซ้ำๆ จำนวนมากต่อ pageview (PHP, CSS, JS, รูป) Nginx จัดการ static files ได้เร็วกว่า Apache หลายเท่า และ PHP-FPM ทำให้ PHP worker ไม่ต้องถูก fork ทุกครั้ง ผลคือ CPU ต่ำลง RAM ต่ำลง แต่ throughput สูงขึ้น
ทำไมถึงเร็วกว่า Apache + mod_php
ความต่างหลักอยู่ที่สถาปัตยกรรม:
- Apache + mod_php: แต่ละ request สร้าง process/thread ใหม่ โหลด PHP module ทุกครั้ง กิน RAM 20-40 MB ต่อ connection
- Nginx + PHP-FPM: Nginx รับ connection ด้วย event loop ไม่สร้าง thread PHP-FPM มี pool process ที่พร้อมรับงานอยู่เสมอ ไม่ต้อง fork ใหม่
นอกจากนี้ Nginx serve static files (รูปภาพ CSS JS) ได้โดยตรงจาก disk โดยไม่ต้องผ่าน PHP เลย ในขณะที่ Apache + mod_php ยังคงโหลด PHP module ทุก request แม้แต่ request ที่ขอไฟล์ .jpg
ความต้องการของระบบ
| รายการ | ขั้นต่ำ | แนะนำ |
|---|---|---|
| ระบบปฏิบัติการ | Ubuntu 20.04 LTS | Ubuntu 22.04 LTS หรือใหม่กว่า |
| RAM | 1 GB | 2 GB ขึ้นไป |
| CPU | 1 vCore | 2 vCore ขึ้นไป |
| Disk | 20 GB SSD | 40 GB SSD ขึ้นไป |
| PHP | PHP 8.0 | PHP 8.2 หรือ 8.3 |
| MySQL/MariaDB | MySQL 8.0 | MariaDB 10.11 ขึ้นไป |
เคล็ดลับ VPS AsiaGB ทุกแพ็กเกจใช้ SSD storage และรองรับการตั้งค่า Nginx + PHP-FPM เต็มรูปแบบ ราคาเริ่มต้น 500 บาท/เดือน
ติดตั้ง Nginx และ PHP-FPM
เริ่มต้นด้วยการอัปเดต package และติดตั้ง Nginx พร้อม PHP-FPM:
# อัปเดต package list
sudo apt update && sudo apt upgrade -y
# ติดตั้ง Nginx
sudo apt install -y nginx
# เพิ่ม PHP PPA เพื่อให้ได้ PHP เวอร์ชันล่าสุด
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# ติดตั้ง PHP 8.3-FPM และ extension ที่ WordPress ต้องการ
sudo apt install -y php8.3-fpm php8.3-mysql php8.3-curl \
php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip \
php8.3-imagick php8.3-intl php8.3-bcmath
ตรวจสอบว่า service ทำงานปกติ:
sudo systemctl status nginx
sudo systemctl status php8.3-fpm
# เปิดใช้งานเมื่อ boot
sudo systemctl enable nginx php8.3-fpm
sudo systemctl disable --now apache2 เพราะ Nginx และ Apache ใช้ port 80/443 เดียวกัน
ตั้งค่า PHP-FPM Pool
PHP-FPM Pool config อยู่ที่ /etc/php/8.3/fpm/pool.d/www.conf ค่าสำคัญที่ต้องปรับ:
; /etc/php/8.3/fpm/pool.d/www.conf
[www]
user = www-data
group = www-data
; ใช้ Unix socket แทน TCP เพื่อประสิทธิภาพดีกว่า
listen = /run/php/php8.3-fpm.sock
listen.owner = www-data
listen.group = www-data
; Process manager แบบ dynamic (เหมาะกับ traffic ไม่สม่ำเสมอ)
pm = dynamic
; RAM 1 GB → max_children = 25, RAM 2 GB → max_children = 50
pm.max_children = 25
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 8
pm.max_requests = 500
คำนวณ pm.max_children ที่เหมาะสม:
# ดู RAM ที่เหลือ (MB)
free -m | awk '/Mem:/{print $7}'
# แต่ละ PHP-FPM process กิน ~30-40 MB
# ตัวอย่าง: RAM ว่าง 800 MB ÷ 35 = ~22 max_children
Restart PHP-FPM หลังแก้ไข:
sudo systemctl restart php8.3-fpm
ตั้งค่า Nginx สำหรับ WordPress
สร้าง virtual host config สำหรับ WordPress ที่ /etc/nginx/sites-available/wordpress:
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/wordpress;
index index.php index.html;
# Log
access_log /var/log/nginx/wordpress_access.log;
error_log /var/log/nginx/wordpress_error.log;
# WordPress permalink support
location / {
try_files $uri $uri/ /index.php?$args;
}
# PHP-FPM via Unix socket
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Cache static files
location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp|svg|woff2?)$ {
expires 30d;
add_header Cache-Control "public, immutable";
try_files $uri =404;
}
# Security: block sensitive files
location ~ /\.(ht|git) {
deny all;
}
location ~* wp-config\.php {
deny all;
}
location ~* /wp-admin/includes {
deny all;
}
}
เปิดใช้งาน site และ reload Nginx:
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
sudo nginx -t # ตรวจสอบ config ก่อน reload
sudo systemctl reload nginx
เปิดใช้งาน OPcache
OPcache คือ PHP extension ที่ cache compiled bytecode ไว้ใน shared memory ทำให้ไม่ต้อง compile PHP ซ้ำทุก request ผลลัพธ์คือความเร็วที่เพิ่มขึ้นอย่างเห็นได้ชัด
แก้ไขไฟล์ /etc/php/8.3/fpm/conf.d/10-opcache.ini:
; เปิดใช้งาน OPcache
opcache.enable=1
opcache.enable_cli=0
; Memory สำหรับ cache (MB) - สำหรับ WordPress ใช้ 128-256
opcache.memory_consumption=128
; จำนวน file ที่ cache ได้ (WordPress + plugin ~5000-10000 files)
opcache.max_accelerated_files=10000
; รีเช็ค file change ทุกกี่วินาที (production ตั้ง 60-300)
opcache.revalidate_freq=60
; เพิ่มประสิทธิภาพเพิ่มเติม
opcache.fast_shutdown=1
opcache.interned_strings_buffer=16
Restart PHP-FPM เพื่อโหลด config ใหม่:
sudo systemctl restart php8.3-fpm
/var/www/wordpress/opcache-info.php แล้ว browse ไป — จะเห็น memory usage และ hit rate หลังใช้งานสักพัก ลบไฟล์นี้ออกหลังตรวจสอบเสร็จ
<?php opcache_get_status() ? var_dump(opcache_get_status()) : phpinfo(INFO_OPCACHE); ?>
ตารางเปรียบเทียบประสิทธิภาพ
การทดสอบ Benchmark บน VPS 1 GB RAM กับ WordPress + 20 plugin:
| Stack | Request/วินาที | Avg Response (ms) | RAM ที่ใช้ |
|---|---|---|---|
| Apache + mod_php 7.4 | ~45 | ~650 ms | ~750 MB |
| Apache + PHP-FPM 8.1 | ~80 | ~400 ms | ~600 MB |
| Nginx + PHP-FPM 8.3 | ~180 | ~200 ms | ~350 MB |
| Nginx + PHP-FPM 8.3 + OPcache | ~320 | ~110 ms | ~280 MB |
ตัวเลขเป็นค่าประมาณจาก benchmark scenario ทั่วไป ผลจริงขึ้นกับ plugin theme และ hosting spec
แก้ปัญหาที่พบบ่อย
502 Bad Gateway
เกิดจาก Nginx ติดต่อ PHP-FPM ไม่ได้ ตรวจสอบ:
# ดูว่า PHP-FPM socket มีอยู่
ls -la /run/php/php8.3-fpm.sock
# ตรวจ PHP-FPM log
sudo tail -50 /var/log/php8.3-fpm.log
# ตรวจ Nginx error log
sudo tail -50 /var/log/nginx/wordpress_error.log
Permission Denied เมื่อ WordPress เขียนไฟล์
# ตั้ง ownership ให้ถูกต้อง
sudo chown -R www-data:www-data /var/www/wordpress
sudo find /var/www/wordpress -type d -exec chmod 755 {} \;
sudo find /var/www/wordpress -type f -exec chmod 644 {} \;
WordPress Redirect Loop หลังย้ายไป Nginx
เพิ่มใน wp-config.php ก่อน /* That's all, stop editing! */:
$_SERVER['HTTPS'] = 'on';
define('WP_HOME', 'https://yourdomain.com');
define('WP_SITEURL', 'https://yourdomain.com');
PHP upload ไฟล์ขนาดใหญ่ไม่ได้
# แก้ /etc/php/8.3/fpm/php.ini
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
# แก้ /etc/nginx/nginx.conf ภายใน http {}
client_max_body_size 64M;
คำถามที่พบบ่อย (FAQ)
PHP-FPM กับ mod_php ต่างกันอย่างไร?
mod_php รัน PHP ภายใน Apache process ทำให้กินหน่วยความจำมากเพราะทุก request โหลด PHP เต็มตัว ส่วน PHP-FPM รัน PHP แยกเป็น pool ของตัวเอง ทำให้จัดการ worker process ได้ยืดหยุ่นและประหยัด RAM กว่ามาก
Nginx + PHP-FPM เร็วกว่า Apache + mod_php แค่ไหน?
โดยทั่วไปรับ concurrent request ได้มากกว่าประมาณ 3-5 เท่าที่จำนวน RAM เท่ากัน เพราะ Nginx ใช้ event-driven architecture ส่วนความเร็ว response time จริงขึ้นกับ PHP code และ Database ด้วย
ต้องใช้ VPS สเปกขนาดไหนสำหรับ WordPress + Nginx + PHP-FPM?
สำหรับ WordPress ขนาดเล็ก-กลาง (traffic ไม่เกิน 10,000 pageview/วัน) แนะนำ RAM 1-2 GB และ CPU 1-2 Core VPS AsiaGB ราคาเริ่มต้น 500 บาท/เดือน รองรับการตั้งค่านี้ได้ดี
PHP-FPM Pool คืออะไร ต้องตั้งค่าอย่างไร?
PHP-FPM Pool คือกลุ่มของ worker process ที่รับงาน PHP ค่า pm.max_children คำนวณจาก RAM ที่มี หาร 30-40 MB ต่อ process เช่น RAM 1 GB ตั้ง max_children ไม่เกิน 25
OPcache ช่วยเพิ่มความเร็ว WordPress ได้แค่ไหน?
OPcache cache bytecode ของ PHP ไว้ใน memory ทำให้ไม่ต้อง compile PHP file ซ้ำทุก request โดยเฉลี่ยช่วยลด PHP execution time ได้ 50-70% สำหรับ WordPress ที่มี plugin หลายตัว ผลลัพธ์จะชัดเจนมาก
Nginx ต้องใช้ config พิเศษอะไรสำหรับ WordPress?
WordPress ต้องการ try_files สำหรับ pretty permalink และ location block สำหรับ PHP ผ่าน FastCGI นอกจากนั้นควรเพิ่ม location สำหรับ static files ให้ cache ใน browser และ block ไฟล์ wp-config.php ไม่ให้เข้าถึงจากภายนอก
สรุป
การตั้งค่า Nginx + PHP-FPM บน VPS สำหรับ WordPress เป็นการลงทุนที่คุ้มค่าที่สุดครั้งหนึ่งที่คุณจะทำให้เว็บไซต์ ขั้นตอนหลักประกอบด้วย:
- ติดตั้ง Nginx และ PHP-FPM (แนะนำ PHP 8.3)
- ปรับ PHP-FPM Pool ให้เหมาะกับ RAM ที่มี
- สร้าง Nginx virtual host config สำหรับ WordPress
- เปิด OPcache เพื่อเพิ่มประสิทธิภาพ PHP อีกขั้น
ด้วย VPS AsiaGB ที่มี SSD storage และ Uptime 99% คุณมีพื้นฐานที่แข็งแกร่งในการรัน WordPress ระดับ production ได้อย่างมั่นใจ
พร้อมอัปเกรด WordPress ให้เร็วขึ้นหลายเท่า?
VPS AsiaGB พร้อม SSD storage — ตั้งค่า Nginx + PHP-FPM ได้ทันที ราคาเริ่มต้น 500 บาท/เดือน
ดู VPS แพ็กเกจ