我有一个在 nginx + Unicorn (Ubuntu 12.04) 上运行的 Rails (v3.2.13, Ruby 2.0.0) 应用程序。一切运行良好,除非管理员用户通过 CVS 文件上传用户(数千个)。问题是我已将超时设置为 30 秒,并且导入过程需要更多时间。因此,30 秒后,我得到一个 nginx 502 Bad Gateway 页面(独角兽工人被杀死)。
显而易见的解决方案是增加超时,但我不希望这样做,因为它会导致另一个问题(我猜),因为这不是典型的行为。
有没有办法处理这类问题?
提前非常感谢。
PS:也许一个解决方案是修改代码。如果是这样,我想避免用户执行另一个请求。
一些想法(不知道是否可能):
- 设置一个专门处理此请求的工作人员。
- 向独角兽发送“正在进行中”的信号以避免被杀死。
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;
}
}
独角兽.rb
worker_processes 2
listen "/tmp/xxx.socket"
timeout 30
pid "/tmp/unicorn.xxx.pid"