Fast Byte - Thuê VPS Giá Rẻ
Hướng dẫn chung

[2026] Cách Cấu Hình PHP-FPM Trên Ubuntu 26.04, 24.04 & 22.04 Chi Tiết A-Z

Một cụm máy chủ web hiệu năng cao và ổn định phụ thuộc rất lớn vào mắt xích kết nối giữa máy chủ web và trình thông dịch PHP. Cụ thể, Nginx cần chuyển tiếp các yêu cầu xử lý file động đến đúng socket của giao thức quản lý tiến trình PHP-FPM tương ứng […]

Ảnh đại diện Thanh Lam NguyễnThanh Lam Nguyễn14 phút đọc

Một cụm máy chủ web hiệu năng cao và ổn định phụ thuộc rất lớn vào mắt xích kết nối giữa máy chủ web và trình thông dịch PHP. Cụ thể, Nginx cần chuyển tiếp các yêu cầu xử lý file động đến đúng socket của giao thức quản lý tiến trình PHP-FPM tương ứng với nhánh phiên bản mặc định trên hệ thống. Bài viết này từ đội ngũ kỹ thuật của ThueVPSGiaRe.vn sẽ hướng dẫn bạn chi tiết từ A đến Z cách cấu hình PHP-FPM với Nginx trên các phiên bản Ubuntu 26.04, 24.04 và 22.04 LTS, tối ưu hóa pool tiến trình, giám sát trạng thái và khắc phục triệt để các lỗi vận hành thường gặp.

1. Tổng quan phiên bản PHP-FPM mặc định trên Ubuntu

Nguyên lý kết nối: Tên các gói cài đặt trên hệ điều hành Ubuntu Linux được duy trì nhất quán qua các bản phát hành LTS, tuy nhiên nhánh phiên bản PHP mặc định sẽ thay đổi theo từng thế hệ hệ điều hành. Việc xác định đúng đường dẫn socket và tên dịch vụ systemd là điều kiện tiên quyết để Nginx giao tiếp thành công với backend PHP.

Bản phân phối Ubuntu Phiên bản PHP mặc định Tên dịch vụ Systemd Đường dẫn Unix Socket
Ubuntu 26.04 LTS PHP 8.5.x php8.5-fpm.service /run/php/php8.5-fpm.sock
Ubuntu 24.04 LTS PHP 8.3.x php8.3-fpm.service /run/php/php8.3-fpm.sock
Ubuntu 22.04 LTS PHP 8.1.x php8.1-fpm.service /run/php/php8.1-fpm.sock

2. Cài đặt PHP-FPM và xác định Socket trên Ubuntu

Khi triển khai máy chủ theo mô hình máy chủ LEMP Stack, việc cài đặt tường minh các gói nginx, php-cli, php-fpmcurl sẽ giúp hệ thống tinh gọn, tránh nạp các phụ thuộc không cần thiết của gói metapackage Apache.

Cài đặt PHP-FPM và xác định Socket trên Ubuntu

Thực thi lệnh cập nhật và cài đặt các gói phần mềm cần thiết qua APT:

sudo apt update
sudo apt install nginx php-cli php-fpm curl

Lưu ý: Gói php-fpm nằm trong thành phần Universe của Ubuntu. Nếu APT báo không tìm thấy gói, hãy kích hoạt kho Universe bằng lệnh sudo add-apt-repository universe rồi tiến hành cập nhật lại.

Xác định biến phiên bản và kiểm tra Socket hoạt động

Để tự động hóa cấu hình mà không cần nhập tay phiên bản PHP trên từng đời Ubuntu, bạn hãy lưu phiên bản hiện hành vào một biến môi trường và in kiểm tra đường dẫn socket:

PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
printf 'PHP %s\n' "$PHP_VERSION"
printf '/run/php/php%s-fpm.sock\n' "$PHP_VERSION"

Trên Ubuntu 26.04, kết quả:

PHP 8.5
/run/php/php8.5-fpm.sock

Kiểm tra trạng thái kích hoạt và tự khởi động cùng hệ thống của dịch vụ PHP-FPM:

systemctl is-active "php${PHP_VERSION}-fpm"
systemctl is-enabled "php${PHP_VERSION}-fpm"

Kết quả trả về chuẩn mực phải bao gồm hai dòng: activeenabled.

Kiểm tra quyền sở hữu user, group và file socket trong tệp cấu hình pool mặc định (mặc định Nginx và PHP-FPM trên Ubuntu đều chạy dưới user www-data):

grep -E '^(user|group|listen) =' "/etc/php/${PHP_VERSION}/fpm/pool.d/www.conf"

Kết quả output trên Ubuntu 26.04:

user = www-data
group = www-data
listen = /run/php/php8.5-fpm.sock

Cuối cùng, hãy đảm bảo tệp tin socket thực tế đã tồn tại trong thư mục /run/php/ trước khi kết nối Nginx:

test -S "/run/php/php${PHP_VERSION}-fpm.sock" && echo "PHP-FPM socket exists"

Kết quả:

PHP-FPM socket exists

Khi có nhu cầu mở rộng tính năng cho website (như kết nối MySQL, xử lý ảnh hay lưu đệm), bạn có thể tham khảo hướng dẫn cài đặt thêm các PHP Extension vào môi trường máy chủ.

3. Cấu hình Nginx kết nối PHP-FPM và xác thực luồng xử lý

Để định tuyến mã nguồn qua máy chủ web Nginx, trước tiên chúng ta tạo một thư mục gốc chứa mã nguồn cùng tệp PHP kiểm thử. Thay thế example.comthành tên máy chủ và đường dẫn đến trang web thực.

Cấu hình Nginx kết nối PHP-FPM

sudo mkdir -p /var/www/example.com/public
printf '%s\n' '<?php echo "php-fpm-ok\n";' | sudo tee /var/www/example.com/public/index.php >/dev/null

Tạo khối cấu hình Server Block (Virtual Host) cho tên miền. Bản phân phối Nginx trên Ubuntu cung cấp sẵn đoạn mã snippets/fastcgi-php.conf với đầy đủ tham số FastCGI chuẩn và bước kiểm tra sự tồn tại của tệp tin trước khi chuyển tiếp:

PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
sudo tee /etc/nginx/sites-available/example.com >/dev/null <<EOF
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com/public;
    index index.php index.html;

    location / {
        try_files \$uri \$uri/ /index.php?\$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php${PHP_VERSION}-fpm.sock;
    }

    location ~ /\. {
        deny all;
    }
}
EOF

Kích hoạt Server Block bằng cách tạo liên kết mềm, kiểm tra cú pháp và nạp lại Nginx:

sudo ln -sf /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo nginx -t
sudo systemctl reload nginx

Thông báo kiểm tra thành công sẽ hiển thị: syntax is oktest is successful.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Gửi yêu cầu HTTP nội bộ qua curl kèm tiêu đề Host để kiểm chứng luồng thực thi:

curl -fsS -H 'Host: example.com' http://127.0.0.1/

Nếu màn hình xuất ra chuỗi php-fpm-ok, Nginx đã chuyển tiếp yêu cầu chính xác tới PHP-FPM và nhận về kết quả thực thi hoàn chỉnh thay vì hiển thị mã nguồn thô.

Khi đưa máy chủ vào hoạt động thực tế trên Internet, hãy đảm bảo chỉ mở các cổng mạng cần thiết thông qua việc thiết lập tường lửa UFW trên Ubuntu, đồng thời tiến hành cài đặt chứng chỉ SSL Let’s Encrypt bằng Certbot để bảo vệ lưu lượng truy cập qua giao thức HTTPS an toàn.

4. Tinh chỉnh thông số Pool PHP-FPM theo lưu lượng truy cập

Mọi tinh chỉnh hiệu năng chủ yếu được thực hiện trong tệp cấu hình pool của nhánh PHP đang hoạt động. Trước khi thay đổi giới hạn tiến trình worker, hãy luôn tạo bản sao lưu tệp cấu hình gốc:

sudo cp "/etc/php/${PHP_VERSION}/fpm/pool.d/www.conf" "/etc/php/${PHP_VERSION}/fpm/pool.d/www.conf.bak"
sudo nano "/etc/php/${PHP_VERSION}/fpm/pool.d/www.conf"

Lựa chọn chế độ quản lý tiến trình (Process Manager Mode)

Chế độ (Mode) Tình huống sử dụng tối ưu Các chỉ thị cấu hình cốt lõi
dynamic Website tổng hợp, lượng truy cập biến động thường xuyên theo các khung giờ trong ngày. pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers
ondemand Website lưu lượng thấp hoặc nhiều site nhỏ; tiến trình rảnh rỗi sẽ tự động giải phóng để tiết kiệm RAM. pm.max_children, pm.process_idle_timeout, pm.max_requests
static Hệ thống tải cao liên tục trên máy chủ có cấu hình RAM cố định chuyên biệt. pm.max_children

Đối với chế độ dynamic ở mức vừa phải, bạn có thể bắt đầu với các thông số an toàn và nâng dần lên sau khi theo dõi mức chiếm dụng RAM thực tế:

pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pm.max_requests = 500

Đối với các website có lượng truy cập thấp, chế độ ondemand sẽ giúp giữ mức tiêu thụ RAM ở mức tối thiểu bằng cách tự động tắt các tiến trình không còn nhận request:

pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 10s
pm.max_requests = 500

Hãy luôn kiểm tra tính hợp lệ của file cấu hình PHP-FPM trước khi khởi động lại dịch vụ:

sudo "php-fpm${PHP_VERSION}" -t 2>&1 | grep 'test is successful' | sed -E 's/^\[[^]]+\] NOTICE: //'
sudo systemctl restart "php${PHP_VERSION}-fpm"

Đầu ra thành công sẽ thông báo đường dẫn file cấu hình đã được kiểm tra đạt chuẩn:

configuration file /etc/php/8.5/fpm/php-fpm.conf test is successful

Mẹo tối ưu: Khi hoàn thiện triển khai cho môi trường production, bạn có thể kết hợp thêm cơ chế FastCGI Cache trên Nginx để lưu tạm các phản hồi động, giúp giảm tải đáng kể các tác vụ tính toán lặp đi lặp lại của PHP-FPM.

Thuê VPS Giá Rẻ

SSD NVMe U.2 – CPU Intel Gold

Hạ tầng tối ưu chuyên sâu cho PHP-FPM

Fast Byte cung cấp máy chủ ảo VPS giá rẻ chỉ từ 50K/tháng với vi xử lý Intel Gold đời mới và ổ cứng SSD NVMe U.2 Enterprise tốc độ cao, giúp các tiến trình worker PHP-FPM xử lý tác vụ mượt mà, loại bỏ triệt để độ trễ I/O đĩa khi lượng truy cập tăng đột biến.

Khám phá VPS Fast Byte ngay

5. Khởi tạo Pool PHP-FPM riêng biệt để cô lập ứng dụng

Khi bạn vận hành nhiều website trên cùng một máy chủ và một ứng dụng đòi hỏi giới hạn tài nguyên riêng, socket độc lập hoặc cơ chế giám sát tách biệt, việc tạo một pool riêng là giải pháp lý tưởng nhất.

Sao chép tệp pool mặc định sang tệp cấu hình mới:

sudo cp "/etc/php/${PHP_VERSION}/fpm/pool.d/www.conf" "/etc/php/${PHP_VERSION}/fpm/pool.d/example.conf"
sudo nano "/etc/php/${PHP_VERSION}/fpm/pool.d/example.conf"

Thiết lập tên pool và đường dẫn socket riêng biệt (ví dụ với PHP 8.5 trên Ubuntu 26.04; nếu dùng Ubuntu 24.04/22.04, hãy thay 8.5 bằng 8.3 hoặc 8.1):

[example]
user = www-data
group = www-data
listen = /run/php/php8.5-fpm-example.sock
listen.owner = www-data
listen.group = www-data
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 10s
pm.max_requests = 500

Kiểm tra cấu hình và khởi động lại dịch vụ PHP-FPM:

sudo "php-fpm${PHP_VERSION}" -t
sudo systemctl restart "php${PHP_VERSION}-fpm"

Sau đó, cập nhật chỉ thị trong Server Block Nginx của website tương ứng để trỏ trực tiếp về socket mới:

fastcgi_pass unix:/run/php/php8.5-fpm-example.sock;

6. Giám sát trạng thái hoạt động của PHP-FPM (Status Page)

PHP-FPM tích hợp sẵn các endpoint thông báo trạng thái rất nhẹ giúp theo dõi sức khỏe tiến trình worker. Mở tệp pool cần theo dõi và bỏ dấu chú thích (hoặc thêm mới) hai dòng:

pm.status_path = /fpm-status
ping.path = /fpm-ping

Khai báo khối location bảo vệ nghiêm ngặt trong Nginx. Khối này sử dụng tệp fastcgi_params tiêu chuẩn và giới hạn chỉ cho phép truy cập từ máy chủ cục bộ (localhost):

location ~ ^/(fpm-status|fpm-ping)$ {
    allow 127.0.0.1;
    allow ::1;
    deny all;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/run/php/php8.5-fpm.sock;
}

Cảnh báo an ninh: Tuyệt đối không mở công khai endpoint này ra bên ngoài Internet, vì thông tin số lượng tiến trình và hành vi ứng dụng có thể bị kẻ xấu khai thác.

Kiểm tra cấu hình, nạp lại cả hai dịch vụ và truy vấn dữ liệu trạng thái:

sudo "php-fpm${PHP_VERSION}" -t
sudo systemctl reload "php${PHP_VERSION}-fpm"
sudo nginx -t
sudo systemctl reload nginx
curl -fsS -H 'Host: example.com' http://127.0.0.1/fpm-status

Kết quả trả về sẽ hiển thị chi tiết tên pool, chế độ quản lý tiến trình và trạng thái các worker:

pool:                 www
process manager:      dynamic
start time:           ...
accepted conn:        1
listen queue:         0
max listen queue:     0
listen queue len:     0
idle processes:       4
active processes:     1
total processes:      5
max active processes: 1
max children reached: 0

Giám sát trạng thái hoạt động của PHP-FPM

7. Quy trình cập nhật Nginx và PHP-FPM trên Ubuntu

Các bản vá bảo mật cho Nginx và PHP-FPM được phát hành định kỳ qua kho APT của Ubuntu. Để kiểm tra danh sách bản nâng cấp:

sudo apt update
apt list --upgradable

Nếu chỉ muốn nâng cấp riêng biệt các thành phần thuộc web stack mà không ảnh hưởng tới các gói phần mềm khác trên máy chủ:

PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
sudo apt install --only-upgrade nginx php-cli php-fpm "php${PHP_VERSION}-fpm" "php${PHP_VERSION}-cli"

Sau mỗi lần cập nhật gói, luôn thực hiện kiểm tra cú pháp trước khi reload tiến trình:

sudo "php-fpm${PHP_VERSION}" -t
sudo nginx -t
sudo systemctl reload "php${PHP_VERSION}-fpm"
sudo systemctl reload nginx

8. Khắc phục các sự cố phổ biến của PHP-FPM trên Ubuntu

Phần lớn các sự cố phát sinh từ PHP-FPM thường xoay quanh 4 nguyên nhân chính: lệch đường dẫn socket, dịch vụ chưa nạp cấu hình mới, Nginx thiếu khối xử lý FastCGI hoặc phân quyền file khiến tiến trình worker không có quyền đọc mã nguồn.

Khắc phục sự cố PHP-FPM trên Ubuntu

Sự cố 1: Lỗi 502 Bad Gateway

Mã phản hồi HTTP 502 thường biểu thị việc Nginx đã tiếp nhận request trong block PHP nhưng không thể kết nối tới backend FastCGI (PHP-FPM socket). Để sửa lỗi 502 Bad Gateway, bạn cần kiểm tra đồng thời trạng thái service unit, sự tồn tại của file socket và chỉ thị fastcgi_pass đang khai báo trong Nginx:

PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
systemctl is-active "php${PHP_VERSION}-fpm"
test -S "/run/php/php${PHP_VERSION}-fpm.sock" && echo "socket exists"
sudo nginx -T 2>/dev/null | grep 'fastcgi_pass'

Nếu socket chỉ định trong Nginx không khớp với phiên bản PHP-FPM đang chạy, bạn hãy chỉnh sửa lại Server Block theo đúng nhánh phiên bản và áp dụng cẩm nang xử lý lỗi 502 Bad Gateway để khôi phục kết nối.

Sự cố 2: Trình duyệt hiển thị mã nguồn PHP thô dạng văn bản

Khi trình duyệt in toàn bộ mã nguồn PHP thay vì chạy trang web, nguyên nhân do Nginx đang trả về file như một tệp tĩnh. Hãy kiểm tra xem Server Block đã có khối location ~ \.php$ với đầy đủ hai chỉ thị sau chưa:

sudo nginx -T 2>/dev/null | grep -A4 'location ~ \\.php'

Kết quả bắt buộc phải có dòng include snippets/fastcgi-php.conf; và dòng chỉ thị fastcgi_pass hợp lệ.

Sự cố 3: Lỗi phân quyền truy cập tệp tin (Permission Denied)

Lỗi này xuất hiện khi tiến trình worker của PHP-FPM không có quyền đọc mã nguồn hoặc không thể ghi vào các thư mục upload/cache. Kiểm tra phân quyền dọc theo toàn bộ cây thư mục bằng công cụ namei:

namei -l /var/www/example.com/public/index.php

Đảm bảo toàn bộ các thư mục cha đều có quyền thực thi (execute) và user www-data có quyền đọc tệp tin.

Sự cố 4: Tràn bộ nhớ RAM (Memory Pressure)

Hiện tượng cạn kiệt bộ nhớ thường do chỉ số pm.max_children được đặt quá cao so với dung lượng RAM thực tế, hoặc mã nguồn có các truy vấn chậm giữ chân worker quá lâu. Kiểm tra lượng RAM thực tế (RSS) mà mỗi worker đang tiêu thụ:

ps -o pid,rss,cmd -C "php-fpm${PHP_VERSION}"

Cột RSS phản ánh dung lượng bộ nhớ tính bằng KiB của từng tiến trình. Hãy lấy dung lượng này nhân với số lượng worker dự kiến để đối chiếu với tổng RAM khả dụng trước khi nâng tham số pm.max_children.

9. Hướng dẫn gỡ bỏ cấu hình và gói phần mềm khi không sử dụng

Nếu bạn chỉ sử dụng cấu hình mẫu để kiểm thử hoặc muốn dọn sạch hệ thống để cài đặt lại từ đầu:

Bước 1: Gỡ bỏ Server Block và thư mục thử nghiệm:

sudo rm -f /etc/nginx/sites-enabled/example.com /etc/nginx/sites-available/example.com
sudo rm -rf /var/www/example.com
sudo nginx -t
sudo systemctl reload nginx

Bước 2: Gỡ bỏ các gói Nginx và PHP-FPM khỏi Ubuntu:

PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;' 2>/dev/null || true)
sudo apt remove nginx php-cli php-fpm "php${PHP_VERSION}-cli" "php${PHP_VERSION}-fpm"

Kiểm tra trạng thái dọn dẹp và chạy thử lệnh loại bỏ các gói phụ thuộc mồ côi (chạy ở chế độ dry-run an toàn trước):

sudo apt autoremove --dry-run

Như vậy, bạn đã hoàn tất quá trình cài đặt và cấu hình PHP-FPM kết nối với Nginx thông qua UNIX socket tiêu chuẩn trên các phiên bản Ubuntu 26.04, 24.04 và 22.04 LTS. Việc kiểm tra tính hợp lệ của cấu hình cú pháp và thực hiện truy vấn curl cục bộ đảm bảo đường truyền FastCGI luôn hoạt động trơn tru.

Từ nền tảng vững chắc này, bạn có thể an tâm triển khai các website thực tế, cấu hình bảo mật SSL, tinh chỉnh số lượng tiến trình worker phù hợp với tải và kích hoạt FastCGI Cache để website đạt hiệu suất tải trang cao nhất.

Trải nghiệm VPS tốc độ cao tại Fast Byte

Fast Byte cung cấp dịch vụ thuê VPS giá rẻ với 100% ổ cứng SSD NVMe U.2 Enterprise, CPU Intel Gold xung cao cùng băng thông không giới hạn, mang lại môi trường hoàn hảo để vận hành Nginx và PHP-FPM mượt mà chỉ từ 50K/tháng.

Đăng ký thuê VPS ngay

Ghi chú kỹ thuật: Hướng dẫn trên áp dụng chuẩn hóa cho Ubuntu 26.04, 24.04 và 22.04 LTS. Quản trị viên luôn được khuyến nghị thực hiện kiểm tra cú pháp cấu hình bằng lệnh nginx -tphp-fpm -t trước khi khởi động lại bất kỳ dịch vụ nền nào trên môi trường máy chủ thực tế.

Chia sẻ: Facebook LinkedIn
Quay lại trang blog

Bài viết liên quan

Cài PHP Extension Trên VPS
Hướng dẫn chung

Cài PHP Extension Trên VPS Như Thế Nào? Hướng Dẫn 5 Cách Cài A-Z [2026]

Trong quá trình vận hành website và ứng dụng web trên máy chủ ảo, chắc hẳn không ít lần bạn bắt gặp thông báo lỗi phổ biến như “Call to undefined function…” hay “Class not found…”. Nguyên nhân cốt lõi của tình trạng này thường xuất phát từ việc máy chủ chưa được kích hoạt […]

Thanh Lam Nguyễn
Đọc bài viết