nginx + Unicorn (Ubuntu 12.04) で実行されている Rails (v3.2.13、Ruby 2.0.0) アプリケーションがあります。管理者ユーザーが CVS ファイルを介してユーザー (数千人) をアップロードしている場合を除いて、すべてが正常に機能しています。問題は、タイムアウトを 30 秒に設定したため、インポート プロセスにさらに時間がかかることです。そのため、30 秒後に nginx 502 Bad Gateway ページが表示されます (Unicorn ワーカーが強制終了されます)。
明らかな解決策はタイムアウトを増やすことですが、これは別の問題を引き起こす可能性があるため(私は推測します)、典型的な動作ではないため、これは望ましくありません。
この種の問題を処理する方法はありますか?
よろしくお願いします。
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"