PHP-FPM cho phép tăng tốc PHP lên gấp nhiều lần, đặc biệt phù hợp với các web server có lưu lượng truy cập lớn. Bài viết này sẽ đi sâu vào giải thích về PHP-FPM là gì và cách hoạt động của PHP-FPM, đồng thời hướng dẫn cấu hình PH-FPM với cPanel và NGINX. Bạn hãy đọc tiếp nhé!
PHP-FPM là gì?
PHP-FPM viết tắt của FastCGI Process Manager là một triển khai PHP giúp tăng tốc độ thực thi cho các ứng dụng web, đồng thời cho phép admin kiểm soát mức tiêu thụ tài nguyên trên server.
Một triển khai PHP (còn gọi là runtime) có nhiệm vụ phiên dịch và thực thi code. Các runtime truyền thống như mod_PHP của Apache hoạt động bên trong web server. Trong cách triển khai này, mỗi kết nối tồn tại sẽ tiêu thụ một phần tài nguyên nhất định của server. Do đó, nếu có quá nhiều kết nối đồng thời thì server có thể nhanh chóng cạn kiện tài nguyên, ảnh hưởng nghiêm trọng đến hiệu suất của website.
Mặt khác, PHP-FPM vận hành bên ngoài web server và sử dụng một nhóm các quy trình để thực thi code (nhóm này thường được gọi là pool, và các quy trình này được gọi là worker process). Các worker sẽ sẵn sàng đợi các request đến, đồng thời cho phép admin quản lý số lượng worker trong mỗi pool.
Cách hoạt động của PHP-FPM
Cách hoạt động cụ thể của PHP-FPM như sau:
- Apache gửi code đến PHP-FPM thông qua một giao diện nhị phân tốc độ cao, gọi là FastCGI.
- Sau đó một supervisor sẽ chọn worker từ trong pool rồi gán code nhận được.
- Worker bây giờ thực thi code và trả kết quả về lại cho Apache để chuyển đến trình duyệt web.
- Sau khi worker hoàn tất, nó sẽ quay lại pool và tiếp tục đợi thực thi code.
Nếu có quá nhiều kết nối đồng thời, đôi khi hệ thống phải đợi đến khi có một worker nào đó khả dụng. Tuy nhiên nó sẽ không bao giờ tiêu thụ toàn bộ tài nguyên của server, vì vậy hiệu quả hơn các phương pháp khác ở trên web server lớn.
Sự khác nhau giữa PHP-CGI và PHP-FPM
Khi chạy PHP qua web server, có hai lựa chọn phổ biến là: chạy bằng CGI của PHP, hoặc chạy như một PHP-FPM. Vậy hai cách này có gì khác nhau? Hãy cùng tìm hiểu ở trong phần tiếp theo của bài viết này.
PHP-CGI
PHP-CGI là một giao thức truyền tin giữa một web server và một chương tình CGI. Một chương trình CGI là bất kỳ chương trình nào được thiết kế để nhận và trả về dữ liệu theo các tiêu chuẩn CGI. Về cơ bản thì đây là một cách để chạy script phía server (PHP, Perl, Python) khi có HTTP request.
Việc chạy ứng dụng trên web server bằng cách thực thi script PHP với ứng dụng CGI rất kém hiệu quả và ít khi được sử dụng vì mỗi khi code PHP cần được thực thi thì lại phải có một process mới. Tuy nhiên, PHP sẽ đọc cài đặt mỗi khi người dùng load một trang. Vì vậy nếu PHP chạy dưới dạng module, mọi thay đổi trong file php.ini sẽ không có hiệu lực cho đến khi người dùng restart lại web server. Vì vậy, CGI thường được sử dụng trong trường hợp người dùng cần kiểm tra nhiều cài đặt và xem các phản hồi tức thì của chúng.
Bên cạnh đó, việc chạy ứng dụng trên CGI là nó giữ cho việc thực thi mã được tách biệt khởi web server, giúp tăng thêm khả năng bảo mật cho hệ thống. Chẳng hạn, một script PHP lỗi hoặc không an toàn được thực thi qua PHP-CGI sẽ không thể ảnh hưởng đến bảo mật của bất kỳ file nào khác nằm ngoài miền nó được host.
Ưu điểm
- Bảo mật tốt hơn FPM vì code được thực thi hoàn toàn độc lập với web server.
Nhược điểm
- Hiệu suất kém.
PHP-FPM
Đây là một daemon FastCGI thay thế cho PHP, giúp các website có thể xử lý tải nặng nhanh hơn thông qua việc lưu trữ các pool. PHP-FPM nhanh hơn so với các phương pháp dựa trên CGI truyền thống như SUPHP. Ngoài ra, triển khai này cũng không làm quá tải bộ nhớ của hệ thống vì process Apache.
Một số tính năng của PHP-FPM gồm có:
- Số liệu thống kê cơ bản (mod_status của Apache).
- Quản lý quy trình nâng cao.
- Khởi động các worker với php.ini khác nhau.
- Logging Stdout & stderr.
- Restart khẩn cấp trong trường hợp vô tình làm hỏng bộ nhớ cache opcode.
- Tăng tốc độ upload.
- Hỗ trợ slowlog.
Ưu điểm
- Cách chạy ứng dụng hiện đại, tối ưu.
- Hiệu năng mạnh mẽ, tiêu thụ tài nguyên thấp.
- Footprint bộ nhớ nhỏ hơn, reload dễ dàng mà không cần dừng các truy vấn khác.
Nhược điểm
- Bảo mật kém hơn so với PHP-CGI.
- Cần cấu hình nhiều hơn PHP-CGI.
Nói chung, nếu bạn sở hữu website có traffic lớn và tài nguyên server thấp thì PHP-FPM sẽ là một lựa chọn hợp lý. Mặt khác, các website cơ bản nên sử dụng PHP-CGI vì khả năng thực thi code PHP tốt hơn, đồng thời cũng không sử dụng quá nhiều tài nguyên của các website nhỏ.
Nếu bạn đang cần tìm giải pháp máy chủ chất lượng cho website có lưu lượng truy cập lớn thì VPS Vietnix chính là giải pháp tối ưu nhất. Với VPS Vietnix, bạn sẽ được trang bị máy chủ ảo với cấu hình mạnh mẽ và tích hợp nhiều công nghệ tiên tiến nhất như ổ cứng NVMe tốc độ cao, CPU Platinum thế hệ mới, đảm bảo cho website load dưới 1 giây, hoạt động ổn định ngay cả khi lưu lượng truy cập tăng cao.
Thêm vào đó, VPS Vietnix còn cung cấp cho bạn khả năng toàn quyền tùy chỉnh và quản lý máy chủ của mình. Tính năng backup tự động mỗi tuần cũng giúp bạn lưu trữ dữ liệu an toàn trong mọi trường hợp. Với tất cả những lợi ích mà VPS Vietnix mang lại, đây chắc chắn là một lựa chọn tuyệt vời cho bất kỳ ai đang muốn nâng cao hiệu suất hoạt động của website của mình. Hãy thử VPS Vietnix ngay hôm nay và trải nghiệm sự khác biệt!
Cách sử dụng PHP-FPM với cPanel và EasyApache
Việc kích hoạt và cấu hình PHP-FPM trong cPanel & WHM tương đối đơn giản. Người dùng có thể tùy chọn miền sử dụng PHP-FPM và đặt các biến cấu hình có thể ảnh hưởng đến PHP-FPM.
Trước hết, hãy bật System PHP-FPM trong MultiPHP Manager.
Sau khi bật lên, WHM vẫn chưa kích hoạt PHP-FPM cho mọi domain có sẵn.
Ta có thể buộc mọi tài khoản trên server sử dụng PHP-FPM bằng cách click vào nút Convert All Accounts to PHP-FPM.
Ngoài ra, ta cũng có thể kích hoạt PHP-FPM cho từng domain trong bảng ở cuối trang.
Chọn domain rồi nhấn vào On trong menu drop-down như hình bên dưới:
Cấu hình PHP-FPM trong cPanel
Sau khi kích hoạt PHP-FPM, ta có thể cấu hình các cài đặt mặc định của của thống và cả cài đặt cho từng domain cụ thể trong MultiPHP Manager.
Click vào tab System PHP-FPM Configuration.
Có ba cài đặt pool cho người dùng thay đổi. Các giá trị mặc định gồm có:
- Max Requests: Số lượng request mỗi worker nên thực thi trước khi tự restart. Cài đặt này giúp hạn chế việc rò rỉ bộ nhớ. Giá trị mặc định 20 tương đối ổn với hầu hết các web hosting, nhưng ta nên đặt thành 40 hoặc 60 với các server có traffic lớn.
- Process Idle Timeout: Xác định thời gian chờ của các worker rảnh rỗi (idle) trước khi tự tắt. Các worker rảnh rỗi này dù không tiêu thụ tài nguyên, nhưng ta vẫn nên tắt các worker này sớm để giảm thời gian khởi tạo. Giá trị mặc định là 10, tương đối thấp với nhiều server có traffic lớn.
- Max Children: Số lượng worker tối đa trong mỗi pool, gái trị mặc định là 5.
Có rất nhiều yếu tố ảnh hưởng đến những giá trị thiết lập tối ưu, bao gồm cả code server chạy và số lượng RAM mà hệ thống có.
Cách hoạt động của module cPanel PHP-FPM là gì?
Giao diện của WHM có hầu hết các cấu hình cài đặt quan trọng, người dùng có thể tham khảo thêm trong tài liệu của PHP. Để thêm hoặc chỉnh sửa các cài đặt, ta cần chỉnh sửa file config trên command line của server, hoặc trong cPanel & WHM File Manager.
Hai file config hệ thống quan trọng nhất là:
- /var/cpanel/ApachePHPFPM/system.yaml
- /var/cpanel/ApachePHPFPM/system_pool_defaults.yaml
WHM không tạo ra các file này vì hệ thống không cần đến, tuy nhiên người dùng vẫn có thể dễ dàng tạo và thêm directive để ghi đề các thiết lập mặc định như sau:
touch /var/cpanel/ApachePHPFPM/system.yaml
touch /var/cpanel/ApachePHPFPM/system_pool_defaults.yaml
Tạo directory:
mkdir -p /var/cpanel/ApachePHPFPM/
Trong các file này, nhập các directive khác để ghi đè lên directive mặc định của hệ thống. Chẳng hạn, nếu bạn muốn đổi emergency_restart_threshold từ giá trị mặc định 0 thành 10 thì file system_pool_defaults.yaml sẽ có dạng như sau:
Lưu ý: Trong tài liệu của PHP còn có một số directive được định dạng bằng dấu chấm (.) hay nhiều kí tự khác. Khi thêm các directive vào file config, những ký tự này sẽ được thay thành dấu “_”.
Tạo User Pool trong PHP-FPM
Bây giờ ta sẽ tìm hiểu cách tạo và cấu hình user pool thủ công trong PHP-FPM. Đây là nhóm các worker được sử dụng bởi trang host trên miền của server người dùng.
Module PHP-FPM tạo một worker pool cho một miền nếu nó xác định được một file config trong:
/var/cpanel/userdata/[user]/[domain].php_fpm.yaml
Trong đó, thay [user] và [domain] thành các giá trị tương ứng dụng server. Ta có thể tạo file này hoặc activate PHP-FPM cho một domain cụ thể trong WHM để tự động tạo file:
Cũng như các file hệ thống, ta có thể thêm directive để cấu hình user pool. Sau khi tạo và chỉnh sửa file .yaml xong, chạy lệnh sau để thêm directive vào file config của Apache và đồng thời restart lại PHP-FPM:
/scripts/php_fpm_config – rebuild
Cách cấu hình PHP-FPM với NGINX
Yêu cầu:
- Có khả năng mở một SSH session trên hệ thống Ubuntu 18.05 bằng root hay sudo user.
- Cài đặt sẵn NGINX và PHP trên hê thống.
>> Xem thêm: Session là gì? Toàn bộ kiến thức về Session bạn cần biết
Cài đặt PHP-FPM
Nginx không thể tự chạy script PHP mà cần một module như PHP-FPM để có thể quản lý script PHP hiệu quả. Mặt khác, PHP-FPM lại hoạt động ngoài môi trường Nginx bằng cách tạo ra chính process của riêng nó. Vì vậy, khi người dùng yêu cầu một trang PHP thì server nginx sẽ chuyển nó đến dịch vụ PHP-FPM thông qua FastCGI.
Quá trình cài đặt PHP-FPM trong Ubuntu 18.05 tùy vào phiên bản PHP, bạn có thể kiểm tra tài liệu sử dụng trước khi bắt đầu bước này. Đoạn code dưới đây cho phép cài đặt FPM trên phiên bản PHP 7.3:
# apt-get install php7.3-fpm
Dịch vụ FPM sẽ tự động khởi chạy sau khi quá trình hoàn tất. Người dùng có thể xác thực việc cài đặt bằng lệnh systemd sau:
# systemctl status php7.3-fpm
● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2019-02-17 06:29:31 UTC; 30s ago
Docs: man:php-fpm7.3(8)
Main PID: 32210 (php-fpm7.3)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3 (limit: 1152)
CGroup: /system.slice/php7.3-fpm.service
├─32210 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
├─32235 php-fpm: pool www
└─32236 php-fpm: pool www
Cấu hình PHP-FPM Pool
Dịch vụ php-fpm có tạo một pool mặc định, cấu hình của pool này có thể được tìm thấy trong folder /etc/php/7.3/fpm/pool.d. Người dùng có thể tùy chỉnh pool mặc định theo ý muốn, nhưng ta nên tạo các pool riêng biệt để có thể kiểm soát việc phân bổ tài nguyên cho mỗi FPM process tốt hơn.
Ngoài ra, việc phân tách các pool cũng cho phép chung chạy độc lập với nhau, khi đó mỗi ứng dụng php có thể được cấu hình bằng các cài đặt cache của riêng nó qua PHP-FPM. Mọi thay đổi trong cấu hình của một pool sẽ không yêu cầu người dùng dừng hay khởi động bất kỳ pool nào khác.
Bây giờ hãy cũng tạo một pool FPM để chạy ứng dụng PHP thông qua một user riêng biệt. Trước tiên, tạo user mới có các đặc quyền riêng với pool:
# groupadd wordpress_user
# useradd -g wordpress_user wordpress_user
Tiếp theo, chuyển sang directory cấu hình của FPM để tạo một file config bằng text editor bất kỳ:
# cd /etc/php/7.3/fpm/pool.d
# vi wordpress_pool.conf
[wordpress_site]
user = wordpress_user
group = wordpress_user
listen = /var/run/php7.2-fpm-wordpress-site.sock
listen.owner = www-data
listen.group = www-data
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
; Choose how the process manager will control the number of child processes.
pm = dynamic
pm.max_children = 75
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.process_idle_timeout = 10s
Thông tin chi tiết về các tùy chọn cấu hình và giá trị:
- [wordpress_site]: Tên của pool, không được trùng nhau.
- user and group: User và group mà pool sẽ chạy.
- listen: Tên socket file của pool.
- listen.owner and listen.group: Trùng với user và group mà nginx đang chạy.
- php_admin_value: Cho phép đặt các giá trị cấu hình PHP tùy chỉnh.
- php_admin_flag: Cho phép đặt boolean flag.
- pm: Cài đặt trình quản lý các process, giá trị Dynamic cho biết số lượng process con được đặt động, dựa trên các directive dưới đây:
- pm.max_children: Số lượng con (children) tối đa có thể tồn tại cùng lúc.
- pm.start_servers: Số lượng children được tạo khi khởi động.
- pm.min_spare_servers: Số lượng children tối thiểu ở trạng thái ‘idle’ (rảnh rỗi – đang đợi xử lý). Nếu số lượng idle process nhỏ hơn giá trị này, một số children sẽ được tạo thêm.
- pm.max_spare_servers: Số lượng children tối đa ở trạng thái ‘idle’. Nếu số lượng idle process lớn hơn thì một số children sẽ bị hủy.
- pm.process_idle_timeout: Số lượng idle process tối đa, chỉ dùng khi giá trị của pm được đặt thành Dynamic.
Bên cạnh đó, ta cũng có thể truyền một số biến môi trường hệ thống vào dịch vụ php-fpm bằng các lệnh như nv['PHP_FOO'] = $bar
.
Chẳng hạn, ta có thể thêm option sau vào file config để đặt hostname và vị trí folder tạm thời cho môi trường PHP.
...
...
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
...
...
Ngoài ra, các cài đặt cho process manager ở file config của pool ở trên được đặt thành động. Một số tùy chọn khác gồm có:
- Static: Số lượng process PHP duy trì sẽ được cố định.
- ondemand: Không tạo children khi khởi động. Các children sẽ được phân nhánh (fork) khi nhận được request mới từ server.
Sau khi hoàn tất việc tạo file config, restart lại dịch vụ fpm để áp dụng các thay đổi mới:
# systemctl start php7.3-fpm
FPM pool sẽ được tạo ngay lập tức để phục vụ các trang PHP. Lưu ý rằng ta cũng có thể tạo một dịch vụ systemd bằng cách chỉ định những file config FPM ở trên để khởi động/dừng các pool mà không ảnh hưởng nhau.
Cấu hình NGINX cho PHP-FPM
Bây giờ ta cần tạo một server block NGINX để sử dụng pool vừa tạo ở trên. Cụ thể, chỉnh sửa file config NGINX rồi truyền đường dẫn đến file socket bằng option fastcgi_pass
:
server {
listen 80;
server_name example.journaldev.com;
root /var/www/html/wordpress;
access_log /var/log/nginx/example.journaldev.com-access.log;
error_log /var/log/nginx/example.journaldev.com-error.log error;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php7.2-fpm-wordpress-site.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
Đảm bảo cú pháp các cấu hình đều chính xác, sau đó restart lại NGINX bằng lệnh sau:
# nginx-t
# systemctl restart nginx
Kiểm tra cấu hình PHP-FPM NGINX
Để kiểm tra xem file config NGINX có đang sử dụng pool FPM ở trên hay không, ta cần tạo một file PHP info trong web root bằng lệnh sau:
# cd /var/www/html/wordpress
# echo "<?php echo phpinfo();?>" > info.php
Trong đó thay phần đường dẫn /var/www/html/wordpress thành giá trị tương ứng của môi trường.
Tiếp theo, trỏ trình duyệt web đến trang PHP info vừa tạo. Để ý rằng các biến $_SERVER[‘USER’] và $_SERVER[‘HOME’] đều đang trỏ đến wordpress_user và /home/wordpress_user đã được thiết lập trong file config FPM ở bước trước. Vì vậy có thể yên tâm rằng NGINX đang phục vụ các trang PHP sử dụng FPM pool ta đã tạo.
Câu hỏi thường gặp
PHP-FPM có tốt hơn không?
PHP-FPM nhanh hơn các phương pháp dựa trên CGI truyền thống, chẳng hạn như SUPHP, cho môi trường PHP nhiều người dùng. Nó không làm quá tải bộ nhớ của hệ thống với PHP từ các quy trình Apache. Các tính năng của PHP-FPM bao gồm: Sinh sản quy trình thích ứng
FPM là viết tắt của từ gì trong PHP-FPM?
FPM (FastCGI Process Manager) là một triển khai FastCGI PHP chính có chứa một số tính năng (chủ yếu) hữu ích cho các trang web tải nặng.
WordPress có cần PHP-FPM không?
Để chạy WordPress, bạn cần một máy chủ web, máy chủ cơ sở dữ liệu và ngôn ngữ kịch bản PHP. Để WordPress hoạt động ở mức hiệu suất tối đa, bạn phải định cấu hình nhiều máy chủ khác nhau này theo cài đặt được đề xuất của WordPress.
Làm cách nào để start PHP-FPM?
Trên Windows:
Open Services trong Management Console: Start > Run > “services.msc” > OK.
Chọn php-fpm từ list.
Nhấn chuột phải và chọn Start.
PHP-FPM có an toàn không?
Vì mỗi yêu cầu được xử lý bởi một quy trình riêng biệt (được sử dụng lại) trong PHP-FPM, nên an toàn khi sử dụng mô-đun với PHP-FPM.
Lời kết
Hy vọng bài viết trên đã giải đáp được về PHP-FPM là gì và cách cấu hình PHP-FPM dành cho bạn. Nếu có thắc mắc hay đóng góp ý kiến, mời bạn để lại bình luận phía dưới bài viết này. Vietnix xin chân thành cảm ơn bạn đã quan tâm!
theo như bài thì e thấy cả cgi và fpm đều tách biệt với webserver. Nhưng với cgi thì được coi là ưu điểm bảo mật. Con fpm thì ko thấy đề cập gì. Không biết 2 tư tưởng có gì khác nhau ạ?