web-dev-qa-db-ja.com

PassEnvがENV変数を検出しない

私はこれを持っています/etc/profile.d/myfile.sh

export MYVAR=myval

また、Apache confdirのPassEnv MYVARセクションに <virtualhost> 行があります。

それは私に次のようなことをさせます:

$ echo $MYVAR
myval
$ python
>>> import os; os.getenv('MYVAR')
'myval'
$ Sudo echo $MYVAR
myval
$ Sudo -i
root# echo $MYVAR
myval

しかし、それにもかかわらず、私は次のようになります。

root# /sbin/service httpd restart
/sbin/service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: [Mon Oct 22 14:44:02 2012] [warn] PassEnv variable MYVAR was undefined
                                                           [  OK  ]

また、wsgiスクリプト内からMYVARにアクセスしようとしてもすべてうまくいきません。

考え?私は明らかに間違ったことをしていますか?

詳細については編集

私はコンピューター/ VMの群れとプロジェクトの群れに取り組んでいる開発者の群れを持っています。環境情報を保持するためにsimpleの中心的な場所が必要です。最も一般的なのは、「環境」(dev/stage/prod)です。私たちが持っているスキーム(プログラムで*.wsgiを変更する)は、私たちが望むよりも壊れやすいことが判明しています。

私が見る主なオプションは次のとおりです。

  • シェル環境に物を置く
  • 他の設定ファイルに物を置く

シェル環境に物事を取り込むのが最善です。これは、複製された「私の環境とは何か」のコードをさらに記述する必要がないためです。

2
quodlibetor

Apacheはグローバルユーザープロファイルを読み取るつもりはありません。

大きな問題は、実際にこれを何のためにやりたいのかということです。

あなたがしていることは一般的にApacheで物事を行う間違った方法ですが、あなたが解決しようとしている実際の問題がわからないので、あなたが何をすべきかを言うことができません。

質問を修正し、設定しようとしている環境変数とその理由を説明してください。


更新1

特に何をしているのかではありませんが、mod_wsgiのSetEnvはプロセス全体の環境変数を設定しません。 WSGI環境ディクショナリのリクエストごとに変数を設定します。

SetEnvに関連するPassEnvは同じことを行いますが、Apache構成ファイルで定義されているキー/値ではなく、Apacheが継承した既存のプロセス環境変数から取得されます。

したがって、どちらのディレクティブも、mod_wsgiで実行されているWSGIアプリケーションのプロセス全体の環境変数を設定する効果はありません。 IOW、あなたが望むように、それらはos.environ経由でアクセスできません。

ここで、特にPassEnvの場合、Apacheプロセス環境変数をmod_wsgiの下のWSGIアプリケーションでも使用できるようにする場合、Apacheプロセス環境変数は既に使用可能であるため、PassEnvは実際には冗長です。

これは、組み込みモードでは、WSGIアプリケーションがApacheの子ワーカープロセス内で実行されるためです。デーモンモードでも、デーモンプロセスはApache親プロセスの直接フォークであるため(個別のアプリケーションのexecはありません)、Apache内でも効果的に実行されます。

したがって、PassEnvはすでに設定されているため、必要ありません。

Apache init.dスタートアップスクリプトはグローバルユーザーログインプロファイルを取得しないため、必要に応じて実行するには、間違った場所で実行するだけです。

Apache Software FoundationのApacheディストリビューションを使用している場合、またはそれから大きく逸脱していない場合、Apacheの環境変数を設定する正しい場所は、Apache実行可能ファイルと同じディレクトリの「envvars」ファイルです。さまざまなLinuxディストリビューションでは、Apacheセットアップはそのファイルを完全に無視し、代わりにシステム固有のApacheinit.dファイルと一緒に特別なファイルにそれらを設定する必要があります。そこで何をしなければならないかは、Linuxディストリビューションによって異なります。

したがって、前述したように、Apacheはそのグローバルプロファイルファイルを読み取りません。

適切な場所で実行すれば、技術的には機能しますが、Apache全体に影響を与える環境変数の設定に依存することはお勧めしません。

WSGIスクリプトに、システムステータスを設定し、その基本となる別の構成ファイルを読み取らせる方がよいでしょう。特に目的のために設定ファイルを使用することは、プロジェクトの一部ではなく、Apacheの初期化スクリプトからの環境変数設定に依存するほど魔法ではありません。

2