如何检查启用/安装了哪些Apache模块?


Answers:


464

您正在使用Ubuntu,请尝试:

apache2ctl -M

11
apache2ctl -M效果很好
udo

3
apache2 -M导致此错误apache2: bad user name ${APACHE_RUN_USER}
udo

4
足够公平-这是由于您没有以apache配置中定义的apache运行时用户(可能是www-data)的身份运行命令。有一种方法可以解决此问题,但您最好还是坚持使用apache2ctl。
Linker3000

9
sudo apache2ctl -M | sort
mmdemirbas 2012年

4
请注意,有许多有用的选项(标志),apache2ctl但是它们都没有在手册页和中列出apache2ctl --help。那是因为他们被交给了httpd。它们仅在httpd文档中列出。
Lutz Prechelt 2014年

117

httpd -M 会告诉您哪些模块是内置的或共享的。


嗯...我以root身份启动httpd -M时收到“ bash:httpd:命令未找到”
udo

因此,请指定httpd可执行文件的完整路径。
伊格纳西奥·巴斯克斯

9
@ IgnacioVazquez-Abrams:在Ubuntu(以及其他基于Debian的发行版)上,名称为apache2and not httpd,这就是为什么找不到它的原因。
丹尼尔·安德森

3
Apache在redhat上为httpd。如果这个答案不适合您,请尝试其他答案之一。
Jacks_Depression 2013年

3
CentOS也使用httpd代替apache2
pedromanoel

37

如果您无法在远程服务器上运行命令,则以上答案均无效。如果您只有“用户”特权或根本没有特权,请尝试创建test.php脚本:

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

虽然仅当PHP安装为时才可以使用mod_php


4
另外,您将不想让它公开显示。可能希望将该结果限制为具有管理员IP的客户端。完成后,您将希望删除该脚本。因为纵深防御;不要让它变得比需要的容易。
Parthian Shot 2015年

28

也许这将帮助一些人,没有访问共享的主机httpdapachectl或过程:

启用的模块: ls /etc/apache2/mods-enabled/

可用模块: ls /etc/apache2/mods-available/


这是完整列表,apache2ctl对其进行过滤
jgpATs2w


13

我认为这里实际上有三个问题。我不确定您要问哪个。

  • 磁盘上有哪些模块。您可以使用所有哪些模块。

(通常)在您的Apache发行版的modules目录中,通常是/ etc / httpd / modules /

  • 什么模块是配置为运行的任何特定实例。

至少对于基本系统apache,可以使用/ usr / sbin / httpd -M进行检查。如果要检查特定的配置文件/ 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 | gawk'/ apache2 / && $ 3 == 1 {print $ 2}'模块的位置以不同的方式处理,具有可用的mods和启用了mods的子文件夹
Linker3000 2011年

谢谢@ Linker3000 ...没错,这是针对RedHat / Centos的,我将就如何转换为Ubuntu发表您的评论
Rich Homolka

11

如果您使用的是Redhat / CentOS,请httpd使用代替apache2ctl

这意味着您需要使用

httpd -M

但是,httpd几乎从来都不在您期望的道路上。

我可以在CentOS 5.8上确认实际路径是/usr/sbin/httpd

/usr/sbin/httpd -M

但是,如果这不是路径,那么您可以发现它。这就是我这样做的方式。

首先,我检查了用于控制它的守护程序。

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以CGI运行时,对PHP_SAPI的检查将排除在外,因为apache_get_modules()在该上下文中不起作用。另外,如果在php <5.0.0上运行,则仅apache2handler上下文会产生预期的结果。


1

我创建了一个小的python脚本来帮助您。请看看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']
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.