Câu trả lời:
Prefork và worker là hai loại MPM mà apache cung cấp. Cả hai đều có giá trị và phẩm chất của họ.
Theo mặc định, mpm là prefork an toàn cho chuỗi.
Prefork MPM sử dụng nhiều quy trình con với mỗi quy trình một luồng và mỗi quy trình xử lý một kết nối tại một thời điểm.
Worker MPM sử dụng nhiều quy trình con với nhiều luồng mỗi quy trình. Mỗi luồng xử lý một kết nối tại một thời điểm.
Để biết thêm chi tiết, bạn có thể truy cập https://httpd.apache.org/docs/2.4/mpm.html và https://httpd.apache.org/docs/2.4/mod/prefork.html
Các mô-đun đa xử lý (MPM) của Apache chịu trách nhiệm liên kết với các cổng mạng trên máy, chấp nhận yêu cầu và cử con xử lý yêu cầu ( http://httpd.apache.org/docs/2.2/mpm.html ).
Chúng giống như bất kỳ mô-đun Apache nào khác, ngoại trừ việc chỉ một và chỉ một MPM phải được tải vào máy chủ bất kỳ lúc nào . MPM được chọn trong quá trình cấu hình và được biên dịch vào máy chủ bằng cách sử dụng đối số --with-mpm=NAME
với tập lệnh cấu hình trong đóNAME
tên của MPM mong muốn.
Apache sẽ sử dụng một MPM mặc định cho mỗi hệ điều hành trừ khi một hệ điều hành khác được chọn tại thời điểm biên dịch (ví dụ: trên Windows mpm_winnt
được sử dụng theo mặc định). Đây là danh sách các hệ điều hành và MPM mặc định của chúng:
beos
mpm_netware
mpmt_os2
prefork
( cập nhật cho phiên bản Apache ≥ 2.4 : prefork
, worker
, hoặc event
, tùy thuộc vào khả năng nền tảng)mpm_winnt
Để kiểm tra mô-đun nào được biên dịch vào máy chủ, hãy sử dụng tùy chọn dòng lệnh -l
( đây là tài liệu). Ví dụ: trên cài đặt Windows, bạn có thể nhận được một cái gì đó như:
> httpd -l
Compiled in modules:
core.c
mod_win32.c
mpm_winnt.c
http_core.c
mod_so.c
Kể từ phiên bản 2.2, đây là danh sách các tính năng cốt lõi có sẵn và các mô-đun MPM :
core
- Các tính năng Máy chủ HTTP Core Apache luôn có sẵnmpm_common
- Tập hợp các lệnh được thực hiện bởi nhiều hơn một mô-đun đa xử lý (MPM)beos
- Mô-đun đa xử lý này được tối ưu hóa cho BeOS.event
- Một biến thể thử nghiệm của MPM công nhân tiêu chuẩnmpm_netware
Mô-đun đa xử lý triển khai một máy chủ web luồng độc quyền được tối ưu hóa cho Novell NetWarempmt_os2
Kết hợp đa quy trình, đa luồng MPM cho OS / 2prefork
Triển khai máy chủ web không phân luồng, tạo trướcmpm_winnt
- Mô-đun đa xử lý này được tối ưu hóa cho Windows NT.worker
- Mô-đun đa xử lý triển khai máy chủ web đa quy trình đa luồng kết hợpBây giờ, sự khác biệt giữa prefork
và worker
.
các prefork
MPM
triển khai một máy chủ web không phân luồng, preking xử lý các yêu cầu theo cách tương tự như Apache 1.3. Nó thích hợp cho các trang web cần tránh phân luồng để tương thích với các thư viện không an toàn theo luồng. Nó cũng là MPM tốt nhất để cô lập từng yêu cầu, do đó vấn đề với một yêu cầu duy nhất sẽ không ảnh hưởng đến bất kỳ yêu cầu nào khác.
Các worker
MPM cụ đa quá trình đa luồng máy chủ hybrid và cho hiệu suất tốt hơn, do đó nó nên được ưa thích trừ khi ai sử dụng các module khác có chứa các thư viện không thread-safe (xem thêm thảo luận này hay này trên Serverfault).
Hãy xem điều này để biết thêm chi tiết. Nó đề cập đến cách Apache xử lý nhiều yêu cầu. Preforking, là mặc định, bắt đầu một số quy trình Apache (2 theo mặc định ở đây, mặc dù tôi tin rằng người ta có thể cấu hình điều này thông qua httpd.conf). Worker MPM sẽ bắt đầu một luồng mới cho mỗi yêu cầu, mà tôi đoán là bộ nhớ hiệu quả hơn. Trong lịch sử, Apache đã sử dụng prefork, vì vậy nó là một mô hình được thử nghiệm tốt hơn. Phân luồng chỉ được thêm vào trong 2.0.
Đối với CentOS 6.x và 7.x (bao gồm cả Amazon Linux), hãy sử dụng:
sudo httpd -V
Điều này sẽ hiển thị cho bạn biết MPM nào được định cấu hình. Prefork, worker hoặc event. Prefork là mô hình luồng an toàn trước đó. Worker là đa luồng và sự kiện hỗ trợ php-mpm được cho là một hệ thống tốt hơn để xử lý các luồng và yêu cầu.
Tuy nhiên, kết quả của bạn có thể khác nhau, dựa trên cấu hình. Tôi đã thấy rất nhiều sự không ổn định trong php-mpm và không có bất kỳ cải thiện tốc độ nào. Một con nhện hung hãn có thể làm cạn kiệt các quy trình con tối đa trong php-mpm khá dễ dàng.
Cài đặt cho prefork, worker hoặc event được đặt trong sudo nano /etc/httpd/conf.modules.d/00-mpm.conf (dành cho CentOS 6.x / 7.x / Apache 2.4).
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#LoadModule mpm_event_module modules/mod_mpm_event.so
Bạn có thể biết Apache đang sử dụng preform hay worker bằng cách đưa ra lệnh sau
apache2ctl -l
Trong kết quả đầu ra, hãy tìm các đề cập đến prefork.c hoặc worker.c
apachectl -V
và xem đầu ra bên cạnh Server MPM
. Ngoài ra có thể kiểm tra ps aux
và tìm kiếm một trong hai httpd
hoặc httpd.worker
.
apache2ctl -l
đã không hoạt động; đã phải sử dụng apachectl -l
.
httpd -V
sẽ cung cấp cho một cái gì đó như:Server MPM: worker
Dễ dàng chuyển đổi giữa prefork hoặc worker mpm trong Apache 2.4 trên RHEL7
Kiểm tra loại MPM bằng cách thực thi
sudo httpd -V
Server version: Apache/2.4.6 (Red Hat Enterprise Linux)
Server built: Jul 26 2017 04:45:44
Server's Module Magic Number: 20120211:24
Server loaded: APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="/run/httpd/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
Bây giờ để thay đổi MPM, hãy chỉnh sửa tệp sau và bỏ ghi chú MPM bắt buộc
/etc/httpd/conf.modules.d/00-mpm.conf
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so
Apache có 2 loại MPM (Mô-đun đa xử lý) được xác định:
1: Prefork 2: Worker
Theo mặc định, Apacke được cấu hình ở chế độ preforked tức là máy chủ web preforked không phân luồng. Điều đó có nghĩa là mỗi tiến trình con Apache chứa một luồng duy nhất và xử lý một yêu cầu tại một thời điểm. Do đó, nó tiêu tốn nhiều tài nguyên hơn.
Apache cũng có công nhân MPM biến Apache thành một máy chủ web đa quy trình, đa luồng. Worker MPM sử dụng nhiều quy trình con với nhiều luồng mỗi quy trình.