7

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"
4

2 に答える 2

9

これは、キューを作成する正当な理由です。そして、あなたは:

  • csv ファイルをアップロードします (30 秒以内にする必要があります)。
  • ユーザー データをインポートするバックグラウンド ジョブ (数時間かかることもあります…)
  • このジョブの進行中に、ジョブのステータス/パーセントなどを含む何らかの WIP ページを提供できます。

たとえば、https://github.com/resque/resqueを確認してください。他にもたくさんの行列が。

于 2013-08-10T12:32:36.510 に答える
2

この種の問題を処理する方法はありますか?

バックグラウンドでジョブを実行します。キューからジョブを 1 つずつ取得して処理する別のプロセスが必要です。また、ユーザーの要求には対応していないため、必要な限りその仕事を行うことができます。これにはユニコーンは必要ありません。別のデーモンだけです。

于 2013-08-10T09:23:04.110 に答える