Rails Rails 3.2.17 下遇到的一个坑

martin91 · 2014年04月22日 · 最后由 Kevin_wang 回复于 2015年02月10日 · 3095 次阅读

今天做项目的过程遇到一个坑,一部署到远程服务器就报 Apache 500: Premature end of script headers,服务器是 Apache+Passenger。本地开启生产跟开发环境都能够正常运行。最后排查后发现是 controller 文件里包含了中文,但是文件开头没有写明# encoding: utf-8。最后加上 encoding 后重新部署就解决问题了。

为什么 Rails 没报异常,Apache 却报了呢?搜了很久都没有找到能够解释这个问题的帖子,哪位同学能够赐教一下?

Ruby 版本

远程服务器 Ruby 版本 1.9?

因为你是有 Passenger 跑了 ruby,Passenger 是挂载在 apache 上。。。纯属猜测。

直接上 ruby2.0 就没问题了

#1 楼 @Rei #2 楼 @lonre 服务器上是 1.9.3,本地是 2.0。我再从这个方面去找找有没有相关的描述。谢谢了。

#3 楼 @ruby_sky Passenger 是有自己的异常报错页面的。

#4 楼 @lyfi2003 应该是 ok 的,但是服务器上还有很多其他的项目,牵一发而动全身。而且 Passenger 如果是支持多 Ruby 版本的话,应该也费劲吧

#5 楼 @Martin91 Ruby 2.0 的默认编码是 UTF-8 的,所以没问题,而 1.9 不是

#6 楼 @lonre 谢谢,这个知道,但是还是想要了解在这种情况下,Rails 跟 Apache 之间是怎么搞基最后弄了个 500 的。

#7 楼 @Martin91 你说的“为什么 Rails 没报异常”,是指你本地开生产环境测试?可是你本地的 Ruby 版本还是 2.0 啊?

#8 楼 @lonre 不是啊,说的是服务器上 Rails 没有报 500。

#9 楼 @Martin91 哦,明白你的意思了。

#10 楼 @lonre 我的猜想是 Apache 把请求转给了 Ruby,但是 Ruby 发现了 Encoding Error,然后输出一大堆乱七八糟的错误信息,破坏了 response 的结构,或者是因为异常退出运行,导致 Apache 接收到了不完整的 response 或者根本没有接收到 response,所以是 Apache 报的 500: Premature end of script headers

#11 楼 @Martin91 但问题是:你是如何确定 Rails 没报异常?我没有用过 Passenger,不过你是用的 socks 还是 tcp 方式?

Apache 只是个代理服务器而已,只是做请求转发,大部分情况状态还是根据后端确定的吧。

#12 楼 @lonre 这也是我想弄明白的。

#13 楼 @Martin91 如果 1.9.3 的环境下,代码中包含中文,production 环境启动应该直接失败呢

我这边的情况是,如果代码里有中文,开发环境 webrick or thin 不加 utf8 直接就 500 了 不懂为何开发没问题,去了 apache 才有问题 = =

@Martin91 @rainchen 大神是不是回去筹备婚礼去了.. 然后你最终选择来发帖了?

不知道呢

#18 楼 @chankaward 啊?我不懂啊?

把这里的配置文件修改下试试 config/secrets.yml 执行 rake secret 获取 secret_key_base

需要 登录 后方可回复, 如果你还没有账号请 注册新账号