Hoe controleer je welke apache modules zijn aangezet/geïnstalleerd?
Wat is de meest elegante manier om te controleren welke apache modules zijn aangezet?
Wat is de meest elegante manier om te controleren welke apache modules zijn aangezet?
Je bent op Ubuntu dus probeer:
apache2ctl -M
httpd -M
vertelt u welke modules ingebouwd of gedeeld zijn.
Niets van bovenstaande antwoorden werkt als je geen commando’s kunt uitvoeren op een externe server. Als je alleen “user” rechten hebt of helemaal geen rechten, probeer dan test.php
script te maken:
<pre>
<?php
print_r(apache_get_modules());
?>
</pre>
Hoewel het alleen werkt als PHP is geïnstalleerd als mod_php
.
Misschien helpt dit voor sommige mensen op gedeelde hosts zonder toegang tot httpd
, apachectl
of processen:
Ingeschakelde modules: ls /etc/apache2/mods-enabled/
Beschikbare modules: ls /etc/apache2/mods-available/
Ik denk dat er eigenlijk drie vragen zijn. Ik weet niet zeker welke je vraagt.
Dit zou (meestal) in de modules directory van je apache distributie staan, meestal /etc/httpd/modules/
Dit kan worden gecontroleerd met /usr/sbin/httpd -M, in ieder geval voor het basissysteem apache. Als u een specifiek configuratiebestand /usr/sbin/httpd -M -f /path/to/config/file
wilt controleren, kunt u dit zien met http://machinename/server-info/ Dit is niet standaard geconfigureerd, u moet configureren het in. Het is een beetje een informatielek, dus configureer het zo dat alleen lokale mensen het kunnen zien.
Als je op de machine zit en je hebt toegang om de draaiende gebruiker te zijn, kun je ook zien wat er geladen is door het proces te controleren. Je kunt het ouderproces vinden met:
ps -ef | gawk '/httpd/ && $3 == 1{print $2}'
.
Als je op Redhat/CentOS zit, wordt httpd
gebruikt in plaats van apache2ctl
.
Dit betekent dat je de
httpd -M
moet gebruiken. httpd
zit echter bijna nooit in het pad dat je verwacht.
Ik kan op CentOS 5.8 bevestigen dat het eigenlijke pad /usr/sbin/httpd
is.
/usr/sbin/httpd -M
Maar als dat niet het pad is, kun je het ontdekken. Hier is hoe ik dat heb kunnen doen.
Eerst heb ik de daemon gecontroleerd die gebruikt wordt om het aan te sturen.
less /init.d/httpd
Rond de lijn 40ish
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/sbin/apachectl
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd
die me precies vertelde waar ik het kon vinden. Ik hoop dat dit helpt.
Lijst van alle ingeschakelde modules
a2query -m
Op mijn ezelsbruggetje kan ik apache2ctl modules
uitvoeren en de vermelde modules zien.
Controle van binnen php script (voor mod_xsendfile):
if (in_array(PHP_SAPI, array('apache','apache2filter','apache2handler'))
&& in_array('mod_xsendfile', apache_get_modules()))
\doSomething();
De controle voor PHP_SAPI is om uit te sluiten wanneer php als CGI draait, aangezien apache_get_modules() niet werkt in die context. Bovendien, als dit wordt uitgevoerd op php< 5.0.0, zal alleen de apache2handler
context het verwachte resultaat opleveren.
Ik heb een klein pythonscriptje gemaakt om je te helpen. Kijk eens naar https://github.com/zioalex/unusedapachemodules
Dit is wat je ervan kunt verwachten:
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']