16

nginx と unicorn を使用している場合にのみ、本番環境で発生する奇妙な問題があります。nginx なしで unicorn を使用すると、発生しません。

問題。ユーザーが GitHub からサインアップできるようにする単純な oauth 認証があります。GitHub の認証ページで「許可」を押すと、ユーザーはコールバック ルートにリダイレクトされます。そして、彼/彼女は302 Bad Gatewayエラーになります。Nginx ログにこのエラーが表示されます (キーは "..." に置き換えられます)

2012/12/26 18:03:08 [エラー] 1467#0: *1 アップストリームからの応答ヘッダーの読み取り中に接続が途中で閉じられました, クライアント: 10.0.2.2, サーバー: _, リクエスト: "GET /auth/github/callback ?code=&state=... HTTP/1.1", アップストリーム: "http://unix:/tmp/unicorn.tm.sock:/auth/github/callback?code=...&state=...",ホスト: "localhost:3000"

私のnginx設定があります。

upstream unicorn {
  server unix:/tmp/unicorn.tm.sock fail_timeout=0;
}

server {
  listen 80 default deferred;

  client_max_body_size 4G;
  server_name _;

  keepalive_timeout 75s;

  proxy_connect_timeout 60s;
  proxy_read_timeout 60s;


  root /vagrant/public;

  try_files $uri/index.html $uri.html $uri @app;

  location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;

    proxy_redirect off;

    proxy_pass http://unicorn;

    proxy_buffer_size 16k;
    proxy_busy_buffers_size 16k;
  }

  error_page 500 502 503 504 /500.html;
}

だから私の質問は、なぜこれが起こるのか、それに対する可能な修正はありますか?

私はしばらくそれをグーグルで調べていましたが、運がありませんでした。

アップデート

コメントありがとうございます。設定しようとしたところfail_timeout=30s役に立ちますが、リクエストが完了するまでに約 40 秒かかります。しかし、とにかくありがとう、私はこのパラメータで失効​​しようとします。

提案に従って設定を少し更新しましたが、それでも同じエラーが発生します。

また、これはユニコーンのエラーログです。30秒以上かかるリクエストを強制終了するようですが、oauthサイトからのリダイレクトはそれほど長くはできないと思います...

(github) Request phase initiated.
(github) Callback phase initiated.
E, [2012-12-26T19:33:13.058183 #6002] ERROR -- : worker=0 PID:6005 timeout (31s > 30s), killing
E, [2012-12-26T19:33:13.067011 #6002] ERROR -- : reaped #<Process::Status: pid 6005 SIGKILL (signal 9)> worker=0
I, [2012-12-26T19:33:13.067198 #6002]  INFO -- : worker=0 spawning...
I, [2012-12-26T19:33:13.068631 #6012]  INFO -- : worker=0 spawned pid=6012
I, [2012-12-26T19:33:13.068726 #6012]  INFO -- : Refreshing Gem list
I, [2012-12-26T19:33:17.140948 #6012]  INFO -- : worker=0 ready

ユニコーン設定

rails_env = ENV['RAILS_ENV'] || 'production'

worker_processes 1

listen "/tmp/unicorn.tm.sock", :backlog => 64
listen 8080, :tcp_nopush => true

timeout 30

pid "/tmp/unicorn.pid"

stderr_path "/tmp/unicorn.log"
stdout_path "/tmp/unicorn.log"

check_client_connection false
4

1 に答える 1

24
ERROR -- : worker=0 PID:6005 timeout (31s > 30s), killing

言うまでもなく、ユニコーン設定でタイムアウトを 30 以上に設定する必要があります。

少なくとも試してみてください

timeout 60

http://unicorn.bogomips.org/Unicorn/Configurator.html#method-i-timeout

于 2012-12-26T20:30:21.240 に答える