1

Apache と mod_wsgi を使用して同じサーバー上で動作するいくつかの小さな django プロジェクトがあります。virtualenvironment を使用して別のプロジェクトをインストールし、Apache conf ファイルで設定を行いました。

<VirtualHost XXX.XXX.XXX.XXX:81 >
    ServerName mywebsite.com
    CustomLog /var/www/httpd-logs/mywebsite.com.access.log combined
    DocumentRoot /var/www/empirik/data/www/mywebsite.com
    ErrorLog /var/www/httpd-logs/mywebsite.com.error.log
    ServerAlias www.mywebsite.com
    SuexecUserGroup empirik empirik

    WSGIScriptAlias / /var/www/empirik/data/www/mywebsite.com/myproject/wsgi.py
    WSGIDaemonProcess mywebsite.com python-path=/var/www/empirik/data/www/mywebsite.com/env/lib/python2.7/site-packages

    <Directory /var/www/empirik/data/www/mywebsite.com/myproject>
        Order deny,allow
        Allow from All
    </Directory>

    <Directory /var/www/empirik/data/www/mywebsite.com/myproject/static>
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

Web サイト サーバーを読み込もうとすると、約 50% の時間で 500 エラーまたは別の Web サイトのコンテンツが返され、別の Web サイトのプロジェクト設定を読み込もうとするため、理解できない奇妙なエラーが apache ログ ファイルにいくつかあります。

[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234] mod_wsgi (pid=32361): Exception occurred processing WSGI script '/var/www/empirik/data/www/mywebsite.com/myproject/wsgi.py'.
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234] Traceback (most recent call last):
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]   File "/usr/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 219, in __call__
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]     self.load_middleware()
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]   File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 39, in load_middleware
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]     for middleware_path in settings.MIDDLEWARE_CLASSES:
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]   File "/usr/local/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]     self._setup()
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]   File "/usr/local/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]     self._wrapped = Settings(settings_module)
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]   File "/usr/local/lib/python2.7/site-packages/django/conf/__init__.py", line 95, in __init__
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234]     raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
[Wed May 22 10:18:47 2013] [error] [client 66.249.78.234] ImportError: Could not import settings 'anotherproject.settings' (Is it on sys.path?): No module named anotherproject.settings

もう 1 つの質問は、virtualenv からではなく、デフォルトのシステム python を引き続き使用する理由です。助けてください!

4

2 に答える 2

1

WSGIPythonHomeすべての仮想ホストに対してグローバルに設定されているため、同じ apache で異なる python 実行可能ファイルを使用することはできません( docsを参照)。が設定されていない場合WSGIPythonHome- mod_wsgi はシステム python を使用します。

wsgi.py正しく設定されていないようです。での目標wsgi.pyは、sys.path を正しく操作して、プロジェクトに必要なものをすべて利用できるようにすることです。同じ問題が発生したときに私を助けたのは次のとおりです。ApacheサーバーがWSGI設定で適切なvirtualenvを使用していません

それが役立つことを願っています。

于 2013-05-22T14:23:33.330 に答える
1

構成がありません:

WSGIProcessGroup mywebsite.com

それがなければ、WSGI アプリケーションはデーモン プロセス グループに委任されることさえありません。次の方法で確認できます。

mod_wsgi 3.4 を使用している限り、デーモン モードが適切に使用されると、次のコマンドを使用して、その特定のデーモン プロセス グループの Python ホームを設定できます。

WSGIDaemonProcess mywebsite.com python-home=/var/www/empirik/data/www/mywebsite.com/env

そうすれば、Python 仮想環境のルートをポイントするだけで、それが取得されます。

ただし、Django プロジェクトの親ディレクトリに python-path オプションを指定して、それと設定モジュールを見つけることができるようにする必要があります。これが問題です。したがって、おそらくあなたが望むでしょう:

WSGIDaemonProcess mywebsite.com \
    python-home=/var/www/empirik/data/www/mywebsite.com/env \
    python-path=/var/www/empirik/data/www/mywebsite.com

デーモン プロセス グループでそのサイトのみを実行している場合は、次のように設定します。

WSGIApplicationGroup %{GLOBAL}

サブインタープリターで動作しない C 拡張モジュールの問題を回避するため。

より安全にするために、次の代わりに:

<Directory /var/www/empirik/data/www/mywebsite.com/myproject>
    Order deny,allow
    Allow from All
</Directory>

あなたが使用する必要があります:

<Directory /var/www/empirik/data/www/mywebsite.com/myproject>
<Files wsgi.py>
    Order deny,allow
    Allow from All
</Files>
</Directory>

そうすれば、Apache の設定を台無しにしても、誰かがあなたのコードと設定ファイルをダウンロードするリスクが少なくなります。

そして、あなたが持っている場所:

<Directory /var/www/empirik/data/www/mywebsite.com/myproject/static>
    Order deny,allow
    Allow from all
</Directory>

対応するものが欠けているように見えます:

Alias /media /var/www/empirik/data/www/mywebsite.com/myproject/static

静的メディア ディレクトリのエイリアスがない場合、Apache はそこにファイルを提供しません。

最後に、デーモン モードを強制し、組み込みモードを回避したいので、次のように設定します。

WSGIRestrictedEmbedded On

そうすれば、設定を台無しにして、現在のように誤って組み込みモードで実行すると、エラーが発生します。

于 2013-05-22T23:57:34.643 に答える