ฉันจะบอกได้อย่างไรว่า apache ทำงานเป็น prefork หรือคนงาน?


40

ฉันจะบอกได้อย่างไรว่า Apache ใช้งาน (หรือกำหนดค่าให้ทำงาน) เป็น prefork หรือผู้ปฏิบัติงานหรือไม่


2
หรือมากกว่าในทางเทคนิค 'รวบรวมเพื่อใช้เป็น'

คำตอบ:


37

MPM มีการกำหนดค่าในเวลารวบรวม วิธีหนึ่งในการคิดออกในภายหลังคือการรวบรวมรายการในโมดูล รายการนั้นจะรวมถึง MPM ที่เลือก รายการสามารถทำได้โดยใช้ apache ไบนารีด้วยแฟล็ก -l

andreas@halleck:~$ apache2 -l
Compiled in modules:
 core.c
 mod_log_config.c
 mod_logio.c
 worker.c
 http_core.c
 mod_so.c
andreas@halleck:~$ 

ที่นี่เราพบโมดุล module.c ดังนั้นฉันจึงรัน MPM ของผู้ปฏิบัติงาน


4
คำตอบนี้ผิด ดูคำตอบของฉัน
Chris Johnson

1
หืมมมบน Ubuntu ฉันมีค่าคนงานมิได้ prefork จดทะเบียนเมื่อฉันทำเช่นนี้ ...
mlissner

2
บน Ubuntu คุณสามารถใช้apache2ctl -Mเพื่อแสดงรายการโมดูลที่ใช้งานอยู่
SteffenNielsen

53

คำตอบที่ได้รับจาก Series8217 และ Andol นั้นไม่ถูกต้อง

คำถามคือจะบอกได้อย่างไรว่า Apache กำลังใช้งาน prefork หรือผู้ปฏิบัติงานอยู่หรือไม่ คำแนะนำที่ให้โดยคำตอบอื่น ๆ จะบอกเพียงว่าMPM เริ่มต้นคืออะไร (ขึ้นอยู่กับโมดูลที่คอมไพล์แล้ว) ไม่ใช่ว่าจะใช้ตัวเลือกเริ่มต้นนั้นหรือตัวเลือกอื่นในเวลาปัจจุบัน

หากhttpd -Vแสดง prefork นั่นหมายความว่า prefork เป็น MPM เริ่มต้นที่คอมไพล์แล้ว สามารถแทนที่ได้โดยการเปลี่ยนการตั้งค่าไฟล์การกำหนดค่า Apache ดังที่แสดงในกระบวนการนี้:

  1. แก้ไขไฟล์กำหนดค่า (เช่น/etc/sysconfig/httpdบน CentOS / RedHat)
  2. เพิ่มหรือยกเลิกหมายเหตุบรรทัดนี้: HTTPD=/usr/sbin/httpd.worker
  3. รีสตาร์ท Apache

MPM ใดที่ทำงานจริงสามารถแสดงโดยใช้กระบวนการนี้:

  1. เปิดใช้งาน Apache mod_info
  2. เคียวรี mod_info url โดยทั่วไป curl localhost/server-info
  3. ส่วน "การตั้งค่าเซิร์ฟเวอร์" จะแสดง "ชื่อ MPM: ผู้ทำงาน"
  4. เรียกใช้httpd -Vอีกครั้ง - มันจะยังคงแสดง prefork ไม่ใช่ผู้ปฏิบัติงาน

บรรทัดล่างสุด:

  • httpd -V แสดงตัวเลือกเริ่มต้นไม่ใช่ตัวเลือกที่ใช้งานจริง

มีคำตอบจากหลาย ๆ เว็บไซต์ที่บอกว่าใช้httpd -Vเพื่อบอกว่า Apache กำลังใช้งาน prefork หรือคนทำงานหรือไม่ พวกเขาผิดทั้งหมด ลองขั้นตอนข้างต้นเพื่อดูตัวคุณเอง


FYI ตามhttpd.apache.org/docs/trunk/mpm.html MPM สามารถเป็นโมดูลคงที่ในทุกแพลตฟอร์มหรือสร้างเป็น DSO (บน Unix) เมื่อสร้างเป็นโมดูลแบบสแตติก "เซิร์ฟเวอร์จะต้องถูกสร้างใหม่เพื่อเปลี่ยน MPM" เอกสาร apache ไม่ถูกต้องเกี่ยวกับ MPM ของโมดูลคงที่ไม่สามารถเปลี่ยนได้ยกเว้นโดยการสร้างเซิร์ฟเวอร์ขึ้นใหม่หรือไม่?
Steven T. Snyder

ฟังดูคล้ายกับอะไรบางอย่างที่เฉพาะเจาะจง distro ด้วย wrapper ระดับที่สูงขึ้นรอบ ๆ ?
andol

2
บน CentOS 6.6 / usr / sbin / httpd, /usr/sbin/httpd.event และ /usr/sbin/httpd.worker เป็นไบนารีที่แตกต่างทั้งหมดที่มี MPM ที่แตกต่างกันที่กำหนดเวลาการรวบรวม (prefork เหตุการณ์และผู้ปฏิบัติงานตามลำดับ) การเปลี่ยนการตั้งค่า HTTPD ใน / etc / sysconfig / httpd เพียงแค่ควบคุมว่าไบนารีใดที่รันโดยสคริปต์เริ่มต้น
Paul Haldane

ฉันต้องเรียกใช้ apache2 -V แทนที่จะเป็น httpd -V บน Ubuntu 16.04 LTS
cnizzardini

41

ใน Ubuntu 14.04

a2query -M

บอกeventว่าprefork,worker

คุณสามารถเปลี่ยนได้โดยการเพิ่มการเชื่อมโยงสัญลักษณ์สำหรับการmpm_<chosen>จากmods-availableไปในmods-enabled/etc/apache2

อนุญาตเพียงหนึ่งครั้งเท่านั้น


2
นี่จะต้องเป็นคำตอบที่ได้รับการยอมรับ

ใช่คำตอบที่ดี! ง่ายและคืนสิ่งที่ต้องการ
Flash Thunder

ทำงานได้ดีที่สุดสำหรับฉันขอบคุณ (ทำงานบน apache 2.4 .... ดูเหมือนว่าไม่ทำงานบน apache 2.2)
dmikam

eventMPM เป็นไปตามเว็บไซต์ของ Apache "แตกต่างจากคน MPM โดยมีเป้าหมายของการบริโภคหัวข้อเพียงสำหรับการเชื่อมต่อกับการประมวลผลที่ใช้งาน"
Jonathan Berger

7

ใน RedHat และ derivates เพียงแค่เปิดtopหรือps auxดูที่กระบวนการชื่อ httpd:

  • httpd หมายความว่า Apache กำลังทำงานเป็น prefork
  • httpd.worker หมายความว่ามันทำงานเป็นพนักงาน

4

บน RHEL / Fedora / etc httpd -Vวิ่ง คุณจะได้รับผลลัพธ์บางอย่างซึ่งรวมถึงต่อไปนี้:

Server version: Apache/2.2.21 (Unix)
     ...
Architecture:   64-bit
Server MPM:     Prefork
     ...

ที่นี่ 'Server MPM' คือ 'Prefork' ดังนั้นเซิร์ฟเวอร์ของฉันกำลังเรียกใช้ prefork MPM


คำตอบนี้ผิด ดูคำตอบของฉัน
Chris Johnson

@ChrisJohnson การค้นพบที่น่าสนใจ ... ฉันเข้าใจว่า MPM ไม่สามารถเปลี่ยนแปลงได้ด้วยการกำหนดค่าโดยการรวบรวมเท่านั้น ดูเหมือนว่า OP จะคิดเหมือนกันเนื่องจากเขาแสดงความคิดเห็นต่อคำถามของเขาด้วย "หรือมากกว่านั้นในทางเทคนิค" คอมไพล์ให้ทำงานเป็น '" ฉันจะตรวจสอบการทำซ้ำคำตอบของคุณและเมื่อฉันได้รับการยืนยันมันจะเพิกถอนฉัน
Steven T. Snyder

ฉันยืนยันผ่านเอกสาร apache ที่httpd.apache.org/docs/trunk/mpm.htmlว่า MPM สามารถสร้างเป็นโมดูล DSO และโหลดแบบไดนามิกด้วยคำสั่ง LoadModule บน "Unix และแพลตฟอร์มที่คล้ายคลึงกัน" ดังนั้น MPM สามารถเปลี่ยนแปลงได้ตามเวลาที่โหลดภายใต้สถานการณ์บางอย่าง (ซึ่งอาจเป็นการกำหนดค่าที่พบบ่อยที่สุดในวันนี้ .. )
สตีเวนทีสไนเดอร์

4

Chris Johnson ถูกต้อง ไปที่httpd.conf => เพิ่มบรรทัดนี้:

<Location /server-info>
SetHandler server-info
</Location>

รีสตาร์ท apache: /etc/init.d/httpd ทำการรีสตาร์ท จากนั้นการเข้าถึงlocalhost / เซิร์ฟเวอร์ข้อมูลเบราว์เซอร์ของคุณและดูที่ MPM ชื่อส่วน


แม้จะดีกว่าให้ใส่ระหว่าง <IfModule info_module> </IfModule>
Lexib0y

3

นี่เป็นอีกวิธีที่ฉันคาดว่าน่าเชื่อถือในการพิจารณาว่า MPM ใดที่ใช้งานอยู่ เพิ่มสิ่งต่อไปนี้ในของคุณhttpd.conf:

<IfModule prefork.c>
    Header append X-MPM prefork
</IfModule>
<IfModule worker.c>
    Header append X-MPM worker
</IfModule>

curl -I localhost | grep X-MPMจากนั้นตรวจสอบส่วนหัวใช้


3

บน centos (หรือ rhel) คุณสามารถเรียกใช้คำสั่งนี้:

ps -ef | grep httpd

หากคุณเห็นการ/usr/sbin/httpd.workerทำงานแสดงว่ากำลังใช้ MPM ของผู้ปฏิบัติงาน หากคุณเห็นการ/usr/sbin/httpdทำงานแสดงว่ากำลังใช้ prefork


2

คำตอบจาก Chris Johnson นั้นถูกต้อง

หลังจากเปิดใช้งานโมดูลข้อมูลตามที่ระบุไว้ในเอกสาร Apache ( http://httpd.apache.org/docs/2.2/mod/mod_info.html ) เอกสารฉบับนี้จะให้ MPM ที่คุณใช้:

links -dump http://localhost/server-info/?server | grep "MPM Name"

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