it-swarm-ja.com

Apache2がenvvarsファイルを尊重しないのはなぜですか?

私のenvvarファイルには、次の行が含まれています。

export Apache_RUN_USER=www-data
export Apache_RUN_GROUP=www-data

私のApache2.confには次の行があります:

# These need to be set in /etc/Apache2/envvars
User ${Apache_RUN_USER}
Group ${Apache_RUN_GROUP}

しかし、Apache2 -Mを実行すると、次のようになります:

Apache2: bad user name ${Apache_RUN_USER}

一時的な修正は、Apache2.confファイルにwww-dataをハードコードすることです。いくつかの推測がありました ここ これは、いくつかの設定スクリプトが私のApache2.confファイルのenv変数を正しく置き換えなかったためであるというものです。関係なくApache2にenvvarsファイルを参照させるにはどうすればよいですか?

別のデータポイントとして このサイト はビルド時にenvvarsが生成されていることを示しているようですが、実行時にApache2ctlによって読み取られ、このファイルはビルドプロセスによって残されただけではないことが示唆されます。

16
Avery Chan

@Lekensteynの回答を見た後、Apache2.confを元に戻したSudo Apache2ctl -Mを試しました。これはうまくいったので、マニュアルページを少し掘り下げました。 man Apache2の発言内容は次のとおりです。

In  general, Apache2 should not be invoked directly, but rather should 
be invoked via /etc/init.d/Apache2 or Apache2ctl. The default Debian 
configuration requires environment variables that are defined in 
/etc/Apache2/envvars  and  are  not  available  if  Apache2  is  
started  directly. However, Apache2ctl can be used to pass arbitrary 
arguments to Apache2.

したがって、この質問に対する答えは次のとおりです。Apache2を正しく使用していません。代わりにApache2ctlを使用してください。

私を正しい方向に向けてくれて、@ Lekensteynに感謝します。

29
Avery Chan

http://httpd.Apache.org/docs/2.2/configuring.html から:

シェル環境変数の値は、構文$ {ENVVAR}を使用して構成ファイルの行で使用できます。 「ENVVAR」が有効な環境変数の名前である場合、その変数の値は構成ファイルの行のそのスポットに置き換えられ、そのテキストが構成ファイルで直接見つかったかのように処理が続行されます。 (ENVVAR変数が見つからない場合、文字「$ {ENVVAR}」は変更されずに残り、構成ファイル処理の後の段階で使用されます。)

したがって、変数は期待どおりに環境から実際に取得されます。さて、これはどこで起こりますか?

/etc/init.d/Apache2では、Apache_ENVVARSが、initscriptパスに基づくenvvarsファイルのパスに設定されます。通常、Apache_ENVVARS=/etc/Apache2/envvarsが設定されます。現在、この値はApache2ctlで設定されているデフォルト値と等しいため、エクスポートされません。

/usr/sbin/Apache2ctlから:

# the path to the environment variable file
test -z "$Apache_ENVVARS" && Apache_ENVVARS="$Apache_CONFDIR/envvars"
# pick up any necessary environment variables
if test -f $Apache_ENVVARS; then
  . $Apache_ENVVARS
fi

説明:Apache_ENVVARSが空の場合、/etc/Apache2/envvarsであるデフォルトパスを使用します。このファイルが存在する場合、それを「ソース」にします(現在の環境でそのファイルからコマンドを実行します)。

envvarsファイルに構文エラーが含まれていないことを確認してください。このようなチェックを実行するには、次を使用します。

sh -n /etc/Apache2/envvars && echo Syntax OK || echo FAIL

エラーがある場合は出力されます。

6
Lekensteyn