2014年12月29日月曜日

nginxとunicornの環境でtimeoutエラーが出たときの対応

nginx+unicornな環境で、かなり大きいファイルをダウンロードしたいとの要望があって、
実装してみたらタイムアウトが出てしまったのでそのときにした対応を載せていきます。

まず最初にunicorn.logに出てたエラーがこれです。
E, [2014-12-19T10:06:30.924665 #17078] ERROR -- : worker=1 PID:17094 timeout (31s > 30s), killing
E, [2014-12-19T10:06:30.973611 #17078] ERROR -- : reaped # worker=1
nginx.logにもエラーが出ていました。
2014/12/19 10:06:30 [error] 26747#0: *54198 upstream prematurely closed connection while reading response header from upstream, client: 172.23.151.25, server: aaa.bbb.com, request: "GET /user_list HTTP/1.1", upstream: "http://unix:/tmp/unicorn.sock:/user_list", host: "aaa.bbb.com", referrer: "https://aaa.bbb.com/"
unicornのtimeoutの設定を30秒にしていたので、それを超えたタイミングでエラーになったようです。
なので次はtimeoutを90秒に変えてリトライしてみました。

今度はnginx.logに違うエラーが出ていました。
2014/12/19 10:20:18 [error] 26747#0: *54253 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 172.23.151.25, server: aaa.bbb.com, request: "GET /user_list HTTP/1.1", upstream: "http://unix:/tmp/unicorn.sock/user_list", host: "aaa.bbb.com", referrer: "https://aaa.bbb.com/"
nginxのタイムアウト設定まわりでエラーになっていると思われるので、
いろいろなタイムアウト設定を一つずつ追加していってみました。
    send_timeout 120s;
    fastcgi_read_timeout 120s;
    fastcgi_send_timeout 120s;
 
    location @unicorn {
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Proto https;
      proxy_pass http://unicorn;
      proxy_send_timeout 120s;
      proxy_read_timeout 120s;
    }
上から順にこれだけタイムアウトの設定を追加していったところ、エラーが出ないようになりました。
すべては必要なさそうに思えたので検証していったところ、これだけでOKでした。
proxy_read_timeout 120s;

参考URL
http://server-setting.info/centos/nginx-upstream-timed-out.html
http://hack.aipo.com/archives/3738/
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout

0 件のコメント:

コメントを投稿