排查Dreamhost + Passenger + Django问题

3 投票
2 回答
812 浏览
提问于 2025-04-18 06:55

我有一个网站,之前在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 来重启Passenger,结果好像没用。有没有什么办法可以帮我排查一下问题?

提前谢谢你们。

编辑 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年5月15日更新的,但所有这些辅助脚本的日期都是2013年10月26日。难道是这些辅助脚本和新安装的Passenger版本不兼容?我原以为Passenger本身是与语言无关的呢?

编辑 3: 被忽略的virtualenv

系统安装的Python版本是2.5.2,但我在virtualenv中构建应用程序时使用的是2.6.8。所以这个错误本来就不应该出现。我按照说明添加了我的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 个回答

1

我在Phusion Passenger的讨论组里问了同样的问题,Hongli也在那边回答了我(谢谢你,Hongli!!):

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

Dreamhost的文档已经过时了,他们的支持团队对Phusion Passenger的配置和问题了解得不够。

结果发现,Passenger至少需要Python 2.6才能启动(如果你是用它来运行Python应用或像Django这样的框架),而且是在加载你在passenger_wsgi.py文件中定义的virtualenv 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解释器来启动。好了!- 你的网络服务器又可以运行了。

Phusion Passenger Nginx网页中的相关链接

2

看起来你正在使用的是Python 2.5或更早的版本,这个版本不支持字节字符串的声明方式。Phusion Passenger 需要Python 2.6或更新的版本

撰写回答