Dreamhost + Passenger + Django故障排除

时间:2014-05-18 17:55:12

标签: python django nginx passenger dreamhost

我有一个网站,很高兴在Dreamhost + Passenger + Django上运行了好几年。最近(上周四)看起来Dreamhost更新了Passenger而没有通知我,这导致网站瘫痪。

以下是已安装(托管)的Passenger目录:

$ pwd
/dh/nginx/passenger
$ ls -la
total 32
drwxr-xr-x 12 root root 4096 2014-05-15 13:40 .
drwxr-xr-x  6 root root   76 2012-06-27 17:54 ..
-rw-r--r--  1 root root 1056 2013-10-26 15:00 LICENSE
drwxr-xr-x  2 root root 4096 2014-05-15 13:40 bin
drwxr-xr-x  7 root root   92 2014-05-15 13:40 buildout
drwxr-xr-x  2 root root 4096 2014-05-15 13:40 dev
drwxr-xr-x  5 root root 4096 2014-05-15 13:40 doc
drwxr-xr-x 10 root root  139 2014-05-15 13:40 ext
drwxr-xr-x  3 root root 4096 2014-05-15 13:40 helper-scripts
drwxr-xr-x  3 root root   69 2014-05-15 13:40 lib
drwxr-xr-x  2 root root  137 2014-05-15 13:40 man
drwxr-xr-x  3 root root   38 2014-05-15 13:40 node_lib
-rw-r--r--  1 root root 1243 2013-10-26 15:00 passenger.gemspec
drwxr-xr-x  4 root root 4096 2014-05-15 13:40 resources

这些文件更新大致与网站停机时间有关。

我认为这可能是touch - /path/to/app/tmp/restart.txt重启乘客的一个简单案例,但这似乎没有用。我有什么想法可以解决这个问题吗?

提前致谢。

编辑1:网络服务器是Nginx。我假设我可以重新加载Nginx,那将通过Passenger刷新所有连接?

sudo /etc/init.d/nginx reload

编辑2 :引发错误的相关文件是:

/dh/nginx/passenger/helper-scripts/wsgi-loader.py

错误:

File "/dh/nginx/passenger/helper-scripts/wsgi-loader.py", line 171
    buf = b''
            ^

SyntaxError: invalid syntax

有趣的是,虽然看起来Passenger在2014-05-15更新了,但所有这些助手脚本可以追溯到2013-10-26。这些辅助脚本是否与新安装的Passenger版本过时一样简单?我原以为乘客本身与语言无关?

修改3 virtualenv被忽略

因此,系统安装的Python版本是2.5.2,但是我构建应用程序的virtualenv Python是2.6.8。所以这个错误甚至不应该出现。我按照instructions添加了我的2.6.8 Python解释器,但它仍然无效,错误消息仍然表明正在使用旧的Python解释器。有什么想法吗?

编辑4:正在使用正确(且有效)的virtualenv Python解释器(2.6.8)

import sys, os
INTERP = "/home/<user>/venv/tcs/bin/python2.6"
if sys.executable != INTERP: os.execl(INTERP, INTERP, *sys.argv)
# print(sys.version)
sys.path.append(os.getcwd())
sys.path.append(os.path.join(os.getcwd(), '/home/<user>/<application>/<dir>'))
os.environ['DJANGO_SETTINGS_MODULE'] = "project.settings"
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

(<user>, <application> and <dir> hidden for obvious reasons)

当我取消注释print(sys.version)时,我得到以下输出:

2.6.8 (unknown, Jul 10 2012, 08:03:16)
[GCC 4.3.2]

2 个答案:

答案 0 :(得分:2)

看起来您正在运行Python 2.5或更早版本,它不支持字节字符串声明语法。 Phusion Passenger requires Python 2.6 or later

答案 1 :(得分:1)

我在Phusion Passenger列表上问了同样的问题,Hongli也在那里回答了我(感谢Hongli !!):

https://groups.google.com/forum/#!topic/phusion-passenger/cYBgUPX_ICA

Dreamhost的文档已过时,他们的支持团队并不精通Phusion Passenger配置/问题。

事实证明,Passenger还需要至少Python 2.6才能甚至启动(如果您将它用于Python应用程序或Django等框架),之前加载您virtualenv文件中定义的passenger_wsgi.py Python解释器。要实现这一点,您需要修改Nginx的配置方式......

编辑您的Nginx配置文件(nginx.conf)并添加以下行:

http {
    passenger_root ...;

    # Use Python 2.6 by default.
    passenger_python /home/<user>/venv/<venv-name>/bin/python2.6;


    server {
        <snip>
    }
}

这会强制Passenger在passenger_python中使用定义的 Python解释器来启动。瞧! - 再次运行网络服务器。

Relevant anchor in the Phusion Passenger Nginx webpage