Cách cấu hình Apache HTTP với Sự kiện MPM và PHP-FPM trên FreeBSD 12.0
Web server Apache HTTP đã phát triển qua nhiều năm để hoạt động trong các môi trường khác nhau và giải quyết các nhu cầu khác nhau. Một vấn đề quan trọng mà Apache HTTP phải giải quyết, giống như bất kỳ web server nào, là cách xử lý các quy trình khác nhau để phục vụ một yêu cầu giao thức http. Điều này liên quan đến việc mở một socket , xử lý yêu cầu, giữ kết nối mở trong một khoảng thời gian nhất định, xử lý các sự kiện mới xảy ra thông qua kết nối đó và trả lại nội dung được tạo bởi một chương trình được tạo bằng một ngôn ngữ cụ thể (chẳng hạn như PHP, Perl hoặc Python) . Các việc này được thực hiện và kiểm soát bởi Mô-đun đa xử lý (MPM).Apache HTTP đi kèm với ba MPM khác nhau:
- Pre-fork : Một quy trình mới được tạo cho mỗi kết nối đến server . Mỗi tiến trình được tách biệt với các tiến trình khác, vì vậy không có bộ nhớ nào được chia sẻ giữa chúng, ngay cả khi chúng đang thực hiện các lệnh gọi giống hệt nhau tại một số thời điểm trong quá trình thực thi. Đây là một cách an toàn để chạy các ứng dụng được liên kết với các thư viện không hỗ trợ phân stream — thường là các ứng dụng hoặc thư viện cũ hơn.
- Worker : Quy trình cha chịu trách nhiệm chạy một group các quy trình con, một số quy trình con đang lắng nghe các kết nối mới đến và những quy trình khác đang cung cấp nội dung được yêu cầu. Mỗi quá trình là một stream (một stream có thể xử lý một kết nối) vì vậy một quá trình có thể xử lý một số yêu cầu đồng thời. Phương pháp xử lý kết nối này khuyến khích sử dụng tài nguyên tốt hơn, trong khi vẫn duy trì sự ổn định. Đây là kết quả của group các quy trình có sẵn, thường có các stream miễn phí sẵn sàng để phục vụ ngay lập tức các kết nối mới.
- Sự kiện : Dựa trên worker, MPM này tiến thêm một bước nữa bằng cách tối ưu hóa cách quy trình mẹ lên lịch các việc cho các quy trình con và các stream liên kết với các quy trình đó. Một kết nối vẫn mở trong 5 giây theo mặc định và đóng nếu không có sự kiện mới nào xảy ra; đây là giá trị mặc định của chỉ thị duy trì tồn tại, giữ lại stream liên kết với nó. Event MPM cho phép quá trình quản lý các stream để một số stream có thể tự do xử lý các kết nối mới đến trong khi những stream khác được giữ liên kết với các kết nối trực tiếp. Cho phép phân phối lại các nhiệm vụ được giao cho các stream sẽ giúp sử dụng và hiệu suất tài nguyên tốt hơn.
Mô-đun Sự kiện MPM là một module đa xử lý nhanh có sẵn trên web server Apache HTTP.
PHP-FPM là Trình quản lý tiến trình FastCGI cho PHP. Giao thức FastCGI dựa trên Giao diện cổng chung (CGI), một giao thức nằm giữa các ứng dụng và web server như Apache HTTP. Điều này cho phép các nhà phát triển viết ứng dụng tách biệt với hành vi của web server . Các chương trình chạy các quy trình của chúng một cách độc lập và chuyển sản phẩm của chúng đến web server thông qua giao thức này. Mỗi kết nối mới cần được xử lý bởi một ứng dụng sẽ tạo ra một quy trình mới.
Bằng cách kết hợp Sự kiện MPM trong Apache HTTP với Trình quản lý tiến trình PHP FastCGI (PHP-FPM), một trang web có thể tải nhanh hơn và xử lý nhiều kết nối đồng thời hơn trong khi sử dụng ít tài nguyên hơn.
 Trong hướng dẫn này, bạn sẽ cải thiện hiệu suất của ngăn xếp FAMP bằng cách thay đổi module  đa xử lý mặc định từ pre-fork thành sự kiện và bằng cách sử dụng  trình quản lý tiến trình  PHP-FPM để xử lý mã PHP thay vì mod_php cổ điển trong Apache HTTP.
Yêu cầu
Trước khi bắt đầu hướng dẫn này, bạn cần những thứ sau:
- Server FreeBSD 12.0 được cài đặt theo hướng dẫn này.
- Ngăn xếp FAMP được cài đặt trên server của bạn theo hướng dẫn này.
- Quyền truy cập vào user có quyền root (hoặc được phép sử dụng sudo) để thực hiện thay đổi cấu hình.
Bước 1 - Thay đổi module đa xử lý
 Bạn sẽ bắt đầu bằng cách tìm kiếm lệnh pre-fork trong file  httpd.conf . Đây là file  cấu hình chính cho Apache HTTP trong đó bạn có thể bật và tắt các module . Bạn có thể chỉnh sửa và đặt các chỉ thị như cổng lắng nghe nơi Apache HTTP sẽ phân phát nội dung hoặc vị trí của nội dung sẽ hiển thị trong file  này.
 Để thực hiện những thay đổi này, bạn sẽ sử dụng nl , dòng số, chương trình, với cờ -ba để đếm và đánh số các dòng sao cho không có gì không khớp ở giai đoạn sau. Kết hợp với grep , lệnh này trước tiên sẽ đếm tất cả các dòng trong file  được chỉ định trong đường dẫn và sau khi kết thúc, nó sẽ tìm kiếm chuỗi ký tự bạn đang tìm kiếm.
 Chạy lệnh sau để chương trình nl sẽ xử lý và đánh số các dòng trong httpd.conf . Sau đó, grep sẽ xử lý  kết quả  bằng cách tìm kiếm chuỗi ký tự đã cho 'mod_mpm_prefork' :
- nl -ba /usr/local/etc/apache24/httpd.conf | grep 'mod_mpm_prefork' 
Khi kết quả , bạn sẽ thấy một cái gì đó tương tự như:
Output67  LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so Hãy chỉnh sửa dòng 67 bằng editor  của bạn. Trong hướng dẫn này, bạn sẽ sử dụng vi , là  editor  mặc định trên FreeBSD:
- sudo vi +67 /usr/local/etc/apache24/httpd.conf 
Nối ký hiệu # ở đầu dòng để dòng này được chú thích như sau:
... # LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so ... Bằng cách thêm ký hiệu # bạn đã vô hiệu hóa module  MPM trước fork.
  Đến đây bạn  sẽ tìm thấy chỉ thị sự kiện trong cùng một file  httpd.conf .
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mpm_event 
Bạn sẽ thấy kết quả tương tự như sau:
Output... 66  #LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so ... Bây giờ, bạn sẽ xóa ký hiệu # ở dòng 66 để bật MPM Sự kiện:
- sudo vi +66 /usr/local/etc/apache24/httpd.conf 
Bây giờ chỉ thị sẽ đọc như sau:
... LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so ...  Đến đây bạn  đã chuyển cấu hình từ MPM pre-fork sang sự kiện, bạn có thể xóa gói mod_php73 kết nối  PHP processor  với Apache HTTP, vì nó không còn cần thiết và sẽ gây ảnh hưởng nếu nó vẫn còn trên hệ thống:
- sudo pkg remove -y mod_php73 
Đảm bảo cấu hình đúng bằng cách chạy lệnh sau để kiểm tra:
- sudo apachectl configtest 
Nếu bạn thấy Syntax OK trong  kết quả   của bạn , bạn có thể khởi động lại  server  Apache HTTP:
- sudo apachectl restart 
Lưu ý: Nếu có các kết nối HTTP đang chạy khác trên server của bạn, bạn nên khởi động lại tùy chỉnh thay vì khởi động lại thông thường. Điều này sẽ đảm bảo user không bị đẩy ra ngoài, mất kết nối của họ:
- sudo apachectl graceful 
Bạn đã chuyển MPM từ pre-fork sang sự kiện và xóa kết nối module  mod_php73 PHP sang Apache HTTP. Trong bước tiếp theo, bạn sẽ cài đặt module  PHP-FPM và cấu hình Apache HTTP để nó có thể giao tiếp với PHP nhanh hơn.
Bước 2 - Cấu hình Apache HTTP để sử dụng Trình quản lý tiến trình FastCGI
FreeBSD có một số version PHP được hỗ trợ mà bạn có thể cài đặt thông qua trình quản lý gói. Trên FreeBSD, các file binary khác nhau của các version có sẵn khác nhau được biên dịch thay vì chỉ sử dụng một file như hầu hết các bản phân phối GNU / Linux cung cấp trong repository lưu trữ mặc định của chúng. Để làm theo phương pháp hay nhất, bạn sẽ sử dụng version được hỗ trợ, bạn có thể kiểm tra phiên bản này tại trang các version được hỗ trợ của PHP .
 Trong bước này, bạn sẽ thêm PHP-FPM làm dịch vụ đang chạy để  bắt đầu khi server khởi động . Bạn cũng sẽ  cấu hình  Apache HTTP để hoạt động với PHP bằng cách thêm cấu hình dành riêng cho module  cũng như kích hoạt một số module  khác trong httpd.conf .
 Đầu tiên, bạn sẽ thêm 'php_fpm_enable=YES' vào file  /etc/rc.conf để dịch vụ PHP-FPM có thể bắt đầu. Bạn sẽ làm điều đó bằng cách sử dụng lệnh sysrc :
- sudo sysrc php_fpm_enable="YES" 
 Đến đây bạn  sẽ thêm module  php-fpm vào folder  của module  Apache, vì vậy nó được cấu hình để sử dụng bởi Apache HTTP. Tạo file  sau  để thực hiện :
- sudo vi /usr/local/etc/apache24/modules.d/030_php-fpm.conf 
Thêm phần sau vào 030_php-fpm.conf :
<IfModule proxy_fcgi_module>     <IfModule dir_module>         DirectoryIndex index.php     </IfModule>     <FilesMatch "\.(php|phtml|inc)$">         SetHandler "proxy:fcgi://127.0.0.1:9000"     </FilesMatch> </IfModule> Điều này nói rằng nếu module  'proxy_fcgi' được bật cũng như 'dir_module' thì mọi file  đã xử lý  trùng với  phần mở rộng trong ngoặc đơn sẽ được xử lý bởi  trình quản lý tiến trình  FastCGI đang chạy trên máy local  thông qua cổng 9000 — như nếu máy local  một  server  proxy. Đây là nơi kết nối giữa module  PHP-FPM và Apache HTTP.  Để làm điều này,  bạn sẽ kích hoạt các module  khác trong bước này.
 Để bật module  proxy, trước tiên bạn sẽ tìm kiếm nó trong file  httpd.conf :
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy.so 
Bạn sẽ thấy kết quả tương tự như sau:
Output... 129 #LoadModule proxy_module libexec/apache24/mod_proxy.so ... Bạn sẽ bỏ  comment  bằng cách xóa ký hiệu # :
- sudo vi +129 /usr/local/etc/apache24/httpd.conf 
Dòng sẽ trông như sau sau khi được chỉnh sửa:
... LoadModule proxy_module libexec/apache24/mod_proxy.so ... Đến đây bạn có thể kích hoạt module FastCGI. Tìm module bằng lệnh sau:
- nl -ba /usr/local/etc/apache24/httpd.conf | grep mod_proxy_fcgi.so 
Bạn sẽ thấy một cái gì đó tương tự như sau:
Output... 133 #LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so ... Bây giờ bỏ comment 133 như bạn đã làm với các module khác:
- sudo vi +133 /usr/local/etc/apache24/httpd.conf 
Bạn sẽ để lại dòng như sau:
... LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so ... Sau khi hoàn tất, bạn sẽ bắt đầu dịch vụ PHP-FPM:
- sudo service php-fpm start 
Và bạn sẽ khởi động lại Apache để nó tải các thay đổi cấu hình mới nhất kết hợp với module PHP:
- sudo apachectl restart 
Bạn đã cài đặt module PHP-FPM, cấu hình Apache HTTP để hoạt động với nó, kích hoạt các module cần thiết để giao thức FastCGI hoạt động và khởi động các dịch vụ tương ứng.
Bây giờ Apache đã kích hoạt module Event MPM và PHP-FPM hiện diện và đang chạy, đã đến lúc kiểm tra mọi thứ có hoạt động như dự kiến hay không.
Bước 3 - Kiểm tra cấu hình của bạn
Để kiểm tra xem các thay đổi cấu hình đã được áp dụng hay chưa, bạn sẽ chạy một số thử nghiệm. Phần đầu tiên sẽ kiểm tra xem Apache HTTP đang sử dụng module đa xử lý nào. Điều thứ hai sẽ xác minh PHP đang sử dụng trình quản lý FPM.
Kiểm tra server Apache HTTP bằng cách chạy lệnh sau:
- sudo apachectl -M | grep 'mpm' 
Đầu ra của bạn sẽ như sau:
Outputmpm_event_module (shared) Bạn có thể lặp lại tương tự cho module proxy và FastCGI:
- sudo apachectl -M | grep 'proxy' 
Đầu ra sẽ hiển thị:
Outputproxy_module (shared) proxy_fcgi_module (shared) Nếu bạn muốn xem toàn bộ danh sách các module , bạn có thể xóa phần thứ hai của lệnh sau -M .
Bây giờ là lúc để kiểm tra xem PHP có đang sử dụng Trình quản lý tiến trình FastCGI hay không. Để làm như vậy, bạn sẽ viết một đoạn mã PHP rất nhỏ sẽ hiển thị cho bạn tất cả thông tin liên quan đến PHP.
Chạy lệnh sau để ghi một file có tên như sau:
- sudo vi /usr/local/www/apache24/data/info.php 
Thêm nội dung sau vào file info.php:
<?php phpinfo(); ?> Bây giờ, hãy truy cập URL  server  của bạn và thêm info.php vào cuối như sau: http:// your_server_IP_address /info.php .
Mục nhập API server sẽ là FPM / FastCGI .
 Hãy nhớ xóa file  info.php sau khi kiểm tra này để không có thông tin về  server  bị tiết lộ công khai.
- sudo rm /usr/local/www/apache24/data/info.php 
Bạn đã kiểm tra trạng thái hoạt động của module MPM, các module xử lý FastCGI và việc xử lý mã PHP.
Kết luận
Bạn đã tối ưu hóa ngăn xếp FAMP ban đầu của bạn , vì vậy số lượng kết nối để tạo các tiến trình Apache HTTP mới đã tăng lên, PHP-FPM sẽ xử lý mã PHP hiệu quả hơn và việc sử dụng tài nguyên tổng thể đã được cải thiện.
Xem tài liệu dự án server Apache HTTP để biết thêm thông tin về các module khác nhau và các dự án liên quan.
Các tin liên quan
Cách cài đặt một Apache, MySQL và PHP (FAMP) trên FreeBSD 12.02019-06-28
Cách cài đặt web server Apache trên CentOS 7
2019-05-29
Cách bảo mật Apache bằng Let's Encrypt trên CentOS 7
2019-05-23
Cách cài đặt Apache Kafka trên Debian 9
2019-05-10
Cách cài đặt Apache Kafka trên Ubuntu 18.04
2019-05-10
Cách backup, nhập và di chuyển dữ liệu Apache Kafka của bạn trên Debian 9
2019-03-28
Cách cài đặt Apache Kafka trên CentOS 7
2019-03-27
Cách backup, nhập và di chuyển dữ liệu Apache Kafka của bạn trên CentOS 7
2019-03-25
Cách cài đặt và cấu hình Apache ZooKeeper Cluster trên Ubuntu 18.04
2019-01-03
Cách backup, nhập và di chuyển dữ liệu Apache Kafka của bạn trên Ubuntu 18.04
2018-12-20
 

