【问题标题】:Troubleshooting Dreamhost + Passenger + DjangoDreamhost + 乘客 + Django 故障排除
【发布时间】:2014-07-06 16:00:54
【问题描述】:

我有一个网站在 Dreamhost + Passenger + Django 上运行了好几年。最近(上周四),Dreamhost 似乎在没有通知我的情况下更新了乘客,这导致网站宕机。

这是已安装(托管)的乘客目录:

$ 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-ing /path/to/app/tmp/restart.txt 重新启动Passenger 的简单案例,但这似乎不起作用。有什么想法可以解决这个问题吗?

提前致谢。

编辑 1: Web 服务器是 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我构建应用程序的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]

【问题讨论】:

  • 感谢您发布此信息,我遇到了一个非常相似的问题。顺便问一下,你的错误信息是什么?
  • 我发布了我在 Edit 2 中遇到的错误消息
  • Edit 3 中添加了有关我的 virtualenv Python (2.6.8) 的更多信息,这应该是正在使用的那个
  • 我收到 Dreamhost 的回复:“新版本的乘客重定向 STDOUT 会导致错误,因为乘客使用该输出来跟踪流程。”他们在我的 WSGI 处理程序脚本中注释了 #sys.stdout=sys.stderr 行,并修复了错误。不确定这是否适合您的情况,但希望对您有所帮助。

标签: python django nginx passenger dreamhost


【解决方案1】:

我在 Phusion 乘客名单上问了同样的问题,宏利也在那里回答了我(感谢宏利!!):

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 解释器来启动。瞧! - 再次运行网络服务器。

Relevant anchor in the Phusion Passenger Nginx webpage

【讨论】:

    【解决方案2】:

    您运行的似乎是 Python 2.5 或更早版本,它不支持字节字符串声明语法。 Phusion 乘客requires Python 2.6 or later.

    【讨论】:

    • 谢谢!我收到了 Dreamhost 人员发来的电子邮件,说明了这一点。
    • 嗯。我在virtualenv 中为该网站运行的 Python 版本是 2.6.8。我已按照instructions 添加虚拟主机 Python 解释器,但它仍然失败。有任何想法吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2010-11-30
    • 2021-09-11
    • 2012-02-18
    相关资源
    最近更新 更多