在过去的两个月里,与Django的开发服务器合作后,终于到了apache + mod_wsgi。
问题是,当我去我的网站(让我们称之为junux),到映射到Django应用程序的URL,事情似乎并没有工作。 当在服务器上运行开发服务器的东西正常工作。
这个错误的底线是在apache error_log中给我的:
ImportError:无法导入设置'junux_site.settings'(它是否在sys.path上?):没有名为importlib的模块
我知道这与其他许多问题类似(有很多,我甚至不会在这里引用),但我还是没有find答案。 我已经阅读了不less有关转向制作的指南,包括django的部署文档,mod_wsgi的指南,一些pycon演示文稿,并一直在search这个问题…
下面有很多有趣和令人兴奋的细节。
任何帮助将不胜感激。 提前致谢。
configuration:
这是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
apache 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
:(更多的东西从默认的apacheconfiguration文件)
<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
to /test
来提供mod_wsgi确实WSGIScriptAlias
的健全性检查。 它确实。 当打开该URL(非常简单)的应用程序工作(一个典型的问候世界)。
我已经在我的wsgi文件上设置了chmod o+r
权限,并且在整个/var/www/junux_dev
目录下设置了chmod o+rx
的/var/www/junux_dev
,就像从这里引用的pycon-sydney-2010演示文稿中所指示的那样。
什么版本的Python被编译为mod_wsgi? 看起来你可能在系统上安装了多个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