3

解決策を探しています。/etc/profile で定義された変数を apache に渡すことができません。

これが私が設定しようとしているものです:

WGSI インターフェイスを介して Apache/Passenger (modrails) を介してデプロイする django アプリケーションがあります。

私の settings.py では、この python コマンドを使用しています: ENVIRONMENT = os.getenv('ENV', 'PROD') したがって、ENVIRONMENT 変数が定義されていない場合、デフォルトで本番環境の設定になります。

これは、接続する DB を管理し、デバッグ ツールを有効にするのに役立ちます。

/etc/profile から環境変数を取得できないのは、DEV サーバーにいるときです。

Ubuntu 10.04サーバー上にあります

だからここに私が行ったいくつかのテストがあります:

1) /etc/profile に入れる -> ENV='DEV' export ENV

2) /etc/profile.d/environment.sh の下 -> #!/bin/sh ENV='DEV' export ENV

3)仮想ホスト構成ファイルで-> PassEnv ENV

4)まだ仮想ホスト構成ファイルにあります-> SetEnv ENV DEV

5) このファイル viron['ENV'] = 'DEV' を強制する場合、passenger_wgsi.py を使用してアプリケーションを登録する必要があります。

ENVIRONMENT = os.getenv('ENV', 'PROD')
os.environ['ENV'] = ENVIRONMENT

なぜ、またはどうすればこれを修正できますか? ありがとう!





@ジョシュ

返信いただきありがとうございます。しかし、まだいくつか質問があります。

Passenger では、仮想ホスト ファイルに設定する必要があったのは、python/django アプリ内の public フォルダーの場所だけでした。したがって、私の仮想ホスト ファイルは次のようになります。

DocumentRoot path_to_my_public_folder # /home/user/workspace/myapp/public

次に、myapp フォルダー内には、passenger_wsgi.py があります。

あなたが言ったようにほとんど定義しません:

import sys, os
sys.path.append(os.getcwd())

os.environ['DJANGO_SETTINGS_MODULE'] = "myapp.settings"

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

これらの設定の後、アプリケーションが実行されました。したがって、使用した wsgi ファイルを指定する必要があるとあなたが言っているときは、あなたの指示が欠けている可能性があります。私は、passenger_wsgi.py を直接見つけて、現時点で実行しているように見えるものをデフォルトでロードします。

もう 1 つ知っておくべきことは、私たちのプロジェクトは SVN リポジトリにあり、このファイルを多くのユーザー用にセットアップして、異なる設定がないようにしたいということです。

しかし、明日テストするのは、共通情報を含む 1 つのベース wsgi ファイルを作成し、コンピューターのホスト名に基づいて、dev_wsgi.py や prod_wsgi.py などから他の設定をインポートするというアイデアです。

この名前を python で取得し、その名前に基づいて、使用する必要のある変数を設定できるはずです。

アイデアをありがとう、それは大歓迎です。

4

2 に答える 2

4

特定の問題を解決する方法がわからないため、別の解決策を提案します。

複数の WSGI ファイルを作成します。production.wsgidev1.wsgi、など。とにかくdev2.wsgitest.wsgi各 Web サーバーを設定する必要があります。/path/to/.wsgiとにかく、wsgi ファイルには最小限のコードしかないので、これを複製するのにそれほど費用はかかりません。また、_base.wsgiすべての共通値を提供する を用意し、派生 wsgis に を呼び出すように要求することもできますapplication = wsgi.WSGIHandler()

私たちのプロジェクトの各開発者は、独自の設定ファイルと wsgi ファイルを持っており、不正な値で本番環境を壊すことなく設定を改ざんできます。

于 2011-02-13T21:06:19.137 に答える
0

私はついにそれを機能させました、そして私は@Joshの提案の後に私がそれを理解した方法を提供します。

これが私のWSGIファイルのようになりました:

import sys, os

sys.path.append(os.getcwd())
# this allows us to run the project under Passenger on our workstation
# it is simply a list of all the developers machine hostname it can be expended as we want
LIST_OF_DEV_HOSTNAME = ['PC1', 'PC2','PC3',]
# Return the current machine hostname
HOSTNAME = os.uname()[1]

# Import Django app module
if HOSTNAME in LIST_OF_DEV_HOSTNAME:
    # here if it is not detected you can append to your python path the root folder of your django app
    sys.path.append('/home/user/workspace/django-app')
    # As previously mentioned I use an Environment Variable in the settings.py to switch DB and debug settings
    # so here I set the ENV variable I use in the settings.py to reflect the Development environment
    os.environ['ENV'] = 'DEV'
else:
    # we could append any other needed path in here too
    sys.path.append('/any/other/folder')
    # As previously mentioned I use an Environment Variable in the settings.py to switch DB and debug settings
    # so here I set the ENV variable I use in the settings.py to reflect the Development environment
    os.environ['ENV'] = 'PROD'

# Shared between the two environments    
sys.path.append('/usr/lib/python2.4/site-packages/')

# Import the django app settings and Environment variable
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

だから、これは私がそれをトレーニングする方法です。

/ opt / environmentのようなファイルを作成して、次のようにチェックすることもできます。#os.path.isfile('/ opt / environment'):os.environ ['ENV']の場合、ファイルが存在するかどうかをチェックします。 ='DEV' else:os.environ ['ENV'] ='PROD'

同じチェックを実行できたはずですが、ファイルを作成するように全員に指示する必要があります。私たちのプロジェクトはSVNの下にあるので、ファイルを作成するか、リストにホスト名を追加するかによって異なります。WSGIファイルの単純なコミットは、ファイルの作成よりも簡単です。

ありがとうございました。

于 2011-02-14T15:03:44.713 に答える