Error 500 and other website's content
我有一些django小项目,它们使用apache和mod_wsgi在同一台服务器上工作。我安装了另一个带有virtualenvironment的项目,并在Apache conf文件中设置了该项目的设置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <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> |
当我尝试加载网站服务器时,大约50%的时间返回500错误或另一个网站的内容,而apache日志文件中有一些我无法理解的奇怪错误,因为它试图加载另一个网站\\的项目设置:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [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 |
另一个问题是为什么它仍然使用默认系统python,而不使用virtualenv?请帮忙!
您的配置丢失:
1 | WSGIProcessGroup mywebsite.com |
否则,您的WSGI应用程序甚至都不会委托给守护进程组。您可以使用以下命令进行检查:
- http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Embedded_Or_Daemon_Mode
一旦正确使用了守护程序模式,只要您使用的是mod_wsgi 3.4,就可以使用以下命令为该特定守护进程组设置Python主目录:
1 | WSGIDaemonProcess mywebsite.com python-home=/var/www/empirik/data/www/mywebsite.com/env |
这样,您只需指向Python虚拟环境的根目录,它将被拾取。
尽管您仍然需要为Django项目的父目录指定python-path选项,以便可以找到它和设置模块,但这是您遇到的问题。因此可能您想要:
1 2 3 | WSGIDaemonProcess mywebsite.com \\ python-home=/var/www/empirik/data/www/mywebsite.com/env \\ python-path=/var/www/empirik/data/www/mywebsite.com |
现在,如果仅在守护进程组中运行该站点,请设置:
1 | WSGIApplicationGroup %{GLOBAL} |
以避免C扩展模块在子解释器中不起作用的问题。
为了安全起见,而不是:
1 2 3 4 | <Directory /var/www/empirik/data/www/mywebsite.com/myproject> Order deny,allow Allow from All </Directory> |
您应该使用:
1 2 3 4 5 6 | <Directory /var/www/empirik/data/www/mywebsite.com/myproject> <Files wsgi.py> Order deny,allow Allow from All </Files> </Directory> |
这样,如果搞砸了Apache配置,则可以减少他人下载您的代码和设置文件的风险。
以及您在哪里:
1 2 3 4 | <Directory /var/www/empirik/data/www/mywebsite.com/myproject/static> Order deny,allow Allow from all </Directory> |
您似乎缺少相应的内容:
1 | Alias /media /var/www/empirik/data/www/mywebsite.com/myproject/static |
如果您没有静态媒体目录的别名,则Apache将不在该目录中提供文件。
最后,由于您要强制使用守护程序模式并希望避免使用嵌入式模式,请设置:
1 | WSGIRestrictedEmbedded On |
这样,如果您搞砸了配置,并且错误地以当前状态运行在嵌入式模式下,则会出现错误。
由于在全局上为所有虚拟主机设置了
似乎您没有正确设置
希望有帮助。