Какой самый элегантный способ проверить, какие модули apache включены?
11 ответов
Вы на Ubuntu, так что попробуйте:
apache2ctl -M
httpd -M
скажет вам, какие модули являются встроенными или общими.
Ничего из приведенного выше не работает, если вы не можете запускать команды на удаленном сервере. Если у вас есть только «пользовательские» привилегии или их нет вообще, попробуйте создать скрипт test.php
:
<pre>
<?php
print_r(apache_get_modules());
?>
</pre>
Хотя это будет работать только если PHP установлен как mod_php
.
Может быть, это поможет некоторым людям на общих хостах без доступа к httpd
, apachectl
или процессам:
Включенные модули: ls /etc/apache2/mods-enabled/
Доступные модули: ls /etc/apache2/mods-available/
Вы также можете использовать apachectl
apachectl -t -D DUMP_MODULES
Я думаю, что на самом деле есть три вопроса здесь. Я не уверен, о чем ты спрашиваешь.
- Какие модули у вас есть на диске. Какие все модули вы можете использовать.
Это будет (обычно) в каталоге модулей вашего дистрибутива 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
Если вы используете 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
Который сказал мне точно, где его найти. Надеюсь это поможет.
Список всех включенных модулей
a2query -m
На моем gentoo я могу выполнить apache2ctl modules
и посмотреть список модулей.
Проверка из скрипта 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
даст ожидаемый результат.
Я создал небольшой скрипт на 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']