使用乘客部署Django应用程序

时间:2011-08-24 15:37:46

标签: django passenger dreamhost

我可以浏览他们维基上的所有内容 - 然后我迷失了。 http://wiki.dreamhost.com/Django

我有一个空白的Django模板,每当我尝试更改任何内容时,我都会收到500内部服务器错误。

我已经在本地完全开发了我的django应用程序并且只想在线托管它 - 认为它很容易,但我慢慢地知道它不是。

我将我的应用程序“视频”上传到此目录,然后将其放入已安装的应用程序并运行“python manage.py syncdb”,它找不到任何固定装置(我发现它很奇怪)。

从那里,它只会收到内部服务器错误。

以下是我收到的错误:http://tweettune.com/,这是错误日志:

[Wed Aug 24 01:49:15 2011] [error] [client 66.212.30.122] Premature end of script headers:
[Wed Aug 24 01:49:15 2011] [error] [client 66.212.30.122] Premature end of script headers: internal_error.html
[Wed Aug 24 08:16:40 2011] [error] [client 99.229.160.94] Premature end of script headers:
[Wed Aug 24 08:16:41 2011] [error] [client 99.229.160.94] Premature end of script headers: internal_error.html
[Wed Aug 24 08:21:38 2011] [error] [client 99.229.160.94] Premature end of script headers:
[Wed Aug 24 08:21:38 2011] [error] [client 99.229.160.94] Premature end of script headers: internal_error.html
[Wed Aug 24 08:27:41 2011] [error] [client 99.229.160.94] Premature end of script headers:
[Wed Aug 24 08:27:41 2011] [error] [client 99.229.160.94] Premature end of script headers: internal_error.html

我现在已经尝试了6个小时,无法弄清楚我做错了什么。我想我根本不了解如何部署应用程序 - 我现在的思考过程是采用我本地托管的应用程序并在线替换默认django模板中的所有文件。我不明白为什么这不起作用,但事实并非如此。我在passenger_wdgi文件中使用此代码尝试了“hello world app”示例,它可以正常运行...

def application(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')])
    return ["Hello, world!"]

任何方向都会有所帮助。

编辑:以下是我的passenger_wsgi.py文件的内容,这可能会有所帮助(虽然它是由dreamhost自动生成的......所以认为它是正确的。)

import sys, os
sys.path.append(os.getcwd())
os.environ['DJANGO_SETTINGS_MODULE'] = "sotd.settings"
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
project_path='/home/tweettune.com/sotd/'
sys.path.insert(1, project_path)

4 个答案:

答案 0 :(得分:7)

我遇到了同样的问题。 解决方案是在wsgi_passenger.py

中添加我的应用程序的文件夹
import sys, os
sys.path.append(os.getcwd())
sys.path.append(os.path.join(os.getcwd(), 'include your apps folder here'))
os.environ['DJANGO_SETTINGS_MODULE'] = "cpc.settings"
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

此链接对我非常有用: http://discussion.dreamhost.com/thread-128918.html

答案 1 :(得分:7)

如果使用django> 1.7则用

替换最后两行
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

答案 2 :(得分:1)

如果没有看到您的设置,很难确切地知道您做错了什么。我按照说明操作,并没有那么难。

调试应用程序可以做的一件事就是运行manage.py.它将无法绑定到套接字(如果有,它将在几分钟后自动启动),但这至少会显示是否存在阻止您的应用运行的其他问题。

还有一点需要注意:该文件名为passenger_wsgi.py,应该存在于您的站点根目录中。例如,我有~/testing.tustincommercial.com/passenger_wsgi.py,我的所有项目代码都在~/testing.tustincommercial.com/oneclickcos下。我的静态内容位于~/testing.tustincommercial.com/public下。

安装一些错误处理中间件会有所帮助,这样错误就不会一直传播给乘客,从而引发500错误。

我的wsgi_passenger.py是:

import sys, os, re
cwd = os.getcwd()
sys.path.append(os.getcwd())

#add all installed eggs to path
for x in ['/home/marcintustin/django/'+x for x in os.listdir('/home/marcintustin/django/') if re.search('egg$', x)]:
    sys.path.insert(0,x)

sys.path.insert(0,'/home/marcintustin/django')
sys.path.insert(0,'/home/marcintustin/django/Django-1.3')
sys.path.insert(0,'/home/marcintustin/django/Paste-1.7.5.1-py2.5.egg')
sys.path.insert(0,'/home/marcintustin/django/South-0.7.3-py2.5.egg')
sys.path.insert(0,'/home/marcintustin/django/Werkzeug-0.6.2-py2.5.egg')

myapp_directory = cwd + '/oneclickcos'
sys.stdout = sys.stderr
sys.path.insert(0,myapp_directory)
sys.path.append(os.getcwd())

os.environ['DJANGO_SETTINGS_MODULE'] = "oneclickcos.settings"
import django.core.handlers.wsgi
#from paste.exceptions.errormiddleware import ErrorMiddleware
from werkzeug.debug import DebuggedApplication
from django.core.servers.basehttp import run, AdminMediaHandler, WSGIServerException

application = django.core.handlers.wsgi.WSGIHandler()
handler = AdminMediaHandler(application, '/home/marcintustin/testing.tustincommercial.com/public/static/admin')
application = DebuggedApplication(handler, evalex=True)

这有很多东西,其中大部分都不是绝对必要的 - 顶部的所有东西都是为了确保我安装的库是可用的。底部的东西安装中间件。你可能最好使用paste.exceptions.errormiddleware.ErrorMiddleware,除非werkzeug调试器适合你(在Dreamhost上它对我不起作用)。

编辑:我认为您的配置错误。请转到保存项目的目录,并使用pwd获取完整路径。我想你会发现你没有正确的道路。

答案 3 :(得分:0)

我遇到了完全相同的问题。这里的答案让我朝着正确的方向前进,谢谢。我使用virtualenv和我的django应用程序,os.getcwd()为我做了。

import os, sys

#Fix for passenger
INTERP = "/var/webapps/myapp_env/bin/python"
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)
sys.path.append(os.getcwd())
#

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()