web-dev-qa-db-ja.com

Apache内で複数のDjangoプロジェクトを実行し、sys.pathが上書きされています

私は、ApacheVirtualHostsを使用して複数のPython/Djangoデプロイメントを行う方法を研究しようとしています。

私が直面している問題は単純なようですが、

ImportError: Could not import settings 'hub.settings' (Is it on sys.path?): No module named hub.settings, referer: proposals.internal.local

私が抱えている問題は、proposals.internal.localがproposals.settingsを使用していて、hub.settingsが実際にはhub.internal.localからのものであるということです。

プロポーザルまたはハブだけを単独で実行する場合、上記の問題は発生しませんが、両方を実行すると、人々がそれらを使用するためです。 sys.pathは、両方のプロジェクトで更新されているようです。

[ApacheCONFIGS-ハブ]

<VirtualHost *:80>

    ServerName hub.internal.local

    DocumentRoot /var/www/hub.internal.local/hub/hub/static
    Alias /static/  /var/www/hub.internal.local/hub/hub/static/

    <Directory /var/www/hub.internal.local/hub/hub/static>

        Allow from all

    </Directory>

    WSGIScriptAlias / /var/www/hub.internal.local/hub/hub/wsgi.py

</VirtualHost>

[Apacheの構成-提案]

<VirtualHost *:80>

    ServerName proposals.internal.local

    DocumentRoot /var/www/proposals.internal.local/proposal/proposal/static
    Alias /static/  /var/www/proposals.internal.local/proposal/proposal/static/

    <Directory /var/www/proposals.internal.local/proposal/proposal/static>

        Allow from all

    </Directory>

    WSGIScriptAlias / /var/www/proposals.internal.local/proposal/proposal/wsgi.py

</VirtualHost>

[wsgi.py-HUB]

import os
import sys

os.environ.setdefault("Django_SETTINGS_MODULE", "hub.settings")
sys.path.append('/var/www/hub.internal.local')
sys.path.append('/var/www/hub.internal.local/hub')

from Django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

[wsgi.py-提案]

import os
import sys

os.environ.setdefault("Django_SETTINGS_MODULE", "proposal.settings")
sys.path.append('/var/www/proposals.internal.local')
sys.path.append('/var/www/proposals.internal.local/proposal')

from Django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

明らかに何かが足りませんが、ドキュメントから異常なことは何も見られません。

2
Tim

os.environ.setdefault()は使用しないでください。 Django環境変数を設定する方法に切り替えたときに、1つのmod_wsgiプロセスで複数のアプリケーションのホスティングを台無しにしました。

これは私のブログに記載されています: リクエストが間違って実行されているDjango Apache/mod_wsgiの下のインスタンス

これが原因である場合、2つの解決策があります。最も簡単な方法は、setdefault()の使用を置き換えて、WSGIスクリプトファイルの環境変数をより通常の割り当てに置き換えることです。

os.environ['Django_SETTINGS_MODULE'] = 'mysite.settings'

もう少し作業が必要ですが、他の利点もある可能性がある別の方法は、mod_wsgiのデーモンモードを使用してDjangoインスタンスを実行し、それぞれを個別のプロセスセットに委任することです。 Djangoインスタンスが別々のプロセスにある場合、環境変数が一方から他方にリークする可能性はありません。

WSGIDaemonProcess project-2
WSGIScriptAlias /suburl /some/path/project-2/wsgi.py process-group=project-2

WSGIDaemonProcess project-1
WSGIScriptAlias / /some/path/project-1/wsgi.py process-group=project-1
3