【问题标题】:Timeout in Production but not in Local Rails生产超时但本地 Rails 不超时
【发布时间】:2017-11-16 10:10:17
【问题描述】:

我正在开发一个 Rails 应用程序。

在一个视图中,我制作了一个表单,使用 remote: true 将动作发送到 AJAX 中的控制器

<%= form_tag({controller: "my_controller", action: "my_method"}, {remote: true}) do %>

一切正常,但控制器可能需要一段时间来计算结果(有时超过 100 秒)。

我面临的问题是在本地环境中它工作正常,但在生产环境中,我收到 ERROR 504 GATEWAY_TIMEOUT

有没有办法让它在生产中工作?

【问题讨论】:

  • 您可能应该使用诸如sidekiq 或delayed_job 之类的东西将该功能置于后台作业之后。这就是他们的全部目的。
  • 您的生产服务器堆栈是什么?
  • 这是一个 Puma + Nginx + PostgreSQL

标签: ruby-on-rails ajax forms timeout


【解决方案1】:

这可能是由于您的 Rails 服务器前面的负载均衡器(可能是 apache 或 nginx)导致响应超时,因为它需要很长时间!我最熟悉 Nginx,所以我将引导您完成修复。


如果在 nginx.conf 中将响应超时设置为 10 分钟(600 秒):

proxy_connect_timeout       600;
proxy_send_timeout          600;
proxy_read_timeout          600;
send_timeout                600;

然后用service nginx reload 重启 nginx,你应该不会再看到 504 了 :)

【讨论】:

    【解决方案2】:

    你的产品是 Heroku 吗?您需要将其纳入后台作业。根据经验(至少在 Heroku 上),如果它可以运行超过 2 秒,则它需要处于后台作业中。

    一个简单的方法是使用delayed_job。以下是相关的起始文档:

    Active job basics

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 2017-03-24
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多