10

過去2か月間djangoの開発サーバーで作業した後、ようやくapache+mod_wsgiに移行する時が来ました。

問題は、自分のサイト(junuxと呼びましょう)にアクセスしたときに、djangoアプリにマップされたURLにアクセスすると、動作しないように見えることです。サーバー上で開発サーバーを実行すると、正常に動作します。

エラーの最終的な結果は、apacheerror_logで示されます。

ImportError:設定をインポートできませんでした'junux_site.settings'(sys.pathにありますか?):importlibという名前のモジュールがありません

これはこの問題に関する他の多くの質問と似ていることを私は知っていますが(ここでは引用すらしないほどたくさんあります)、まだ答えが見つかりません。djangoのデプロイメントドキュメント、mod_wsgiのガイド、いくつかのpyconプレゼンテーションなど、本番環境への移行に関するかなりの数のガイドを読み、一日中この問題をグーグルで調べてきました...

以下にたくさんの楽しくてエキサイティングな詳細があります。

どんな助けでもありがたいです。前もって感謝します。


構成:

  • CentOS6上のmod_wsgiを使用したApache2.2.15
  • ソースからコンパイルされたPython2.7.3
  • サイトはvirtualenvを使用しています

これは、apacheが返すエラーページです。

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Apache/2.2.15 (CentOS) Server at junux.net Port 80

アパッチerror_logは次の情報を明らかにします:

mod_wsgi (pid=22502): Create interpreter 'junux.net|/dev'.
mod_wsgi (pid=22502): Exception occurred processing WSGI script '/var/www/junux_dev/junux_site/wsgi.py'.
Traceback (most recent call last):
  File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 219, in __call__
    self.load_middleware()
  File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 39, in load_middleware
    for middleware_path in settings.MIDDLEWARE_CLASSES:
  File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/utils/functional.py", line 184, in inner
    self._setup()
  File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
    self._wrapped = Settings(settings_module)
  File "/var/www/junux_dev/venv/lib/python2.7/site-packages/django/conf/__init__.py", line 95, in __init__
    raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
ImportError: Could not import settings 'junux_site.settings' (Is it on sys.path?): No module named importlib

関連するwsgi.py

import os
import sys
import site

# use our virtual environment
SITE_DIR = os.path.dirname(__file__)
PROJECT_ROOT = os.path.dirname(SITE_DIR)
site_packages = os.path.join(PROJECT_ROOT, 'venv/lib/python2.7/site-packages')
site.addsitedir(os.path.abspath(site_packages))
sys.path.insert(0, SITE_DIR)
sys.path.insert(1, PROJECT_ROOT)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "junux_site.settings")

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

そしてhttpd.conf:(デフォルトのapache構成ファイルからここにもっと多くのもの)

<VirtualHost *:80>
        ServerName junux.net
        ServerAlias junux.net
        ServerAdmin admin@junux.net

        WSGIScriptAlias /test /var/www/test/hello.py
        WSGIScriptAlias /dev /var/www/junux_dev/junux_site/wsgi.py

        <Directory /var/www/test >
        Order allow,deny
        Allow from all
        </Directory>

        <Directory /var/www/junux_dev >
        Options FollowSymLinks
        Order allow,deny
        Allow from all
        </Directory>

</VirtualHost>

LogLevel info

WSGIScriptAlias健全性を提供するための方法があり/testます-mod_wsgiが実際に機能することを確認してください。します。そのURLを開くと、(非常に単純な)アプリケーションが機能します(典型的なhelloworld)。

ここから参照するpycon-sydney-2010プレゼンテーションで指示されているようchmod o+rに、wsgiファイルとdirchmod o+rx全体にアクセス許可を設定しました。/var/www/junux_dev

4

1 に答える 1

15

mod_wsgi はどのバージョンの Python に対してコンパイルされましたか? システムに複数の Python インストールがあり、仮想環境は Python 2.7 を使用しているように見えますが、mod_wsgi は 2.6 に対してコンパイルされています。

この推測は、importlib が Python 2.7 でのみ追加されたという事実に基づいているため、mod_wsgi が 2.6 用にコンパイルされ、その基本インストールを使用している場合、importlib を見つけることができません。

チェックを実行します。

http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Shared_Library http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Installation_In_Use

于 2012-07-15T16:08:42.323 に答える