PHP-FPM (PHP FastCGI Process Manager) là một công cụ cần thiết khi bạn muốn sử dụng PHP với Nginx. Hướng dẫn này sẽ giúp bạn cài đặt và cấu hình PHP-FPM trên máy chủ để tối ưu hóa hiệu suất khi sử dụng với Nginx. Để hiểu rõ hơn có thể đọc tại đây: PHP FPM là gì. Tìm hiểu cách PHP FPM hoạt động
Cài đặt PHP và PHP-FPM
Đối với CentOS/RHEL
sudo dnf install php8.3 php8.3-cli php8.3-fpm
sudo systemctl start php-fpm
Đối với Ubuntu/Debian
sudo apt update
sudo apt install php php-fpm -y
Lệnh này sẽ cài đặt PHP và khởi chạy dịch vụ PHP-FPM trên hệ thống.
Kiểm tra version
php -v
# PHP 8.3.6 (cli) (built: Sep 30 2024 15:17:17) (NTS
php-fpm -v
# PHP 8.3.10 (fpm-fcgi) (built: Jul 30 2024 13:44:37)
# or
php-fpm8.3 -v
# PHP 8.3.6 (fpm-fcgi) (built: Sep 30 2024 15:17:17)
Khởi động dịch vụ php-fpm
systemctl start php8.3-fpm
## hoặc
systemctl start php-fpm
Kiểm tra status
systemctl status php8.3-fpm
# Hoặc
systemctl status php-fpm
Kích hoạt PHP-FPM khởi động cùng hệ thống:
systemctl enable php8.3-fpm
# Hoặc
systemctl enable php-fpm
Kiểm tra tiến trình
ps aux | grep php
bạn sẽ thấy 1 trong các kết quả sau;
# Kết quả mặc định trên ubuntu
root 11295 0.0 1.1 206832 21756 ? Ss 07:45 0:00 php-fpm: master process (/etc/php/8.3/fpm/php-fpm.conf)
www-data 11296 0.0 0.4 207340 8660 ? S 07:45 0:00 php-fpm: pool www
# Kết quả mặc định trên AL2023
root 27510 0.0 1.3 401548 25520 ? Ss 09:42 0:00 php-fpm: master process (/etc/php-fpm.conf)
apache 27511 0.0 1.9 407376 38112 ? S 09:42 0:00 php-fpm: pool www
apache 27512 0.0 1.6 401948 32100 ? S 09:42 0:00 php-fpm: pool www
apache 27513 0.0 1.6 401948 31924 ? S 09:42 0:00 php-fpm: pool www
apache 27514 0.0 1.5 401948 30464 ? S 09:42 0:00 php-fpm: pool www
apache 27515 0.0 0.3 401548 7488 ? S 09:42 0:00 php-fpm: pool www
Cấu hình PHP-FPM
Cấu hình global
File cấu hình chính dùng để thiết lập các cài đặt chung cho toàn bộ dịch vụ PHP-FPM.
Thường file cấu hình chính nằm ở /etc/php/8.3/fpm/php-fpm.conf
(có thể khác nhau tùy theo phiên bản PHP).
vi /etc/php/8.3/fpm/php-fpm.conf
# Hoặc
vi /etc/php-fpm.conf
Nội dung file cấu hình chính của Ubuntu
thường như sau:
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;
[global]
pid = /run/php/php8.3-fpm.pid
error_log = /var/log/php8.3-fpm.log
include=/etc/php/8.3/fpm/pool.d/*.conf
Nội dung file cấu hình chính của AmazonLinux
thường như sau:
;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;
include=/etc/php-fpm.d/*.conf
[global]
pid = /run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
daemonize = yes
error_log
: Đường dẫn của tệp log để ghi lại các lỗi của PHP-FPM.
include
: Đường dẫn chứa các tệp cấu hình phụ (thường là /etc/php-fpm.d/*.conf), cho phép PHP-FPM sử dụng cấu trúc chia nhỏ thành các tệp pool.
pid
: Đường dẫn tệp chứa ID của tiến trình PHP-FPM, giúp hệ thống quản lý tiến trình của PHP-FPM.
events.mechanism
: Cơ chế sự kiện để điều phối các tiến trình, chẳng hạn như epoll hoặc kqueue (tùy thuộc vào hệ điều hành).
Cấu hình PHP-FPM pool
Khi cài đặt PHP-FPM sẽ có 1 tệp www.conf
dùng để cấu hình cho nhóm tiến trình PHP-FPM chính.
Trong tệp này, bạn có thể cấu hình chi tiết cách PHP-FPM xử lý các yêu cầu PHP cho một nhóm tiến trình cụ thể.
Mỗi "pool" là một nhóm tiến trình PHP có thể được cấu hình riêng biệt để phục vụ các ứng dụng hoặc domain khác nhau
# Đối với Centos/AL2023
vi /etc/php-fpm.d/www.conf
# Đối với Ubuntu
vi /etc/php/8.3/fpm/pool.d/www.conf
Nội dung tệp www.conf
sẽ như sau:
; Start a new pool named 'www'.
[www]
user = apache
group = apache
listen = /run/php-fpm/www.sock
listen.acl_users = apache,nginx
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
;pm.max_requests = 500
slowlog = /var/log/php-fpm/www-slow.log
;php_admin_value[memory_limit] = 128M
listen
: Địa chỉ socket mà PHP-FPM sẽ sử dụng để nhận các yêu cầu, có thể là Unix socket (/run/php/php8.x-fpm.sock) hoặc TCP socket (127.0.0.1:9000).- Bạn có thể đổi sang TCP socket để dễ dàng quản lý:
listen = 127.0.0.1:9000
- Bạn có thể đổi sang TCP socket để dễ dàng quản lý:
user và group
: Người dùng và nhóm mà các tiến trình PHP sẽ chạy với quyền đó (thường là www-data trên Ubuntu hoặc nginx trên CentOS).pm
(Process Manager): Kiểu quản lý tiến trình và số lượng tiến trình cho phép chạy đồng thời. Có ba tùy chọn:static
: Số lượng cố định các tiến trình.dynamic
: Tạo tiến trình động theo nhu cầu.ondemand
: Chỉ tạo tiến trình khi có yêu cầu.
pm.max_children
: Số lượng tiến trình PHP tối đa cho pool này.pm.start_servers
: Số lượng tiến trình PHP bắt đầu cho pool này.pm.min_spare_servers
: Số lượng tiến trình PHP tối thiểu để dự phòng cho pool này.pm.max_spare_servers
: Số lượng tiến trình PHP tối đa để dự phòng cho pool này.php_admin_value
vàphp_value
: Các cấu hình PHP cụ thể cho pool này, chẳng hạn như memory_limit hoặc upload_max_filesize.
Cấu hình tệp php.ini
Tệp php.ini
chứa các tùy chỉnh PHP chung, chẳng hạn như bộ nhớ tối đa và thời gian thực thi tối đa:
sudo vi /etc/php.ini
# or
sudo vi /etc/php/8.x/fpm/php.ini
Một số cài đặt quan trọng bạn có thể thay đổi:
memory_limit
: Giới hạn bộ nhớ tối đa cho một tiến trình PHP (VD: memory_limit = 128M).upload_max_filesize
vàpost_max_size
: Giới hạn kích thước tải lên (VD: upload_max_filesize = 50M, post_max_size = 50M).max_execution_time
: Thời gian tối đa cho một tập lệnh PHP chạy (VD: max_execution_time = 30 giây).
Cấu hình Nginx để sử dụng PHP-FPM
Để sử dụng PHP-FPM với Nginx, bạn cần cấu hình Nginx để chuyển tiếp các yêu cầu PHP đến PHP-FPM.
Thêm cấu hình PHP cho Nginx
Trong phần server, thêm cấu hình sau để Nginx xử lý các tệp PHP thông qua PHP-FPM:
sudo vim /etc/nginx/conf.d/site1.conf
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
root /var/www/html;
fastcgi_pass unix:/run/php-fpm/www.sock; # Hoặc fastcgi_pass 127.0.0.1:9000 nếu sử dụng TCP socket
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
listen 80
: Nginx sẽ lắng nghe trên cổng 80 (HTTP).try_files
: Nếu file tĩnh không tồn tại, sẽ chuyển yêu cầu đến index.php.location ~ .php$
: Cấu hình cho các file PHP.fastcgi_pass
: Chỉ định socket của PHP-FPM.fastcgi_index
: File index mặc định của PHP.fastcgi_param
: Truyền các biến môi trường cho PHP-FPM.include fastcgi_params
: Bao gồm các tham số mặc định của FastCGI.
Kiểm tra và tải lại Nginx
Sau khi hoàn tất, kiểm tra cấu hình Nginx để đảm bảo không có lỗi:
sudo nginx -t
Nếu mọi thứ ổn, tải lại Nginx để áp dụng thay đổi:
sudo systemctl reload nginx
Kiểm tra cấu hình php
Để kiểm tra PHP-FPM đã hoạt động đúng chưa, tạo một tệp PHP đơn giản, chẳng hạn như info.php trong thư mục gốc của trang web:
sudo vi /var/www/html/info.php
Thêm nội dung sau vào tệp:
<?php
phpinfo();
Truy cập http://server-ip/info.php trên trình duyệt, bạn sẽ thấy một trang hiển thị thông tin cấu hình PHP nếu PHP-FPM hoạt động đúng.
Thêm nội dung cho trang chủ
sudo vi /var/www/html/index.php
Thêm nội dung sau vào tệp:
<?php
echo "Hello world";
Truy cập http://server-ip trên trình duyệt, bạn sẽ thấy dòng chữ Hello world
xuất hiện
Kết luận
Bài hướng dẫn trên đã giới thiệu cách cài đặt và cấu hình PHP-FPM để làm việc với Nginx. PHP-FPM giúp tối ưu hóa hiệu suất khi xử lý mã PHP, rất cần thiết khi triển khai các trang web PHP trên máy chủ Nginx.