Tối ưu PHP-FPM cho WordPress trên VPS Ubuntu

WordPress trên VPS Ubuntu thường gặp tình trạng "thở dốc" khi traffic tăng: PHP-FPM ngốn hết RAM, website trả về lỗi 502 hoặc 504, CPU load cao dù chỉ có vài truy cập đồng thời. Nguyên nhân thường đến từ cấu hình pool PHP-FPM mặc định, không được tối ưu cho WordPress. Bài viết này sẽ hướng dẫn bạn từng bước tinh chỉnh PHP-FPM trên Ubuntu 24.04, giúp WordPress giảm 30-50% thời gian phản hồi, tiết kiệm RAM và xử lý được nhiều request đồng thời hơn.
Yêu cầu trước khi bắt đầu
- VPS chạy Ubuntu 24.04 LTS đã cài sẵn WordPress + Nginx + PHP 8.3 (hoặc 8.2). Có thể sử dụng VPS Linux full root để toàn quyền cấu hình.
- User sudo non-root (hoặc root). Tất cả lệnh đều chạy với quyền sudo.
- Đã cài PHP-FPM (php8.3-fpm hoặc php8.2-fpm).
- Kiến thức cơ bản về Nginx, PHP-FPM, và quản lý service systemd.
Vì sao cần tối ưu PHP-FPM cho WordPress
PHP-FPM (FastCGI Process Manager) là worker xử lý PHP cho WordPress. Cấu hình mặc định thường an toàn nhưng không hiệu quả: pm = dynamic với pm.max_children thấp (ví dụ 5) khiến WordPress chết ngạt khi có nhiều request; hoặc pm.max_children quá cao so với RAM VPS, gây swap/OOM. WordPress là CMS động, mỗi request cần một worker PHP. Nếu số worker ít, request phải xếp hàng chờ, TTFB tăng. Nếu thừa worker, RAM bị lãng phí. Mục tiêu là cân bằng: đủ worker để xử lý peak traffic, nhưng không vượt quá RAM khả dụng.
Bước 1 - Xác định dung lượng RAM và cấu hình hiện tại
Trước khi tối ưu, cần biết VPS có bao nhiêu RAM, và pool hiện tại đang dùng cấu hình gì.
Kiểm tra RAM khả dụng (không tính hệ điều hành + MySQL + Nginx):
free -m
Dòng available (hoặc free + buffers/cache) là RAM có thể dùng cho PHP-FPM. Ví dụ VPS 2GB RAM, sau MySQL và Nginx còn ~1200MB.
Xem cấu hình pool PHP-FPM đang dùng cho WordPress:
sudo cat /etc/php/8.3/fpm/pool.d/www.conf | grep -E '^pm|^pm\.|^request_terminate'
Output mẫu:
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Với 5 worker tối đa, nếu WordPress cần xử lý 6 request đồng thời, request thứ 6 sẽ chờ hoặc timeout.
Bước 2 - Chọn chế độ pm phù hợp
PHP-FPM có 3 chế độ quản lý worker:
- dynamic (mặc định): số worker thay đổi theo tải, có min và max. Phù hợp VPS nhỏ, traffic không đều.
- static: số worker cố định, mỗi worker chiếm RAM dù idle. Phù hợp VPS có RAM dư và traffic ổn định, nhưng thường gây lãng phí RAM.
- ondemand: worker chỉ sinh ra khi có request, tự động chết khi idle. Tốn RAM nhất khi idle (gần 0), nhưng có độ trễ khi bắt đầu request mới do phải tạo worker. Phù hợp VPS RAM rất thấp (<1GB) hoặc lượng request chậm.
Khuyến nghị cho WordPress: dùng pm = dynamic nếu VPS RAM < 4GB, hoặc pm = ondemand nếu RAM < 1GB. VPS RAM ≥ 4GB có thể thử pm = static nhưng cần tính toán kỹ max_children.
Bước 3 - Tính toán max_children
Mỗi worker PHP-FPM ngốn khoảng 30-50MB RAM tùy plugin WordPress. Công thức ước tính:
max_children = RAM khả dụng cho PHP / 35 (MB)
Ví dụ: RAM còn 1200MB → max_children ≈ 34. Nhưng nên để dự phòng 30% RAM cho hệ thống và đột biến → lấy ~24.
Kiểm tra RAM thực tế mỗi worker WordPress:
ps -ylC php-fpm8.3 --sort:rss | awk '{sum+=$8; count++} END {if(count>1) print "Trung bình RSS (MB):", sum/(count-1)/1024; else print "Chỉ có 1 process"}'
Lệnh trên cho giá trị RSS trung bình của tất cả worker PHP-FPM. Nếu output là 42 MB, dùng 42 thay 35 trong công thức.
Bước 4 - Áp dụng cấu hình tối ưu
Mở file pool của WordPress (thường /etc/php/8.3/fpm/pool.d/www.conf):
sudo nano /etc/php/8.3/fpm/pool.d/www.conf
Thiết lập các giá trị (ví dụ với VPS 2GB RAM, WordPress có plugin trung bình, RSS ~40MB):
pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pm.max_requests = 500
Giải thích:
pm.max_children = 20: cho phép tối đa 20 request đồng thời (ước tính tiêu tốn 20×40=800MB RAM, còn dư cho system).pm.start_servers = 4: khởi tạo 4 worker sẵn sàng khi FPM bắt đầu.pm.min_spare_servers = 2: giữ tối thiểu 2 worker idle để xử lý request ngay lập tức.pm.max_spare_servers = 8: không giữ quá 8 worker idle, tránh lãng phí RAM.pm.max_requests = 500: mỗi worker tự động chết sau 500 request, giúp giải phóng memory leak từ plugin.
Thêm dòng sau để giới hạn thời gian xử lý mỗi request (tránh worker bị kẹt vô hạn):
request_terminate_timeout = 60s
Lưu file và restart PHP-FPM:
sudo systemctl restart php8.3-fpm
Verify:
sudo systemctl status php8.3-fpm
ps aux | grep php-fpm | wc -l
Output mong đợi: số process ~ pm.start_servers + 1 (master process).
Bước 5 - Tối ưu Opcache
Opcache giúp PHP script WordPress không phải biên dịch lại sau mỗi request, giảm CPU load 30-50%. File cấu hình: /etc/php/8.3/fpm/conf.d/10-opcache.ini.
sudo nano /etc/php/8.3/fpm/conf.d/10-opcache.ini
Điều chỉnh:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
memory_consumption=128: 128MB cho opcache, phù hợp WordPress có ~200-400 plugin file.max_accelerated_files=10000: lưu đến 10000 file script trong cache.revalidate_freq=60: kiểm tra file thay đổi mỗi 60 giây. Nếu bạn thường xuyên deploy code, giảm xuống 2 hoặc tắt bằng 0.
Restart PHP-FPM:
sudo systemctl restart php8.3-fpm
Verify opcache hoạt động (tạo file PHP check):
echo '<?php var_dump(opcache_get_status());' | sudo tee /var/www/html/opcheck.php
Truy cập http://your-server-ip/opcheck.php. Tìm ["opcache_enabled"]=> bool(true). Sau đó xóa file kiểm tra.
Bước 6 - Tối ưu cấu hình Nginx cho PHP-FPM
Nếu Nginx gửi request vào PHP-FPM sai cách, hiệu năng cũng giảm. Kiểm tra file cấu hình Nginx cho WordPress:
sudo nano /etc/nginx/sites-available/wordpress
Trong block location ~ \.php$:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 120s;
}
fastcgi_bufferstăng từ mặc định (8 8k) lên để Nginx đệm nhiều response hơn, giảm tác vụ I/O xuống PHP-FPM.fastcgi_read_timeouttăng lên 120s, tránh timeout với request lâu (import WordPress, upload file lớn).
Test Nginx và reload:
sudo nginx -t
sudo systemctl reload nginx
Xử lý lỗi thường gặp
Lỗi 502 Bad Gateway
Nguyên nhân: PHP-FPM không kịp xử lý request do max_children quá thấp, hoặc FPM chết. Kiểm tra log:
sudo journalctl -u php8.3-fpm --since "10 minutes ago" | grep -i error
Nếu thấy WARNING: [pool www] server reached pm.max_children setting, tăng pm.max_children. Nếu thấy WARNING: [pool www] server seems busy nhưng không đầy, hãy kiểm tra request_terminate_timeout.
Lỗi 504 Gateway Timeout
Request PHP xử lý quá 60s (request_terminate_timeout). Nguyên nhân: plugin WordPress gây ra (backup, cron jobs). Tăng timeout lên 120s nếu cần, hoặc tìm plugin lỗi.
WordPress admin chậm dần theo thời gian
Memory leak từ plugin hoặc theme. Tăng pm.max_requests lên 1000 hoặc bật pm.status_path để theo dõi số request mỗi worker. Giải pháp triệt để: dùng VPS WordPress được tối ưu sẵn với LiteSpeed LSCache, hoặc cài Redis cache cho object cache.
Câu hỏi thường gặp
Có nên dùng pm = static cho VPS 1GB RAM không?
Không nên. Static giữ worker cố định dù không có request, lãng phí RAM. Với RAM ≤ 1GB, dùng pm = ondemand hoặc dynamic với max_children ≤ 10 là hợp lý.
Sau khi thay đổi cấu hình PHP-FPM, cần restart Nginx không?
Không. PHP-FPM và Nginx giao tiếp qua socket hoặc TCP; chỉ restart PHP-FPM. Tuy nhiên nếu bạn thay đổi config Nginx (buffers, timeout), cần reload Nginx.
Làm sao biết cấu hình PHP-FPM hiện tại có đủ cho lượng traffic?
Dùng lệnh sudo tail -f /var/log/php8.3-fpm.log khi có traffic thật. Nếu thấy dòng WARNING: reached pm.max_children setting, tăng max_children. Kiểm tra RAM với free -m trước khi tăng.
Opcache có ảnh hưởng đến việc cập nhật WordPress không?
Có, nếu revalidate_freq quá lớn. Khi cập nhật WordPress hoặc plugin, file PHP mới chưa được cache lại sau 60 giây (theo cấu hình trên). Bạn có thể set opcache.revalidate_freq=0 nếu muốn cập nhật real-time, nhưng tốn CPU hơn.
VPS Ubuntu kernel mặc định có ảnh hưởng đến PHP-FPM không?
Không trực tiếp. Tuy nhiên kernel có thể ảnh hưởng đến swap và I/O. Nếu VPS dùng NVMe, đọc thêm bài tối ưu Linux và NVMe cho workload I/O cao.
Bài viết liên quan
- Tối ưu Nginx cho traffic cao
- Tăng tốc WordPress bằng LiteSpeed và LSCache
- Benchmark hiệu năng VPS với fio, sysbench, iperf3
- Cách cài Docker trên VPS Ubuntu


