Tối ưu PHP 8.x trên CentOS Stream 9: Bí kíp ép xung PHP-FPM và OPcache từ thực chiến

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Cách đây không lâu, khi CentOS 8 chính thức “khai tử”, mình từng phải thức trắng vài đêm để di chuyển dàn 5 server khách hàng sang CentOS Stream 9. Lúc đó, thử thách lớn nhất không phải là cài đặt. Cái khó là làm sao để đống code PHP cũ chạy mượt mà, không ngốn sạch RAM mà vẫn đáp ứng được lượng traffic đang tăng trưởng.

Nhiều bạn có thói quen chỉ gõ lệnh dnf install php rồi để mặc cấu hình mặc định. Kết quả là khi traffic chạm mốc vài chục user cùng lúc, server bắt đầu báo lỗi 502 hoặc CPU nhảy vọt lên 100%. Bài viết này là những kinh nghiệm thực tế mình đúc kết được để giúp ứng dụng PHP của bạn “lột xác” hoàn toàn.

Tại sao cấu hình mặc định lại khiến PHP chạy chậm?

Mặc định, các thông số trên CentOS Stream 9 được thiết lập ở mức cực kỳ an toàn để ưu tiên tính tương thích. Tuy nhiên, sự an toàn này lại vô tình bóp nghẹt hiệu năng của phần cứng.

Dưới đây là ba “điểm nghẽn” chí mạng:

  • PHP-FPM Pool: Chế độ dynamic mặc định thường để số lượng process quá thấp. Khi có đợt truy cập đột ngột, request phải xếp hàng chờ xử lý.
  • Bỏ quên OPcache: Không có OPcache, PHP phải đọc, phân tích và biên dịch lại code cho mỗi lần chạy. Việc này cực kỳ lãng phí tài nguyên CPU.
  • Phiên bản cũ: Repo mặc định đôi khi không cập nhật các bản PHP mới nhất (như 8.3). Bạn sẽ bỏ lỡ các cải tiến về JIT (Just-In-Time) giúp tăng tốc xử lý đáng kể.

Sử dụng Remi Repository: Tiêu chuẩn cho dân chuyên nghiệp

Đừng dùng bản PHP có sẵn của hệ điều hành. Mình luôn ưu tiên Remi Repository vì nó cập nhật cực nhanh và ổn định.

Bước 1: Cài đặt PHP 8.x chuẩn chỉnh

Đầu tiên, hãy nạp EPEL và Remi repo vào hệ thống:

# Cài đặt EPEL và Remi
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm

# Reset và kích hoạt PHP 8.2 (hoặc 8.3)
sudo dnf module reset php -y
sudo dnf module enable php:remi-8.2 -y

# Cài đặt các extension thiết yếu
sudo dnf install -y php-fpm php-cli php-gd php-mysqlnd php-mbstring php-xml php-opcache php-zip php-curl

Bước 2: Tinh chỉnh PHP-FPM để gánh tải

File cấu hình bạn cần xử lý nằm tại /etc/php-fpm.d/www.conf. Đừng bao giờ dùng thông số mặc định cho server production.

Để tính pm.max_children, mình thường dùng công thức: (RAM tổng – RAM hệ thống) / 50MB (kích thước trung bình một process PHP). Với server 4GB RAM, để khoảng 60 processes là con số an toàn.

Mở file cấu hình:

sudo vi /etc/php-fpm.d/www.conf

Hãy điều chỉnh các thông số sau để tối ưu tốc độ phản hồi:

pm = dynamic
pm.max_children = 60
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30
; Reset process sau 500 request để giải phóng RAM bị leak
pm.max_requests = 500

Mẹo nhỏ: Nếu server chỉ chạy duy nhất một website lớn, hãy đổi sang pm = static. Cách này giúp loại bỏ độ trễ khi hệ thống phải khởi tạo process mới.

Bước 3: Kích hoạt sức mạnh OPcache

OPcache giúp lưu mã bytecode vào RAM, giúp PHP phản hồi gần như tức thì. Một website WordPress thông thường có thể chứa hàng ngàn file, vì vậy cấu hình mặc định là không đủ.

Sửa file /etc/php.d/10-opcache.ini với các thông số thực chiến:

opcache.enable=1
; Tăng lên 256MB nếu bạn chạy nhiều plugin/framework nặng
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
; WordPress cần tối thiểu 10000 để cache toàn bộ file hệ thống
opcache.max_accelerated_files=10000
; Trong môi trường production, hãy để 60 giây để giảm check file liên tục
opcache.revalidate_freq=60
; Bật file cache để khởi động nhanh hơn sau khi reboot server
opcache.file_cache=/var/lib/php/opcache

Bước 4: Kiểm tra và áp dụng

Trước khi restart, hãy kiểm tra xem bạn có gõ nhầm dấu nào không:

sudo php-fpm -t

Nếu hiện test is successful, hãy kích hoạt dịch vụ:

sudo systemctl enable php-fpm
sudo systemctl restart php-fpm

Unix Socket: Cú hích hiệu năng cuối cùng

Mặc định PHP-FPM kết nối qua cổng 9000 (TCP). Nếu Web Server và PHP nằm chung một máy, hãy chuyển sang dùng Unix Socket. Việc này giúp bỏ qua overhead của tầng network, tăng khoảng 10-15% throughput.

Trong www.conf, thay đổi đường dẫn listen:

listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

Đừng quên cập nhật cấu hình Nginx của bạn trỏ vào file .sock này thay vì 127.0.0.1:9000.

Lời kết

Tối ưu PHP không có một công thức vạn năng cho mọi cấu hình. Với các hệ thống thương mại điện tử cần tính toán nhiều, mình còn bật thêm JIT (Just-In-Time) để đẩy hiệu suất lên kịch trần.

Lời khuyên của mình là hãy bắt đầu với các thông số trên, sau đó theo dõi bằng htop. Nếu RAM vẫn dư mà CPU quá tải, hãy tăng dần pm.max_children. Hy vọng những chia sẻ này giúp server của bạn chạy mượt mà và ổn định hơn!

Share: