开发者

Django on Dreamhost with Passenger: no response to browsers, no error

I'm trying to get some trivial Django to run on my dreamhost account. I did do my homework before choosing Dreamhost, but only recently decided to try Django.

Anyhow, I have a trivial app that I want to run under something.mydomain.com. Passenger is enabled.

When I visit a static page, it loads fine, out of ~/something.mydomain.com/public/. When I visit any other page (such as something.mydomain.com/admin), the url should be handled by my Django app.

This is where I get stuck; the page doesn't load and it doesn't throw an error. It keeps trying to load forever (no timeout yet). I don't know much about the logs; I haven't found anything myself.

My guess is the passenger_wsgi.py in ~/something.mydomain.com/ is faulty. I have tried different versions.

This passenger gives the… freeze? described above

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()

This passenger happily "Hello, world!"s me

import sys, os, django
sys.path.append("/home/m开发者_开发知识库e/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!"]

So I'm inclined to believe something about WSGIHandler() isn't properly accomodated.

I tried this in a python shell:

>>> import django

and it gave no errors.

What now?


I gave up on using Django on Dreamhost because their server forcibly kills any wsgi process on a timed basis. After that a new request has to start a new instance, which in my case meant that queries sometimes took 10-15s. It was more than enough time for most people to assume the site was down and give up.

This might not be your particular problem, but I expect you will not be happy even if you do get your site working.


I was able to get a good debug setup for WSGI app using Werkzeug module. I think this can also be integrated with Django.

First, I'll assume you setup your python virtualenv in your home directory under ~/env and is active.

Second, install the werkzeug-debugger-appengine functions, to patch the werkzeug debugger.

cd ~
mkdir src
cd src
git clone https://github.com/nshah/werkzeug-debugger-appengine.git
cd werkzeug-debugger-appengine
python setup.py install

The final step is to setup your passenger_wsgi.py file:

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)

Don't forget to force passenger to restart:

touch ~/domain.com/tmp/restart.txt

Now, when you hit an exception, you'll get a page that looks like this:

Django on Dreamhost with Passenger: no response to browsers, no error


I agree with Ben and Chris, in that DH shared env is definitely not suitable for serving larger projects. Afaik, however, the timeout is based on last load, so if you have a steady stream your app should -in theory!- run fine. :)

Anyway, I use DH's shared Passenger for proof of concept a lot, and there is serves well, for a very good price.

About your issue - Passenger is doing a good job catching and parsing Rails errors, but the experimental WSGI implementation you use for Django dies when an exception is raised. A workaround is to run some middleware, that catches the error and passes it on nicely rendered to Passenger.

Read for more details and an example: http://wiki.dreamhost.com/Passenger_WSGI#500_Errors_with_Passenger_WSGI_Workaround


I had a series of problems similar to this on DH originally. I ended up building my own Python to use instead of theirs and haven't had any problems since.

Setup some paths:

echo 'PATH="$HOME/bin:$PATH"' >> ~/.bash_profile
echo 'LD_LIBRARY_PATH=$HOME/lib/' >> ~/.bash_profile
source ~/.bash_profile 

Install Python:

wget http://python.org/ftp/python/2.7/Python-2.7.tgz
tar -xzvf Python-2.7.tgz
rm Python-2.7.tgz
cd Python-2.7
./configure --prefix=${HOME}
make
make install
cd ..
rm -rf Python-2.7 

and to adjust your WSGI handler:

import sys, os
INTERP = "/home/example_user/bin/python"
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)
sys.path.append("/home/example_user/example.com")
os.environ["DJANGO_SETTINGS_MODULE"] = "example_project.settings"
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜