检查哪个apache模块已启用的最优雅的方法是哪种?

#1 楼

您在Ubuntu上,请尝试:

apache2ctl -M


评论


apache2ctl -M效果很好

–udo
2011年5月17日在20:06

apache2 -M导致此错误apache2:用户名错误$ {APACHE_RUN_USER}

–udo
2011年5月17日20:07



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

– Linker3000
2011年5月17日在20:23

须藤apache2ctl -M |分类

–mmdemirbas
2012年7月6日13:30

请注意,apache2ctl有许多有用的选项(标志),但它们均未在手册页或apache2ctl --help中列出。那是因为它们被传递到httpd。它们仅在httpd文档中列出。

– Lutz Prechelt
2014-09-27 9:55



#2 楼

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

评论


嗯...以root身份启动httpd -M时出现“ bash:httpd:找不到命令”

–udo
2011年5月17日19:58

因此,请指定httpd可执行文件的完整路径。

–伊格纳西奥·巴斯克斯(Ignacio Vazquez-Abrams)
2011年5月17日19:59

@ IgnacioVazquez-Abrams:在Ubuntu(和其他基于Debian的发行版)上,名称是apache2而不是httpd,这就是为什么找不到它的原因。

–丹尼尔·安德森(Daniel Andersson)
2012年4月11日,9:13

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

– Jacks_Gulch
2013年1月14日15:46

CentOS也使用httpd代替apache2

–pedromanoel
2014年9月5日在13:22



#3 楼

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

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


尽管只有将PHP安装为mod_php才能工作。

评论


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

–Parthian Shot
15年7月15日在20:20

#4 楼

也许这对无法访问httpdapachectl或进程的共享主机上的某些人有所帮助:

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

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

#5 楼

您也可以使用apachectl

apachectl -t -D DUMP_MODULES


#6 楼

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


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

(通常)在您的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/ &&  == 1{print }'


然后签出

cat /proc/PID_FROM_ABOVE/maps


评论


有用的信息,但是因为OP使用的是Ubuntu,所以文件名和位置是不同的-例如:/ usr / sbin / apache2而不是httpd,以及ps -ef | gawk'/ apache2 / && $ 3 == 1 {print $ 2}'模块的位置以不同的方式处理,使用mods可用和启用了mods的子文件夹

– Linker3000
2011年5月17日在21:40



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

– Rich Homolka
2011年5月20日在17:03

#7 楼

如果您在Redhat / CentOS上,则使用httpd代替apache2ctl

这意味着您需要使用

httpd -M


,但是, httpd几乎不会出现在您期望的路径中。

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

/usr/sbin/httpd -M


但是如果那样不是路径,您可以发现它。

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

less /init.d/httpd


第40行左右

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

告诉我确切的位置。希望这会有所帮助。

#8 楼

列出所有启用的模块

a2query -m


#9 楼

在我的gentoo上,我可以执行apache2ctl modules并查看列出的模块。

#10 楼

从php脚本中进行检查(针对mod_xsendfile):上下文。此外,如果在php <5.0.0上运行,则仅apache2handler上下文会产生预期的结果。

#11 楼

我创建了一个小的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']