Как проверить, какие модули apache включены / установлены?

Ответы:

465

Вы на Ubuntu, так что попробуйте:

apache2ctl -M
Linker3000
источник
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но они не перечислены ни на странице руководства, ни в apache2ctl --help. Это потому, что они переданы httpd. Они перечислены только в документации httpd .
Лутц Пречелт
117

httpd -M скажет вам, какие модули являются встроенными или общими.

Игнасио Васкес-Абрамс
источник
хм ... я получаю "bash: httpd: команда не найдена" при запуске httpd -M от имени пользователя root
udo
Затем укажите полный путь к httpdисполняемому файлу.
Игнасио Васкес-Абрамс
9
@ IgnacioVazquez-Abrams: В Ubuntu (и других дистрибутивах на основе Debian) имя есть, apache2а нет httpd, поэтому оно не найдено.
Даниэль Андерссон
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-адресом администратора. И вы захотите удалить этот скрипт, как только закончите. Потому что глубоко в обороне; не делайте это проще, чем нужно.
Парфянский выстрел
28

Может быть , это поможет некоторым людям на общих хостах, не имеющий доступа к httpd, apachectlили процессов:

Включенные модули: ls /etc/apache2/mods-enabled/

Доступные модули: ls /etc/apache2/mods-available/

CodeBrauer
источник
Вот полный список, фильтр apache2ctl их
jgpATs2w
18

Вы также можете использовать apachectl

apachectl -t -D DUMP_MODULES
Эдди Б
источник
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 | gawk '/ apache2 / && $ 3 == 1 {print $ 2}' Расположение модулей обрабатывается по-разному, с доступными модами и вложенными
папками
Спасибо @ 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

Вокруг линии 40иш

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

Который сказал мне точно, где его найти. Надеюсь это поможет.

geedew
источник
5

Список всех включенных модулей

a2query -m
MetalGodwin
источник
3

На моем gentoo я могу выполнить apache2ctl modulesи увидеть перечисленные модули.

Гжегож Голец
источник
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контекст даст ожидаемый результат.

noobish
источник
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']
Alex
источник