[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 […]
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-fpm và curl 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.

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: active và enabled.
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.

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 ok và test 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.
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
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.

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.
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 -t và php-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ế.




