来自 nginx / 乘客的“从应用程序收到不完整的响应”

Posted

技术标签:

【中文标题】来自 nginx / 乘客的“从应用程序收到不完整的响应”【英文标题】:"Incomplete response received from application" from nginx / passenger 【发布时间】:2015-05-28 06:16:18 【问题描述】:

我尝试通过 capistrano 在 nginx 和 ubuntu 上部署我的 rails 应用程序,就像页面 https://gorails.com/deploy/ubuntu/14.04 上的教程一样。 但最后我收到一条错误消息:

Incomplete response received from application

在我的浏览器中。 这可能是乘客的错误,但我怎么知道该怎么做?

【问题讨论】:

你试过设置passenger_buffer_response off;吗? ***.com/q/11738924/1454117 @Avilyn 乘客作者在这里。 passenger_buffer_response_off 与他的问题无关,也无济于事。很久以前,响应缓冲代码中存在一个错误,但该错误早已修复,因此您发布的 *** 帖子中的解决方案不再适用。 @Hongli 感谢您的澄清。 你好,我修好了。这是因为在本教程中,他们错过了在 secrets.yml 中有一个“” 的环境变量! 【参考方案1】:

您的 rails_env 产品不需要设置,可能缺少 secret_key_base。

打开/etc/nginx/sites-available/default,把rails_env改成开发:

rails_env production;
        to
rails_env development;

如果应用正在加载,则不是乘客问题。 生产解决方案:

    输入您的应用根目录 运行:rake secret 复制输出 转到/yourapp/config/secrets.yml 设置生产secret_key_base

重启乘客应用:

touch /yourapp/tmp/restart.txt

【讨论】:

你好,我在我的 vserver ~/.bashrc 中设置了 : export SECRET_KEY_BASE=12345678910111212andmore 很想投反对票... config/secrets.yml 说do not keep production secrets in the repository, instead read values from the environment 这真的取决于你有多聪明:) 您可以使用 secrets.yml 并将其添加到 .gitignore 文件中,这样它就永远不会填充到您的 git 提供程序中,或者您可以使用 ENV 变量,我正在使用这两种技术和一切美好的。如果您的服务器被黑客入侵并且黑客将访问您的系统,那么您将密钥存储在哪里真的无关紧要:) 我已经这样做了,但我仍然无法克服错误,我也在关注链接的教程。我什至验证它作为开发加载正常【参考方案2】:

出现此错误是因为您没有设置 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

【讨论】:

【参考方案3】:

我在周末遇到了这个问题(结果证明我的乘客版本和 ruby​​ 版本不兼容)。

但是,似乎没有人提及:实际错误可能出现在 /var/log/apache2/errors.log 中,而不是任何自定义日志中。

一旦你知道了,希望你的搜索会更容易!


更新,因为我需要再次参考这个 - 这也适用于 nginx - /var/log/nginx/error.log 在这种情况下是你的朋友!

【讨论】:

【参考方案4】:

对于那些使用乘客:

• 导航到项目的根目录。

• 运行bundle exec rake secret RAILS_ENV=production

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

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

• 按CNTRL+X,然后按y,然后点击enter

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

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

【讨论】:

【参考方案5】:

就我而言,这是因为我的服务器间歇性地耗尽内存(在 PDF 生成期间)。生成 PDF 后,一些 RAM 被恢复并且错误将消失。

我有一个 500M 内存的 ubuntu 服务器。

我added some swap space 这个错误消失了。

【讨论】:

【参考方案6】:

可能是我的回答离题了,但是当我的数据库mysql 服务器没有运行时,我也遇到了这个错误。以防万一有人遇到同样的错误。

所以start/restart您的数据库可能是另一个答案。

【讨论】:

【参考方案7】:

这意味着您的 rails 应用程序在实际使用 rails 之前就已经崩溃了。这可能是中间件中的一个例外,缺少 ENV 密钥,在操作系统级别。

尝试先在本地启动应用程序,然后执行您在生产中遇到错误时所做的操作。如果一切正常,请检查所有日志。检查 nginx 日志、您的乘客日志,最后检查任何其他与启动和运行您的应用有关的操作系统特定日志。

【讨论】:

【参考方案8】:

有没有像我这样上传文件后出现这个错误的人?

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

只需将其删除,然后再次上传文件。

祝你好运~

【讨论】:

【参考方案9】:

我得到了这个,只在我的测试服务器上而不是在生产环境中,因为我请求的 URL 不存在,我猜在测试环境中,Rails 抛出错误而不是返回 404 响应。

【讨论】:

以上是关于来自 nginx / 乘客的“从应用程序收到不完整的响应”的主要内容,如果未能解决你的问题,请参考以下文章

nginx + 乘客 + phpmyadmin = 拒绝访问

nginx + 乘客 + rails - 403 禁止错误

乘客不为服务器块内的位置块工作

Nginx 和乘客依赖问题(数字海洋部署)

可以在不重启的情况下使用 nginx 乘客登录 rails 应用程序吗?

ruby Capistrano 2为乘客提供Nginx的部署脚本