httpdがapachectlよりも少ないアクティブモジュールを報告するのはなぜですか?

httpdがapachectlよりも少ないアクティブモジュールを報告するのはなぜですか?

Apache2でmod-nssモジュールを有効にしようとしています。そのため、必要な作業を行った後、実際にモジュールがロードされているかどうかを確認したいと思います。

アスカパテクトル

# apachectl -M | grep nss
 nss_module (shared)

デーモン自体に尋ねてください。

/usr/sbin/httpd-prefork -M | grep nss
-> No output

したがって、2つの異なる出力が得られます。

  • apachectlは、mod_nssモジュールがロードされたと主張します。
  • httpdはmod_nssモジュールがロードされていないと主張します。

その後、私は2つのモジュールをリストし(単に特定のモジュールを検索するのではなく)、出力をソートして比較することにしました。

# diff -Nur httpd_sorted_modules apachectl_sorted_modules 
--- httpd_sorted_modules        2016-09-01 13:59:16.297139860 +0200
+++ apachectl_sorted_modules    2016-09-01 13:59:26.680985223 +0200
@@ -15,11 +15,15 @@
  expires_module (shared)
  http_module (static)
  include_module (shared)
+ info_module (shared)
  log_config_module (shared)
  mime_module (shared)
  mpm_prefork_module (static)
  negotiation_module (shared)
+ nss_module (shared)
+ php5_module (shared)
  reqtimeout_module (shared)
+ rewrite_module (shared)
  setenvif_module (shared)
  so_module (static)
  socache_shmcb_module (shared)

ご覧のとおり、apachectlはhttpdと比較して4つの追加モジュールを示しています。なぜこれが起こるのですか?どちらを信じるべきですか?

私はそれらの違いが何であるかを見ようとしましたが、失敗しました。私が見つけた結果のいくつかは次のとおりです。

apachectlはスタンドアロンバイナリのようです。

# ls -l `which apachectl`
-rwxr-xr-x 1 root root 3548 Aug 23 13:11 /usr/sbin/apachectl

Apacheパッケージから:

# rpm -qf `which apachectl`
apache2-2.4.16-12.1.x86_64

これは実際にhttpdの制御を容易にするために使用されます。明らかにSystemDまたはSySVinitと組み合わせて使用​​することには違いがあります。以下は man apachectl ページの引用です。

パススルーモードで実行すると、apachectlはhttpdバイナリで利用可能なすべてのパラメータを取得できます。

   apachectl [ httpd-argument ]

SysV初期化モードで実行すると、apachectlは以下に定義されている単純な単一ワードコマンドを受け入れます。

   apachectl command

したがって、-h helpオプションを要求すると、次のようになります。

 # apachectl -h
Usage: /usr/sbin/httpd-prefork [-D name] [-d directory] [-f file]
                               [-C "directive"] [-c "directive"]
                               [-k start|restart|graceful|graceful-stop|stop]
                               [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
Options:
  -D name            : define a name for use in <IfDefine name> directives
  -d directory       : specify an alternate initial ServerRoot
  -f file            : specify an alternate ServerConfigFile
  -C "directive"     : process directive before reading config files
  -c "directive"     : process directive after reading config files
  -e level           : show startup errors of level (see LogLevel)
  -E file            : log startup errors to file
  -v                 : show version number
  -V                 : show compile settings
  -h                 : list available command line options (this page)
  -l                 : list compiled in modules
  -L                 : list available configuration directives
  -t -D DUMP_VHOSTS  : show parsed vhost settings
  -t -D DUMP_RUN_CFG : show parsed run settings
  -S                 : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG
  -t -D DUMP_MODULES : show all loaded modules 
  -M                 : a synonym for -t -D DUMP_MODULES
  -t                 : run syntax check for config files
  -T                 : start without DocumentRoot(s) check
  -X                 : debug mode (only one worker, do not detach)

それで、それはうまくいくように見える/usr/sbin/httpd-preforkか、少なくともそれが言うように見えます。

しかし、「httpd」が内部的に使用しているものを見てみましょう。

# which httpd
/usr/sbin/httpd

これはシンボリックリンクのようです:

# ls -l `which httpd`
lrwxrwxrwx 1 root root 23 Aug 25 13:28 /usr/sbin/httpd -> /usr/sbin/httpd-prefork

/usr/sbin/httpd-preforkしたがって、apachectlが使用するのと同じものを使用しています。たとえば、-h help を要求すると、次のような結果が得られます。

# /usr/sbin/httpd-prefork -h
Usage: /usr/sbin/httpd-prefork [-D name] [-d directory] [-f file]
                               [-C "directive"] [-c "directive"]
                               [-k start|restart|graceful|graceful-stop|stop]
                               [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
Options:
  -D name            : define a name for use in <IfDefine name> directives
  -d directory       : specify an alternate initial ServerRoot
  -f file            : specify an alternate ServerConfigFile
  -C "directive"     : process directive before reading config files
  -c "directive"     : process directive after reading config files
  -e level           : show startup errors of level (see LogLevel)
  -E file            : log startup errors to file
  -v                 : show version number
  -V                 : show compile settings
  -h                 : list available command line options (this page)
  -l                 : list compiled in modules
  -L                 : list available configuration directives
  -t -D DUMP_VHOSTS  : show parsed vhost settings
  -t -D DUMP_RUN_CFG : show parsed run settings
  -S                 : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG
  -t -D DUMP_MODULES : show all loaded modules 
  -M                 : a synonym for -t -D DUMP_MODULES
  -t                 : run syntax check for config files
  -T                 : start without DocumentRoot(s) check
  -X                 : debug mode (only one worker, do not detach)

これは私が得たものと同じですapachectl -h

しかし、これは他のパッケージから来ました。

# rpm -qf /usr/sbin/httpd-prefork
apache2-prefork-2.4.16-12.1.x86_64

それ以外は、ロードされたモジュールを照会するときに他の出力が出る理由を考えることはできません。

気になる方には、OpenSUSE Leap 42.1をLinuxディストリビューションとして使用し、Prefork MPMを使用してApacheを実行します。

ベストアンサー1

あなたのリストが与えられたら:

# ls -l `which apachectl`
-rwxr-xr-x 1 root root 3548 Aug 23 13:11 /usr/sbin/apachectl

あなたのバイナリが「スタンドアロンバイナリ」である可能性はほとんどありませんapachectl(小さすぎます。合理的なバイナリは10〜20倍大きくなります)。実際、これはシェルスクリプトです。実行するとき

apachectl -M

シェルスクリプトは最初に設定ファイルから追加のパラメータを取得し、-Mhttpdバイナリを実行するとこれらのパラメータを先頭に追加します。

この議論の目的のために、私は以下に言及します。Apache子ミラーとテンプレートスクリプトapachectl.in。もちろん、Apacheのバージョンごとに違いはありますが、共通点は、apachectlスクリプトがサーバーモジュールの場所を含むことができる構成設定を確認することです。現在のバージョンのテンプレートでは、コメントの下にあります。

# pick up any necessary environment variables

これらの変数を設定せずに直接実行すると、httpd-prefork正しく機能しません。これは、モジュールがロードされていないと報告する理由を説明します。出力がない場合は、grepより有益なレポートを取得できます。たとえば、リストがまったくない場合があります。

おすすめ記事