วิธีการตรวจสอบโมดูล apache ที่เปิดใช้งาน / ติดตั้ง?


คำตอบ:


464

คุณอยู่บน Ubuntu ดังนั้นลอง:

apache2ctl -M

11
apache2ctl -M ใช้งานได้ดี
udo

3
apache2 -Mส่งผลให้เกิดข้อผิดพลาดนี้apache2: bad user name ${APACHE_RUN_USER}
udo

4
ยุติธรรมเพียงพอ - เป็นเพราะความจริงที่ว่าคุณไม่ได้เรียกใช้คำสั่งตามที่ผู้ใช้เรียกใช้งาน Apache (อาจเป็นข้อมูล www-data) ที่กำหนดไว้ในการกำหนดค่า apache มีวิธีแก้ไขปัญหานี้ แต่คุณอาจติด apache2ctl
Linker3000

9
sudo apache2ctl -M | sort
mmdemirbas

4
หมายเหตุ: มีตัวเลือกที่มีประโยชน์มากมาย (ธง) ไปapache2ctlแต่พวกเขามีการระบุไว้ในค่า manpage apache2ctl --helpหรือใน httpdนั่นเป็นเพราะพวกเขาจะถูกส่งผ่านไปยัง พวกเขาอยู่ในเอกสาร httpdเท่านั้น
Lutz Prechelt

117

httpd -M จะบอกคุณว่าโมดูลใดถูกติดตั้งหรือใช้งานร่วมกัน


อืม ... ฉันได้รับ "bash: httpd: ไม่พบคำสั่ง" เมื่อเปิดใช้ httpd -M เป็นรูท
udo

ดังนั้นจากนั้นระบุเส้นทางแบบเต็มไปยังhttpdปฏิบัติการ
Ignacio Vazquez-Abrams

9
@ IgnacioVazquez-Abrams: บน Ubuntu (และดิสทริบิวชันที่ใช้ Debian อื่น ๆ ) ชื่อนี้apache2และไม่ใช่httpdซึ่งเป็นสาเหตุที่ไม่พบ
Daniel Andersson

3
Apache เป็น httpd บน redhat ลองคำตอบข้ออื่นข้อหนึ่งถ้าข้อนี้ใช้ไม่ได้กับคุณ
Jacks_Depression

3
CentOS ยังใช้ httpd แทน apache2
pedromanoel

37

ไม่มีอะไรจากคำตอบข้างต้นใช้งานได้หากคุณไม่สามารถเรียกใช้คำสั่งบนเซิร์ฟเวอร์ระยะไกล หากคุณมีสิทธิ์“ ผู้ใช้” เท่านั้นหรือไม่มีเลยลองสร้างtest.phpสคริปต์:

<pre>
<?php
print_r(apache_get_modules());
?>
</pre>

แม้ว่ามันจะทำงานเฉพาะในกรณีที่มีการติดตั้ง PHP mod_phpเป็น


4
นอกจากนี้คุณจะต้องไม่ให้สิ่งนี้ปรากฏต่อสาธารณะ อาจต้องการ จำกัด ผลลัพธ์นั้นให้กับลูกค้าด้วย IP ของผู้ดูแลระบบ และคุณจะต้องการลบสคริปต์นั้นทันทีที่คุณทำเสร็จ เพราะการป้องกันในเชิงลึก อย่าทำให้ง่ายกว่าที่ควรจะเป็น
คู่ปรับ Shot

28

อาจจะช่วยให้บางคนในโฮสต์ที่ใช้ร่วมกันไม่สามารถเข้าถึงหรือดำเนินการตามขั้นตอนต่อไปhttpdนี้apachectl:

โมดูลที่เปิดใช้งาน: ls /etc/apache2/mods-enabled/

โมดูลที่มีอยู่: ls /etc/apache2/mods-available/


นี่คือรายการที่สมบูรณ์ apache2ctl กรองพวกเขา
jgpATs2w


13

ฉันคิดว่ามีคำถามสามข้อที่นี่จริง ฉันไม่แน่ใจว่าคุณถามอะไร

  • โมดูลใดที่คุณมีบนดิสก์ อะไรคือโมดูลทั้งหมดที่คุณสามารถใช้ได้

สิ่งนี้จะเป็น (โดยปกติ) ในไดเรกทอรีโมดูลของการแจกจ่าย apache ของคุณโดยปกติแล้ว / etc / httpd / modules /

  • โมดูลใดที่อินสแตนซ์เฉพาะที่กำหนดค่าให้เรียกใช้

สามารถตรวจสอบได้ด้วย / usr / sbin / httpd -M อย่างน้อยสำหรับ apache ระบบฐาน หากคุณต้องการตรวจสอบไฟล์ปรับแต่งเฉพาะ / usr / sbin / httpd -M -f / path / to / config / file

  • มีอะไรใน apache ที่กำลังทำงานอยู่

ในการรับข้อมูลจำนวนมากคุณสามารถดูได้ด้วยhttp: // machinename / server-info / นี่ไม่ใช่การกำหนดค่าตามค่าเริ่มต้นคุณต้องกำหนดค่าสิ่งต่อไปนี้มันรั่วเล็กน้อย ดังนั้นคนในพื้นที่เท่านั้นที่สามารถเห็นได้

หากคุณอยู่ในเครื่องและคุณมีสิทธิ์เป็นผู้ใช้ที่กำลังทำงานอยู่คุณสามารถดูสิ่งที่โหลดได้โดยตรวจสอบกระบวนการ คุณสามารถค้นหากระบวนการหลักด้วย:

ps -ef | gawk '/httpd/ && $3 == 1{print $2}'

จากนั้นตรวจสอบ

cat /proc/PID_FROM_ABOVE/maps

1
ข้อมูลที่มีประโยชน์ แต่เนื่องจาก OP ใช้ Ubuntu ชื่อไฟล์และตำแหน่งจึงแตกต่างกันตัวอย่างเช่น: / usr / sbin / apache2 แทน httpd และ ps -ef | เพ่งพิศ '/ apache2 / && $ 3 == 1 {พิมพ์ $ 2}' สถานที่ตั้งของโมดูลที่มีการจัดการที่แตกต่างกันมีโฟลเดอร์ย่อยวัยรุ่นที่มีอยู่และวัยรุ่นที่เปิดใช้งาน
Linker3000

ขอบคุณ @ Linker3000 ... คุณพูดถูกสำหรับ RedHat / Centos ฉันจะให้ความคิดเห็นของคุณยืนอยู่ว่าจะแปลงเป็น Ubuntu ได้อย่างไร
Rich Homolka

11

ถ้าคุณอยู่ใน Redhat / CentOS, ถูกนำมาใช้ในสถานที่ของhttpdapache2ctl

ซึ่งหมายความว่าคุณต้องใช้

httpd -M

อย่างไรก็ตามhttpdแทบไม่เคยอยู่ในเส้นทางที่คุณคาดหวัง

เราสามารถยืนยันได้บน CentOS 5.8 /usr/sbin/httpdเส้นทางที่เกิดขึ้นจริง

/usr/sbin/httpd -M

แต่ถ้านั่นไม่ใช่เส้นทางคุณสามารถค้นพบมันได้ นี่คือวิธีที่ฉันสามารถทำได้

ก่อนอื่นฉันตรวจสอบ daemon ที่ใช้ในการควบคุม

less /init.d/httpd

รอบ ๆ เส้น 40ish

# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/sbin/apachectl
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd

ซึ่งบอกฉันว่าจะหาได้ที่ไหน หวังว่านี่จะช่วยได้




2

การตรวจสอบจากภายในสคริปต์ php (สำหรับ mod_xsendfile):

if (in_array(PHP_SAPI, array('apache','apache2filter','apache2handler'))
  && in_array('mod_xsendfile', apache_get_modules()))
  \\doSomething();

การตรวจสอบ PHP_SAPI คือการแยกออกเมื่อ php ทำงานเป็น CGI เนื่องจากapache_get_modules ()ไม่ทำงานในบริบทนั้น นอกจากนี้หากสิ่งนี้ทำงานบน php <5.0.0 เฉพาะapache2handlerบริบทเท่านั้นที่จะสร้างผลลัพธ์ที่คาดหวัง


1

ฉันสร้างสคริปต์หลามขนาดเล็กเพื่อช่วยคุณ โปรดดูที่https://github.com/zioalex/unused_apache_modules

นี่คือสิ่งที่คุณคาดหวังได้:

curl http://localhost/server-info > http_modules_test.txt
cat http_modules_test.txt| python find_unused_apache_mod.py

1
Module name mod_python.c
Configuration Phase Participation: 4
Request Phase Participation: 11
Current Configuration: 3

2
Module name mod_version.c
Configuration Phase Participation: 0
Request Phase Participation: 0
Current Configuration: 1

3
Module name mod_proxy_connect.c
Configuration Phase Participation: 0
Request Phase Participation: 0
Current Configuration: 0

To remove safely:
 ['mod_proxy_connect.c']
POPPED:  mod_proxy_connect.c

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