nginx / passenger 报错:"Incomplete response received from application"。

70

我尝试按照页面https://gorails.com/deploy/ubuntu/14.04上的指南,通过Capistrano在Nginx和Ubuntu上部署我的Rails应用程序。 但是最后我收到了一个错误消息:

Incomplete response received from application

在我的浏览器中出现了问题。这可能是由于Passenger引起的,但我应该怎么办才能弄清楚该做什么?


你尝试过设置 passenger_buffer_response off; 吗?https://dev59.com/Y2bWa4cB1Zd3GeqPZ7wl - user1454117
9
我是一名乘客作者。 passenger_buffer_response_off 与他的问题无关,也无法解决问题。很久以前,响应缓冲代码中存在一个错误,但该错误已经被修复了,因此您在 StackOverflow 上发布的帖子中提到的解决方案不再适用。 - Hongli
@Hongli 感谢澄清。 - user1454117
3
你好,我已经修复了。问题是在教程中他们忘记在 secrets.yml 中添加 "<%= ENV["SECRET_KEY_BASE"] %>" 的环境变量。 - juicy
9个回答

130

您的rails_env生产环境没有必要的设置,可能缺少secret_key_base。

打开/etc/nginx/sites-available/default,并将rails_env更改为development:

rails_env production;
        to
rails_env development;

如果应用正在加载,则不是乘客的问题。

生产解决方案:

  1. 进入您的应用根目录
  2. 运行:rake secret
  3. 复制输出内容
  4. 转到/yourapp/config/secrets.yml
  5. 设置生产环境下的secret_key_base

重新启动乘客应用程序:

touch /yourapp/tmp/restart.txt

4
你好,我在我的虚拟服务器的~/.bashrc文件中设置了<%= ENV["SECRET_KEY_BASE"] %>:export SECRET_KEY_BASE=12345678910111212andmore - juicy
7
有点想要踩一下那个...config/secrets.yml里说“不要把生产密钥存放在代码库中,而是从环境变量中读取值”。 - Matthew Turner
3
这实际上取决于你的智商有多高 :) - Yaniv Vova Alterman
9
你可以使用 secrets.yml,并将其添加到 .gitignore 文件中,这样它就永远不会被推送到你的 git 提供商,或者你可以使用环境变量。我同时使用这两种技术,一切正常。 如果你的服务器被黑客攻击并且入侵者已经访问了你的系统,那么存储密钥的位置就无关紧要了 :) - Yaniv Vova Alterman
我已经尝试过这个方法,但仍然无法解决错误。我也在按照链接的教程进行操作。我甚至验证了它作为开发工具的加载情况。 - Joe Sak
你能把你的配置文件发给我吗? 我强烈建议放弃Passenger,转而使用Nginx + Puma,这样设置会更好 :) - Yaniv Vova Alterman

25

这个错误是因为您没有设置 secret_key_base 导致的。按照以下步骤修复它:

进入您的 Rails 应用程序目录

cd /path/rails-app

生成秘密密钥基础

rake secret RAILS_ENV=production

设置环境变量

SECRET_KEY_BASE=<the-secret-key-base>

重启 Rails 应用程序

touch /path/rails-app/tmp/restart.txt

6
我在周末遇到了这个问题(后来发现我的乘客和Ruby版本不兼容)。
然而,似乎没有人提到:实际错误可能出现在 /var/log/apache2/errors.log 中,而不是任何自定义日志中。
一旦你知道了这一点,希望你的搜索会更容易!
更新,因为我需要再次参考这个 - 这对于nginx也是正确的 - 在那种情况下,/var/log/nginx/error.log 是你的朋友!

5

对于使用Passenger的用户:

• 导航到您项目的根目录。

• 运行bundle exec rake secret RAILS_ENV=production

• 复制输出,然后运行sudo nano config/secrets.yml

• 在production下,用最近复制的rake secret替换secret_key_base的值。

• 按CNTRL+X,然后按y,最后按enter

• 运行passenger-config restart-app并选择要重新启动的应用程序。

https://www.phusionpassenger.com/library/admin/apache/restart_app.html


4
在我的情况下,这是因为我的服务器在生成PDF时间断性地耗尽了RAM。一旦PDF生成完成,一些RAM就会被恢复,错误就会消失。
我使用的是拥有500M RAM的Ubuntu服务器。
增加了一些交换空间,这个错误就消失了。

1
也许我的回答与主题无关,但当我的数据库 mysql 服务器未运行时,我也遇到了这个错误。以防万一有人遇到相同的错误,请尝试 启动/重启 数据库。

1
这意味着在真正进入Rails之前,您的Rails应用程序就崩溃了。这可能是中间件中的异常、缺失的ENV键、操作系统级别的问题等。请先尝试在本地启动应用程序,并执行在生产环境中导致错误的操作。如果一切正常,请检查所有日志。检查nginx日志、Passenger日志,最后再检查任何与启动和运行应用程序有关的其他操作系统特定的日志。

0

有没有像我一样在上传文件后遇到这个错误的人?

我的解决方案是检查文件名,可能包含一些特殊字符,如`[(~

只需将其删除,然后重新上传文件即可。

祝好运~


0

我在测试服务器上遇到了这个问题,而在生产环境中没有出现过。原因是我请求了一个不存在的URL,在测试环境下,Rails会抛出一个错误而不是返回404响应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接