Apache Prefork กับ Worker MPM


114

ดูที่ไฟล์กำหนดค่า Apache ฉันเห็น Prefork และ Worker MPM กำหนดไว้ อะไรคือความแตกต่างและ Apache ใช้อันไหน?

คำตอบ:


120

Prefork และ worker เป็น MPM apache สองประเภท ทั้งสองมีข้อดีและข้อด้อย

โดยค่าเริ่มต้น mpm คือ prefork ซึ่งเป็นเธรดที่ปลอดภัย

Prefork MPM ใช้กระบวนการย่อยหลายรายการโดยมีเธรดเดียวและแต่ละกระบวนการจะจัดการการเชื่อมต่อทีละรายการ

Worker MPM ใช้โปรเซสชายน์หลายตัวกับเธรดจำนวนมาก แต่ละเธรดจะจัดการการเชื่อมต่อทีละรายการ

ดูรายละเอียดเพิ่มเติมได้ที่https://httpd.apache.org/docs/2.4/mpm.htmlและhttps://httpd.apache.org/docs/2.4/mod/prefork.html


11
ดูเพิ่มเติม "ฉันจะเลือก Apache MPM ใดที่จะใช้" serverfault.com/a/383634
Nazariy

@arvind // แต่ละเธรดจัดการการเชื่อมต่อครั้งละหนึ่งรายการ // ในที่นี้การเชื่อมต่อหมายถึงผู้ใช้คนเดียวหรือคำขอเดียว? กรุณาอธิบาย
user1844933

21

Multi-Processing Modules (MPM) ของ Apache มีหน้าที่ในการเชื่อมโยงกับพอร์ตเครือข่ายบนเครื่องรับคำขอและส่งลูกไปจัดการคำขอ ( http://httpd.apache.org/docs/2.2/mpm.html )

พวกเขากำลังเช่น Apache โมดูลอื่น ๆ ยกเว้นว่าแค่เพียงหนึ่งเดียวและ MPM ต้องโหลดลงในเซิร์ฟเวอร์ในเวลาใดก็ได้ MPM ถูกเลือกในระหว่างการกำหนดค่าและคอมไพล์ลงในเซิร์ฟเวอร์โดยใช้อาร์กิวเมนต์--with-mpm=NAMEกับสคริปต์กำหนดค่าซึ่งNAMEเป็นชื่อของ MPM ที่ต้องการ

Apache จะใช้ MPM เริ่มต้นสำหรับแต่ละระบบปฏิบัติการเว้นแต่จะมีการเลือกระบบปฏิบัติการอื่นในเวลาคอมไพล์ (เช่นบน Windows mpm_winntจะใช้เป็นค่าเริ่มต้น) นี่คือรายชื่อระบบปฏิบัติการและ MPM เริ่มต้น:

ในการตรวจสอบว่าโมดูลใดที่คอมไพล์ลงในเซิร์ฟเวอร์ให้ใช้ตัวเลือกบรรทัดคำสั่ง-l( นี่คือเอกสารประกอบ) ตัวอย่างเช่นในการติดตั้ง Windows คุณอาจได้รับสิ่งต่างๆเช่น:

> httpd -l
Compiled in modules:
  core.c
  mod_win32.c
  mpm_winnt.c
  http_core.c
  mod_so.c

สำหรับเวอร์ชัน 2.2 นี่คือรายการคุณสมบัติหลักที่มีและโมดูล MPM :

  • core - คุณสมบัติ Core Apache HTTP Server ที่พร้อมใช้งานตลอดเวลา
  • mpm_common - ชุดคำสั่งที่ดำเนินการโดยโมดูลการประมวลผลหลายหน่วย (MPM) มากกว่าหนึ่งโมดูล
  • beos - Multi-Processing Module นี้เหมาะสำหรับ BeOS
  • event - ตัวแปรทดลองของ MPM สำหรับผู้ปฏิบัติงานมาตรฐาน
  • mpm_netware Multi-Processing Module ที่ใช้เว็บเซิร์ฟเวอร์แบบเธรดเฉพาะที่ปรับให้เหมาะสมสำหรับ Novell NetWare
  • mpmt_os2 ไฮบริดหลายกระบวนการ MPM หลายเธรดสำหรับ OS / 2
  • prefork ใช้งานเว็บเซิร์ฟเวอร์ที่ไม่มีเธรดล่วงหน้า
  • mpm_winnt - Multi-Processing Module นี้เหมาะสำหรับ Windows NT
  • worker - Multi-Processing Module ที่ใช้เว็บเซิร์ฟเวอร์แบบมัลติเธรดแบบไฮบริด

ตอนนี้ถึงความแตกต่างระหว่างpreforkและworker.

preforkMPM

ใช้เว็บเซิร์ฟเวอร์ที่ไม่มีเธรดล่วงหน้าซึ่งจัดการคำขอในลักษณะที่คล้ายกับ Apache 1.3 เหมาะสำหรับไซต์ที่ต้องการหลีกเลี่ยงเธรดเพื่อให้เข้ากันได้กับไลบรารีที่ไม่ปลอดภัยเธรด นอกจากนี้ยังเป็น MPM ที่ดีที่สุดสำหรับการแยกแต่ละคำขอดังนั้นปัญหาเกี่ยวกับคำขอเดียวจะไม่ส่งผลกระทบใด ๆ

workerMPMการดำเนินการหลายขั้นตอนไฮบริดแบบมัลติเธรดเซิร์ฟเวอร์และให้ประสิทธิภาพที่ดีขึ้นจึงควรได้รับการแนะนำเว้นแต่มีการใช้โมดูลอื่น ๆ ที่มีเนื้อหาไม่ด้ายปลอดภัยห้องสมุด (ดูการสนทนานี้หรือนี้ใน Serverfault)


1
การติดตั้งค่าเริ่มต้นของ ubuntu-trusty-64 ของ apache 2.4.7 กำลังใช้เหตุการณ์ MPM
Federico

9

ลองดูที่นี่เพื่อดูรายละเอียดเพิ่มเติม หมายถึงวิธีที่ Apache จัดการกับคำขอหลายรายการ Preforking ซึ่งเป็นค่าเริ่มต้นจะเริ่มกระบวนการ Apache จำนวนหนึ่ง (โดยค่าเริ่มต้น 2 รายการที่นี่แม้ว่าฉันเชื่อว่าสามารถกำหนดค่าได้ผ่าน httpd.conf) Worker MPM จะเริ่มเธรดใหม่ตามคำขอซึ่งฉันเดาว่ามีประสิทธิภาพหน่วยความจำมากกว่า ในอดีต Apache ใช้ prefork ดังนั้นจึงเป็นรุ่นที่ผ่านการทดสอบแล้วดีกว่า เพิ่มเธรดใน 2.0 เท่านั้น


3
สิ่งที่เกี่ยวกับเหตุการณ์ MPM?
Vince Kronlein

6

สำหรับ CentOS 6.x และ 7.x (รวมถึง Amazon Linux) ให้ใช้:

sudo httpd -V

สิ่งนี้จะแสดงให้คุณเห็นว่า MPM ใดถูกกำหนดค่าไว้ ทั้งงานพรีเวิร์คคนงานหรือเหตุการณ์ Prefork เป็นรุ่นก่อนหน้านี้ที่ปลอดภัยสำหรับเธรด Worker เป็นแบบมัลติเธรดและเหตุการณ์รองรับ php-mpm ซึ่งควรจะเป็นระบบที่ดีกว่าสำหรับการจัดการเธรดและคำร้องขอ

อย่างไรก็ตามผลลัพธ์ของคุณอาจแตกต่างกันไปขึ้นอยู่กับการกำหนดค่า ฉันเห็นความไม่เสถียรมากมายใน php-mpm และไม่มีการปรับปรุงความเร็วใด ๆ สไปเดอร์ที่ก้าวร้าวสามารถทำให้กระบวนการย่อยสูงสุดหมดไปใน php-mpm ได้อย่างง่ายดาย

การตั้งค่าสำหรับ prefork ผู้ปฏิบัติงานหรือเหตุการณ์ถูกตั้งค่าใน sudo nano /etc/httpd/conf.modules.d/00-mpm.conf (สำหรับ 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

คุณสามารถบอกได้ว่า Apache กำลังใช้ preform หรือผู้ปฏิบัติงานโดยใช้คำสั่งต่อไปนี้

apache2ctl -l

ในผลลัพธ์ที่ได้ให้มองหาการกล่าวถึง prefork.c หรือ worker.c


8
Apache สามารถคอมไพล์ด้วยโมดูล MPM ทั้งสองดังนั้นจึงไม่น่าเชื่อถือเสมอไป หากมีรายชื่อโมดูล MPM สองโมดูลให้ลองapachectl -Vดูที่เอาต์พุตถัดServer MPMจาก นอกจากนี้ยังสามารถตรวจสอบps auxและมองหาการอย่างใดอย่างหนึ่งหรือhttpd httpd.worker
ล็

2
ในกรณีของฉันapache2ctl -lไม่ได้ผล apachectl -lมีการใช้งาน
Vacilando

2
ไม่มีรายการใดในรายการสำหรับฉัน แต่ apache ใช้งานได้ดี Apache / 2.4.7 (Ubuntu)
karatedog

2
ใน centos 7.x ซึ่งรัน apache 2.4.6 httpd -Vจะให้สิ่งที่ต้องการ:Server MPM: worker
runamok

2

ง่ายต่อการสลับระหว่าง prefork หรือ mpm ของผู้ปฏิบัติงานใน Apache 2.4 บน RHEL7

ตรวจสอบประเภท MPM โดยดำเนินการ

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"

ตอนนี้เพื่อเปลี่ยน MPM แก้ไขไฟล์ต่อไปนี้และไม่ใส่ข้อคิดเห็น MPM ที่จำเป็น

 /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

ทำไมเมื่อฉันพยายามใช้ mpm_worker หรือ mpm_event มันไม่ทำงานหน้าของฉัน
Leoh

0

Apache มี MPM (Multi-Processing Modules) 2 ประเภท:

1: Prefork 2: คนงาน

โดยค่าเริ่มต้น Apacke ถูกกำหนดค่าในโหมด preforked เช่นเว็บเซิร์ฟเวอร์ที่ไม่มีเธรดล่วงหน้า นั่นหมายความว่าแต่ละกระบวนการลูกของ Apache มีเธรดเดียวและจัดการทีละคำขอ ด้วยเหตุนี้จึงทำให้สิ้นเปลืองทรัพยากรมากขึ้น

Apache ยังมี MPM ของผู้ปฏิบัติงานที่เปลี่ยน Apache ให้เป็นเว็บเซิร์ฟเวอร์แบบมัลติเธรดแบบหลายกระบวนการ Worker MPM ใช้โปรเซสชายน์หลายตัวกับเธรดจำนวนมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.