Apache Prefork vs Worker MPM


113

Nhìn vào tệp cấu hình Apache, tôi thấy Prefork và Worker MPM được xác định. Sự khác biệt là gì và Apache đang sử dụng cái nào?

Câu trả lời:


120

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.htmlhttps://httpd.apache.org/docs/2.4/mod/prefork.html


11
Xem thêm "Làm cách nào để chọn Apache MPM để sử dụng?" serverfault.com/a/383634
Nazariy

@arvind // Mỗi luồng xử lý một kết nối tại một thời điểm // ở đây kết nối có nghĩa là một người dùng hay một yêu cầu? xin giải thích
user1844933

21

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=NAMEvớ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 beos
  • Phần mềm mạng mpm_netware
  • OS / 2 mpmt_os2
  • Unix / Linux 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)
  • các cửa sổ 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ẵn
  • mpm_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ẩn
  • mpm_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 NetWare
  • mpmt_os2 Kết hợp đa quy trình, đa luồng MPM cho OS / 2
  • prefork Triển khai máy chủ web không phân luồng, tạo trước
  • mpm_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ợp

Bây giờ, sự khác biệt giữa preforkworker.

các preforkMPM

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 workerMPM 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).


1
Một cài đặt mặc định của ubuntu-đáng tin cậy-64 của apache 2.4.7 được sử dụng sự kiện MPM
Federico

9

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.


3
Còn về Event MPM?
Vince Kronlein,

6

Đố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

3

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


8
Apache có thể được biên dịch với cả hai mô-đun MPM nên điều này không phải lúc nào cũng đáng tin cậy. Nếu nó liệt kê hai mô-đun MPM, hãy thử apachectl -Vvà xem đầu ra bên cạnh Server MPM. Ngoài ra có thể kiểm tra ps auxvà tìm kiếm một trong hai httpdhoặc httpd.worker.
phản xạ

2
Trong trường hợp của tôi apache2ctl -lđã không hoạt động; đã phải sử dụng apachectl -l.
Vacilando

2
không ai trong số họ được liệt kê cho tôi, nhưng apache hoạt động tốt, Apache / 2.4.7 (Ubuntu)
karatedog

2
Trong centos 7.x mà đang chạy apache 2.4.6, httpd -Vsẽ cung cấp cho một cái gì đó như:Server MPM: worker
runamok

2

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

Tại sao khi tôi đã cố gắng để mpm_worker sử dụng hoặc mpm_event, nó không làm việc trang của tôi
Leoh

0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.