如何配置nginx + Unicorn以避免超时错误?

时间:2013-08-08 23:41:49

标签: ruby-on-rails nginx timeout unicorn

我有一个在nginx + Unicorn(Ubuntu 12.04)上运行的Rails(v3.2.13,Ruby 2.0.0)应用程序。一切都运行良好,除非管理员用户通过CVS文件上传用户(数千)。问题是我将超时设置为30秒,导入过程需要更多时间。所以,30秒后我得到一个nginx 502 Bad Gateway页面(Unicorn worker被杀)。

显而易见的解决方案是增加超时,但我不希望这样,因为它会导致另一个问题(我猜),因为它不是典型的行为。

有没有办法处理这类问题?

提前多多感谢。

PS:也许解决方案是修改代码。如果是这样,我想避免用户执行另一个请求。

一些想法(如果可能的话,不知道):

  • 设置专门处理此请求的工作人员。
  • 向Unicorn发送“正在进行中的工作”信号以避免被杀。

nginx的-app.conf

upstream xxx {
  server unix:/tmp/xxx.socket fail_timeout=0;
}


server {
  listen   80; 

  ...

  location / {

    proxy_pass  http://xxx;
    proxy_redirect     off;
    ...

    proxy_connect_timeout      360;
    proxy_send_timeout         360;
    proxy_read_timeout         360;
  }
}

unicorn.rb

worker_processes 2

listen "/tmp/xxx.socket"

timeout 30

pid "/tmp/unicorn.xxx.pid"

2 个答案:

答案 0 :(得分:9)

这是创建队列的一个很好的理由。 你会:

  • 上传csv文件(应该在30秒内)
  • 您的后台作业将导入用户数据(可能需要数小时......)
  • 当这项工作正在进行时,您可以提供某种具有工作状态/百分比/等的WIP页面。

例如,检查https://github.com/resque/resque。还有很多其他队列。

答案 1 :(得分:2)

  

有没有办法处理这类问题?

在后台完成工作。您应该有一个单独的进程,逐个从队列中获取作业并处理它们。由于它不能与用户请求一起使用,因此只要需要它就可以完成它的工作。你不需要独角兽,只需要一个单独的守护进程。