Dreamhost上使用Passenger的Django:浏览器无响应,无错误
我正在尝试在我的Dreamhost账户上运行一些简单的Django应用。选择Dreamhost之前我做了一些功课,但最近才决定尝试Django。
总之,我有一个简单的应用想要在something.mydomain.com上运行。Passenger功能已经启用。
当我访问一个静态页面时,它可以正常加载,路径是~/something.mydomain.com/public/。但是当我访问其他页面(比如something.mydomain.com/admin)时,应该由我的Django应用来处理这个网址。
这就是我遇到问题的地方;页面不加载,也没有报错。它一直在尝试加载,没有超时。我对日志了解不多,自己也没有找到任何信息。
我猜~/something.mydomain.com/里的passenger_wsgi.py可能有问题。我尝试了不同的版本。
这个Passenger让我遇到了上面描述的…卡住的情况
import sys, os, django
sys.path.append("/home/me/something.mydomain.com/")
os.environ['DJANGO_SETTINGS_MODULE'] = 'something.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
这个Passenger却能让我看到“Hello, world!”
import sys, os, django
sys.path.append("/home/me/something.mydomain.com/")
os.environ['DJANGO_SETTINGS_MODULE'] = 'something.settings'
def application(environ, start_response):
write = start_response('200 OK', [('Content-type', 'text/plain')])
return ["Hello, world!"]
所以我倾向于相信WSGIHandler()的某些地方没有正确处理。
我在Python命令行中尝试了这个:
>>> import django
结果没有报错。
接下来该怎么办呢?
4 个回答
我同意Ben和Chris的看法,DH的共享环境确实不适合用来做比较大的项目。不过,听说超时是根据最后一次加载来决定的,所以如果你的应用有稳定的访问量,理论上来说,它应该能正常运行。:)
不管怎样,我经常用DH的共享Passenger来做概念验证,效果很好,而且价格也很划算。
关于你的问题,Passenger在捕捉和解析Rails错误方面做得不错,但你用的实验性WSGI实现对于Django来说,当出现异常时就会崩溃。一个解决办法是运行一些中间件,捕捉到错误后,把它们以漂亮的格式传递给Passenger。
想了解更多细节和示例,可以查看这个链接: http://wiki.dreamhost.com/Passenger_WSGI#500_Errors_with_Passenger_WSGI_Workaround
我成功地为WSGI应用程序设置了一个很好的调试环境,使用的是Werkzeug模块。我觉得这个也可以和Django结合使用。
首先,我假设你在自己的主目录下设置了Python的虚拟环境,路径是~/env
,并且这个环境是激活状态。
其次,安装werkzeug-debugger-appengine功能,以修补werkzeug调试器。
cd ~
mkdir src
cd src
git clone https://github.com/nshah/werkzeug-debugger-appengine.git
cd werkzeug-debugger-appengine
python setup.py install
最后一步是设置你的passenger_wsgi.py
文件:
import sys, os
DEBUG = True
ROOT = os.path.dirname(os.path.abspath(__file__))
INTERP = '/home/HOMEDIR/env/bin/python'
sys.path.insert(1,ROOT) # for when your app is in your web dir
if sys.executable != INTERP:
os.execl(INTERP, INTERP, *sys.argv)
from myapp import app as application
if DEBUG:
application.debug=True
from werkzeug_debugger_appengine import get_debugged_app
application = get_debugged_app(application)
别忘了强制让passenger重启:
touch ~/domain.com/tmp/restart.txt
现在,当你遇到异常时,你会看到一个像这样的页面:
我放弃在Dreamhost上使用Django,因为他们的服务器会定时强制关闭任何wsgi进程。这样一来,每次新的请求都得重新启动一个新的实例,这就导致我的查询有时候需要10到15秒才能完成。对于大多数人来说,这样的等待时间足够让他们觉得网站崩溃了,然后就放弃了。
这可能不是你遇到的具体问题,但我想即使你的网站能正常工作,你也不会太高兴。