Jak sprawdzić, które moduły Apache są włączone / zainstalowane?

380

Jaki jest najbardziej elegancki sposób sprawdzenia, które moduły Apache są włączone?

udo
źródło

Odpowiedzi:

464

Jesteś na Ubuntu, więc spróbuj:

apache2ctl -M
Linker3000
źródło
11
apache2ctl -M działa świetnie
udo
3
apache2 -M powoduje ten błądapache2: bad user name ${APACHE_RUN_USER}
udo
4
W porządku - wynika to z faktu, że nie uruchamiasz polecenia jako użytkownik czasu wykonywania apache (prawdopodobnie www-data) zdefiniowany w konfiguracji apache. Jest sposób, aby to naprawić, ale równie dobrze możesz trzymać się apache2ctl.
Linker3000
9
sudo apache2ctl -M | sort
mmdemirbas,
4
Zauważ, że istnieje wiele przydatnych opcji (flag), apache2ctlale nie są one wymienione ani na stronie podręcznika, ani w apache2ctl --help. To dlatego, że są przekazywane do httpd. Są one wymienione tylko w dokumentacji httpd .
Lutz Prechelt
117

httpd -M powie ci, które moduły są wbudowane lub współdzielone.

Ignacio Vazquez-Abrams
źródło
hmm ... Dostaję komunikat „bash: httpd: polecenie nie znaleziono” podczas uruchamiania httpd -M jako root
udo
Następnie określ pełną ścieżkę do httpdpliku wykonywalnego.
Ignacio Vazquez-Abrams
9
@ IgnacioVazquez-Abrams: W Ubuntu (i innych dystrybucjach opartych na Debianie) nazwa ma na imię apache2i nie httpd, dlatego go nie znaleziono.
Daniel Andersson,
3
Apache jest httpd na redhat. Wypróbuj jedną z pozostałych odpowiedzi, jeśli ta nie działa dla Ciebie.
Jacks_Depression
3
CentOS używa również httpd zamiast apache2
pedromanoel
37

Nic z powyższych odpowiedzi nie działa, jeśli nie można uruchamiać poleceń na zdalnym serwerze. Jeśli masz tylko uprawnienia „użytkownika” lub nie ma go wcale, spróbuj utworzyć test.phpskrypt:

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

Chociaż będzie działać tylko wtedy, gdy PHP jest zainstalowany jako mod_php.

yatsa
źródło
4
Ponadto nie będziesz chciał, aby było to publicznie widoczne. Może chcesz ograniczyć ten wynik do klienta z adresem IP administratora. I będziesz chciał usunąć ten skrypt, gdy tylko skończysz. Ponieważ obrona w głębi; nie rób tego łatwiej niż trzeba.
Parthian Shot
28

Może to pomoże dla niektórych ludzi na wspólnych gospodarzy bez dostępu do httpd, apachectllub procesów:

Włączone moduły: ls /etc/apache2/mods-enabled/

Dostępne moduły: ls /etc/apache2/mods-available/

CodeBrauer
źródło
Oto pełna lista, przefiltruj je
apache2ctl
13

Myślę, że są tutaj właściwie trzy pytania. Nie jestem pewien, o co pytasz.

  • Jakie moduły masz na dysku. Jakie są wszystkie moduły, których możesz użyć.

Byłoby to (zwykle) w katalogu modułów twojej dystrybucji apache, zwykle / etc / httpd / modules /

  • Jakie moduły to dowolne konkretne wystąpienie skonfigurowane do działania.

Można to sprawdzić za pomocą / usr / sbin / httpd -M, przynajmniej dla podstawowego systemu apache. Jeśli chcesz sprawdzić konkretny plik konfiguracyjny / usr / sbin / httpd -M -f / path / to / config / file

  • Co jest w uruchomionym apache?

Aby uzyskać dużo informacji, możesz je zobaczyć za pomocą http: // nazwa_mechanizmu / server-info / To nie jest domyślnie skonfigurowane, musisz go skonfigurować . To trochę wycieku informacji, więc skonfiguruj to więc tylko miejscowi mogą to zobaczyć.

Jeśli korzystasz z komputera i masz dostęp do działającego użytkownika, możesz także sprawdzić, co jest załadowane, sprawdzając proces. Możesz znaleźć proces nadrzędny za pomocą:

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

Następnie sprawdź

cat /proc/PID_FROM_ABOVE/maps
Rich Homolka
źródło
1
Przydatne informacje, ale ponieważ OP używa Ubuntu, nazwy plików i lokalizacje są różne - na przykład: / usr / sbin / apache2 zamiast httpd i ps -ef | gawk '/ apache2 / && $ 3 == 1 {print $ 2}' Lokalizacja modułów jest obsługiwana inaczej, z podfolderami dostępnymi i włączonymi modami
Linker3000
Dzięki @ Linker3000 ... Masz rację, to jest dla RedHat / Centos, pozwolę twojemu komentarzowi stać na temat przejścia na Ubuntu
Rich Homolka
11

Jeśli korzystasz z Redhat / CentOS, httpdjest używany zamiast apache2ctl.

Oznacza to, że musisz użyć

httpd -M

Jednak httpdprawie nigdy nie znajduje się na oczekiwanej ścieżce.

Mogę potwierdzić na CentOS 5.8 faktyczną ścieżkę /usr/sbin/httpd.

/usr/sbin/httpd -M

Ale jeśli to nie jest ścieżka, możesz ją odkryć. Oto jak mogłem to zrobić.

Najpierw sprawdziłem demona używanego do sterowania nim.

less /init.d/httpd

Wokół linii 40ish

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

Który powiedział mi dokładnie, gdzie go znaleźć. Mam nadzieję że to pomoże.

Geedew
źródło
5

Wyświetl wszystkie włączone moduły

a2query -m
MetalGodwin
źródło
3

Na moim Gentoo mogę wykonać apache2ctl modulesi zobaczyć wymienione moduły.

Grzegorz Golec
źródło
2

Sprawdzanie z poziomu skryptu php (dla pliku mod_xsendfile):

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

Sprawdzanie PHP_SAPI polega na wykluczeniu, gdy php działa jako CGI, ponieważ apache_get_modules () nie działa w tym kontekście. Dodatkowo, jeśli jest uruchamiany na php <5.0.0, tylko apache2handlerkontekst da oczekiwany wynik.

noobish
źródło
1

Stworzyłem mały skrypt Pythona, aby ci w tym pomóc. Proszę spojrzeć na https://github.com/zioalex/unused_apache_modules

Oto, czego możesz się po tym spodziewać:

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
źródło