どのApacheモジュールが有効/インストールされているかを確認するにはどうすればよいですか?


回答:


464

Ubuntuを使用しているので、試してみてください。

apache2ctl -M

11
-M apache2ctl素晴らしい作品
ウド

3
apache2の-Mは、このエラーになりますapache2: bad user name ${APACHE_RUN_USER}
ウド

4
十分です-apache configで定義されたapacheランタイムユーザー(おそらくwww-data)としてコマンドを実行していないためです。これを修正する方法はありますが、apache2ctlに固執することもできます。
リンカー3000

9
sudo apache2ctl -M | sort
mmdemirbas

4
多くの便利なオプション(フラグ)apache2ctlがありますが、それらはマンページにもにもリストされていませんapache2ctl --help。それは彼らがに引き継がれているからhttpdです。それらはhttpdのドキュメントにのみリストされています
ルッツプレシェルト14

117

httpd -M どのモジュールが組み込みまたは共有されているかがわかります。


うーん... httpd -Mをルートとして起動すると「bash:httpd:コマンドが見つかりません」というメッセージが表示される
-udo

そのため、httpd実行可能ファイルへのフルパスを指定します。
イグナシオバスケス-エイブラムス

9
@ IgnacioVazquez-Abrams:Ubuntu(および他のDebianベースのディストリビューション)では、名前はapache2でなくhttpdであるため、見つかりません。
ダニエルアンダーソン

3
Apacheはredhatでhttpdです。これがうまくいかない場合は、他の答えを試してください。
Jacks_Depression

3
CentOSは、apache2の代わりにhttpdも使用します
pedromanoel 14

37

リモートサーバーでコマンドを実行できない場合、上記の回答は機能しません。「ユーザー」権限のみを持っているか、まったく持っていない場合は、test.phpスクリプトを作成してみてください。

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

ただし、PHPがとしてインストールされてmod_phpいる場合にのみ機能します。


4
また、これを公開しないようにすることもできます。その結果を管理者のIPを持つクライアントに制限したい場合があります。そして、スクリプトを使い終わったらすぐに削除する必要があります。多層防御だからです。必要以上に簡単にしないでください。
パルティアショット

28

多分これはなしにアクセスできる共有ホスト上で一部の人のために役立つhttpdapachectlまたはプロセス:

有効なモジュール: ls /etc/apache2/mods-enabled/

利用可能なモジュール: ls /etc/apache2/mods-available/


完全なリストは次の
とおりです。apache2ctlは


13

ここには3つの質問があると思います。どちらを尋ねているのかわかりません。

  • ディスク上にはどのモジュールがありますか。使用できるすべてのモジュールは何ですか。

これは(通常)apacheディストリビューションのモジュールディレクトリ、通常は/ 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/ && $3 == 1{print $2}'

それからチェックアウト

cat /proc/PID_FROM_ABOVE/maps

1
役に立つ情報ですが、OPはUbuntuを使用しているため、ファイル名と場所は異なります。たとえば、httpdの代わりに/ usr / sbin / apache2、ps -ef | gawk '/ apache2 / && $ 3 == 1 {print $ 2}'モジュールの場所は、modsが利用可能なサブフォルダーとmodsが有効なサブフォルダーで異なる方法で処理されます
Linker3000

ありがとう@ 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

どこにあるのか正確に教えてくれました。お役に立てれば。




2

phpスクリプト内からのチェック(mod_xsendfileの場合):

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

PHPがCGIとして実行されている場合、apache_get_modules()はそのコンテキストでは機能しないため、PHP_SAPIのチェックは除外されます。さらに、これがphp <5.0.0で実行される場合、apache2handlerコンテキストのみが期待される結果を生成します。


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']
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.