ดูที่ไฟล์กำหนดค่า Apache ฉันเห็น Prefork และ Worker MPM กำหนดไว้ อะไรคือความแตกต่างและ Apache ใช้อันไหน?
ดูที่ไฟล์กำหนดค่า Apache ฉันเห็น Prefork และ Worker MPM กำหนดไว้ อะไรคือความแตกต่างและ Apache ใช้อันไหน?
คำตอบ:
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
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 เริ่มต้น:
beos
mpm_netware
mpmt_os2
prefork
( ปรับปรุงสำหรับรุ่นอาปาเช่≥ 2.4 : prefork
, worker
หรือevent
ขึ้นอยู่กับความสามารถของแพลตฟอร์ม)mpm_winnt
ในการตรวจสอบว่าโมดูลใดที่คอมไพล์ลงในเซิร์ฟเวอร์ให้ใช้ตัวเลือกบรรทัดคำสั่ง-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 นี้เหมาะสำหรับ BeOSevent
- ตัวแปรทดลองของ MPM สำหรับผู้ปฏิบัติงานมาตรฐานmpm_netware
Multi-Processing Module ที่ใช้เว็บเซิร์ฟเวอร์แบบเธรดเฉพาะที่ปรับให้เหมาะสมสำหรับ Novell NetWarempmt_os2
ไฮบริดหลายกระบวนการ MPM หลายเธรดสำหรับ OS / 2prefork
ใช้งานเว็บเซิร์ฟเวอร์ที่ไม่มีเธรดล่วงหน้าmpm_winnt
- Multi-Processing Module นี้เหมาะสำหรับ Windows NTworker
- Multi-Processing Module ที่ใช้เว็บเซิร์ฟเวอร์แบบมัลติเธรดแบบไฮบริดตอนนี้ถึงความแตกต่างระหว่างprefork
และworker
.
ใช้เว็บเซิร์ฟเวอร์ที่ไม่มีเธรดล่วงหน้าซึ่งจัดการคำขอในลักษณะที่คล้ายกับ Apache 1.3 เหมาะสำหรับไซต์ที่ต้องการหลีกเลี่ยงเธรดเพื่อให้เข้ากันได้กับไลบรารีที่ไม่ปลอดภัยเธรด นอกจากนี้ยังเป็น MPM ที่ดีที่สุดสำหรับการแยกแต่ละคำขอดังนั้นปัญหาเกี่ยวกับคำขอเดียวจะไม่ส่งผลกระทบใด ๆ
worker
MPMการดำเนินการหลายขั้นตอนไฮบริดแบบมัลติเธรดเซิร์ฟเวอร์และให้ประสิทธิภาพที่ดีขึ้นจึงควรได้รับการแนะนำเว้นแต่มีการใช้โมดูลอื่น ๆ ที่มีเนื้อหาไม่ด้ายปลอดภัยห้องสมุด (ดูการสนทนานี้หรือนี้ใน Serverfault)
ลองดูที่นี่เพื่อดูรายละเอียดเพิ่มเติม หมายถึงวิธีที่ Apache จัดการกับคำขอหลายรายการ Preforking ซึ่งเป็นค่าเริ่มต้นจะเริ่มกระบวนการ Apache จำนวนหนึ่ง (โดยค่าเริ่มต้น 2 รายการที่นี่แม้ว่าฉันเชื่อว่าสามารถกำหนดค่าได้ผ่าน httpd.conf) Worker MPM จะเริ่มเธรดใหม่ตามคำขอซึ่งฉันเดาว่ามีประสิทธิภาพหน่วยความจำมากกว่า ในอดีต Apache ใช้ prefork ดังนั้นจึงเป็นรุ่นที่ผ่านการทดสอบแล้วดีกว่า เพิ่มเธรดใน 2.0 เท่านั้น
สำหรับ 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
คุณสามารถบอกได้ว่า Apache กำลังใช้ preform หรือผู้ปฏิบัติงานโดยใช้คำสั่งต่อไปนี้
apache2ctl -l
ในผลลัพธ์ที่ได้ให้มองหาการกล่าวถึง prefork.c หรือ worker.c
apachectl -V
ดูที่เอาต์พุตถัดServer MPM
จาก นอกจากนี้ยังสามารถตรวจสอบps aux
และมองหาการอย่างใดอย่างหนึ่งหรือhttpd
httpd.worker
apache2ctl -l
ไม่ได้ผล apachectl -l
มีการใช้งาน
httpd -V
จะให้สิ่งที่ต้องการ:Server MPM: worker
ง่ายต่อการสลับระหว่าง 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
Apache มี MPM (Multi-Processing Modules) 2 ประเภท:
1: Prefork 2: คนงาน
โดยค่าเริ่มต้น Apacke ถูกกำหนดค่าในโหมด preforked เช่นเว็บเซิร์ฟเวอร์ที่ไม่มีเธรดล่วงหน้า นั่นหมายความว่าแต่ละกระบวนการลูกของ Apache มีเธรดเดียวและจัดการทีละคำขอ ด้วยเหตุนี้จึงทำให้สิ้นเปลืองทรัพยากรมากขึ้น
Apache ยังมี MPM ของผู้ปฏิบัติงานที่เปลี่ยน Apache ให้เป็นเว็บเซิร์ฟเวอร์แบบมัลติเธรดแบบหลายกระบวนการ Worker MPM ใช้โปรเซสชายน์หลายตัวกับเธรดจำนวนมาก