在与 django 的 dev server 合作了两个月之后,终于到了迁移到 apache + mod_wsgi 的时候了。
问题是当我访问我的网站(我们称之为 junux)时,访问映射到 django 应用程序的 URL 时,事情似乎不起作用。在服务器上运行开发服务器时,一切正常。
在 apache error_log 中给出了错误的底线:
ImportError:无法导入设置“junux_site.settings”(是否在 sys.path 上?):没有名为 importlib 的模块
我知道这与有关此事的许多其他问题相似(有很多我什至不会在这里引用它们),但我仍然没有找到答案。我已经阅读了很多关于转向生产的指南,包括 django 的部署文档、mod_wsgi 的指南、一些 pycon 演示文稿,并且整天都在谷歌上搜索这个问题......
下面有很多有趣和令人兴奋的细节。
任何帮助将不胜感激。提前致谢。
配置:
- CentOS 6 上带有 mod_wsgi 的 Apache 2.2.15
- 从源代码编译的 Python 2.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
apacheerror_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 时,(非常简单的)应用程序可以工作(典型的 hello world)。
按照此处引用的 pycon-sydney-2010 演示文稿中的说明,我已chmod o+r
对我的 wsgi 文件和chmod o+rx
整个目录设置了权限。/var/www/junux_dev