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


17

私の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}

一時的な修正はwww-data、apache2.confファイルにハードコーディングすることです。ここにいくつかの推測がありましたは、一部の構成スクリプトがapache2.confファイルのenv変数を正しく置き換えなかったためで。関係なく、apvar2を取得してenvvarsファイルを調べるにはどうすればよいですか?

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

回答:


30

@Lekensteynの回答を確認した後sudo apache2ctl -M、apache2.confを元に戻してみました。これはうまくいったので、マニュアルページを少し掘り下げました。ここで何を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に感謝します。


initスクリプトを使用することになる一層正しい方法:sudo stop apache2sudo restart apache2及びsudo start apache2/etc/init.d/apache2 stopなど)
Lekensteyn

私の場合、私はumaskenvvarsに設定を追加していましたが、apache2ctl restartそれを使用して再起動した後でもまだ動作しませんでしたが、使用service apache2 restartして再起動すると動作しました(動作service apache2 gracefulしませんでした)。
マットブラウン

apachectlの代わりにserviceを使用することをお勧めしますが、apachectl -S ...のようにserviceコマンドにリンクされていないコマンドを使用する必要がある場合、この答えは素晴らしいです。upvote
Feidaキラ

FYI:行う/etc/init.d apache2 reload意志ピックアップないenvvars追加は、サーバーを停止して開始する必要があります
ThaDon

7

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

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

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

では/etc/init.d/apache2、initscriptパスに基づくファイルAPACHE_ENVVARSのパスに設定され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

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


チェックを実行し、envvarsに構文エラーが含まれていないことを確認できます。私は解決策を見つけました。以下の私の答えをご覧ください。
エイブリーチャン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.