我有一些小的django项目使用apache和mod_wsgi在同一台服务器上工作。我安装了另一个带有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>
当我尝试加载网站服务器返回500错误或其他网站的内容大约50%时,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
另一个问题是为什么它仍然使用默认系统python但不是来自virtualenv?请帮忙!
答案 0 :(得分:1)
由于全局为所有虚拟主机设置了WSGIPythonHome
,因此不能在同一个apache下使用不同的python可执行文件(请参阅docs)。如果未设置WSGIPythonHome
- mod_wsgi将使用system python。
好像你没有正确设置wsgi.py
。您在wsgi.py
中的目标是正确操作sys.path,以便您的项目所需的所有内容都可用。当我遇到同样的问题时,这就是帮助我的原因:apache server not using proper virtualenv with WSGI setting。
希望有所帮助。
答案 1 :(得分:1)
您的配置丢失了:
WSGIProcessGroup mywebsite.com
如果没有它,您的WSGI应用程序甚至不会被委派给守护进程组。您可以查看:
一旦正确使用了守护程序模式,只要使用mod_wsgi 3.4,就可以使用以下命令为该特定守护程序进程组设置Python home:
WSGIDaemonProcess mywebsite.com python-home=/var/www/empirik/data/www/mywebsite.com/env
通过这种方式,您可以简单地指向Python虚拟环境的根目录,然后将其拾取。
你仍然需要指定python-path选项以及Django项目的父目录,这样才能找到它和设置模块,这就是你遇到的问题。因此你可能想要:
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
这样一来,如果你搞砸了配置,并且你现在错误地以嵌入模式运行,你就会收到错误。