Dreamhost上使用Passenger的Django:浏览器无响应,无错误

4 投票
4 回答
1589 浏览
提问于 2025-04-16 07:28

我正在尝试在我的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 个回答

0

我同意Ben和Chris的看法,DH的共享环境确实不适合用来做比较大的项目。不过,听说超时是根据最后一次加载来决定的,所以如果你的应用有稳定的访问量,理论上来说,它应该能正常运行。:)

不管怎样,我经常用DH的共享Passenger来做概念验证,效果很好,而且价格也很划算。

关于你的问题,Passenger在捕捉和解析Rails错误方面做得不错,但你用的实验性WSGI实现对于Django来说,当出现异常时就会崩溃。一个解决办法是运行一些中间件,捕捉到错误后,把它们以漂亮的格式传递给Passenger。

想了解更多细节和示例,可以查看这个链接: http://wiki.dreamhost.com/Passenger_WSGI#500_Errors_with_Passenger_WSGI_Workaround

1

我成功地为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

现在,当你遇到异常时,你会看到一个像这样的页面:

Werkzeug Debugger Output

1

我放弃在Dreamhost上使用Django,因为他们的服务器会定时强制关闭任何wsgi进程。这样一来,每次新的请求都得重新启动一个新的实例,这就导致我的查询有时候需要10到15秒才能完成。对于大多数人来说,这样的等待时间足够让他们觉得网站崩溃了,然后就放弃了。

这可能不是你遇到的具体问题,但我想即使你的网站能正常工作,你也不会太高兴。

撰写回答