ตั้งค่า Nginx PHP-FPM บน VPS สำหรับ WordPress

ตั้งค่า Nginx + PHP-FPM บน VPS สำหรับ WordPress ให้เร็วสุดๆ

หากคุณรัน WordPress บน VPS และยังใช้ Apache + mod_php อยู่ บทความนี้จะเปลี่ยนชีวิตคุณ การเปลี่ยนมาใช้ Nginx + PHP-FPM คือการอัปเกรดที่คุ้มค่าที่สุดที่คุณทำได้กับเว็บไซต์ WordPress ความเร็วที่เพิ่มขึ้น 3-5 เท่าด้วย RAM เท่าเดิม ไม่ใช่เรื่องเกินจริง

สารบัญ

  1. Nginx + PHP-FPM คืออะไร
  2. ทำไมถึงเร็วกว่า Apache + mod_php
  3. ความต้องการของระบบ
  4. ติดตั้ง Nginx และ PHP-FPM
  5. ตั้งค่า PHP-FPM Pool
  6. ตั้งค่า Nginx สำหรับ WordPress
  7. เปิดใช้งาน OPcache
  8. ตารางเปรียบเทียบประสิทธิภาพ
  9. แก้ปัญหาที่พบบ่อย
  10. คำถามที่พบบ่อย
  11. สรุป

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 ถึงเหมาะกับ Nginx + PHP-FPM?
WordPress ส่ง request ซ้ำๆ จำนวนมากต่อ pageview (PHP, CSS, JS, รูป) Nginx จัดการ static files ได้เร็วกว่า Apache หลายเท่า และ PHP-FPM ทำให้ PHP worker ไม่ต้องถูก fork ทุกครั้ง ผลคือ CPU ต่ำลง RAM ต่ำลง แต่ throughput สูงขึ้น

ทำไมถึงเร็วกว่า Apache + mod_php

ความต่างหลักอยู่ที่สถาปัตยกรรม:

นอกจากนี้ Nginx serve static files (รูปภาพ CSS JS) ได้โดยตรงจาก disk โดยไม่ต้องผ่าน PHP เลย ในขณะที่ Apache + mod_php ยังคงโหลด PHP module ทุก request แม้แต่ request ที่ขอไฟล์ .jpg

ความต้องการของระบบ

รายการขั้นต่ำแนะนำ
ระบบปฏิบัติการUbuntu 20.04 LTSUbuntu 22.04 LTS หรือใหม่กว่า
RAM1 GB2 GB ขึ้นไป
CPU1 vCore2 vCore ขึ้นไป
Disk20 GB SSD40 GB SSD ขึ้นไป
PHPPHP 8.0PHP 8.2 หรือ 8.3
MySQL/MariaDBMySQL 8.0MariaDB 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
หมายเหตุ: ถ้าใช้ Apache อยู่ก่อน ต้องหยุด Apache และปิดไม่ให้ start อัตโนมัติก่อน: 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
ตรวจสอบ OPcache ทำงาน: สร้างไฟล์ /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:

StackRequest/วินาที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 เป็นการลงทุนที่คุ้มค่าที่สุดครั้งหนึ่งที่คุณจะทำให้เว็บไซต์ ขั้นตอนหลักประกอบด้วย:

ด้วย VPS AsiaGB ที่มี SSD storage และ Uptime 99% คุณมีพื้นฐานที่แข็งแกร่งในการรัน WordPress ระดับ production ได้อย่างมั่นใจ

พร้อมอัปเกรด WordPress ให้เร็วขึ้นหลายเท่า?

VPS AsiaGB พร้อม SSD storage — ตั้งค่า Nginx + PHP-FPM ได้ทันที ราคาเริ่มต้น 500 บาท/เดือน

ดู VPS แพ็กเกจ