やりたいこと
サーバーのデフォルトタイムアウトが60秒に設定されていた。
スクレイピングやバッチサーバーでは60秒以内に完了しないものが多いのでタイムアウトの時間を設定したい。
設定方法
NginxとUnicornのタイムアウト値を設定する必要がある。
Unicornのタイムアウト値変更(999999999999秒)
$ vi /projects/config/unicorn.rb
※「timeout 999999999999」を追加。無制限
Nginxのタイムアウト値変更(3600秒)
$ vi /etc/nginx/conf.d/timeout.conf
(ファイル自体を追加)
proxy_connect_timeout 3600;
proxy_send_timeout 3600;
proxy_read_timeout 3600;
send_timeout 3600;
NginxとUnicornの再起動
$ /etc/init.d/nginx restart
$ kill -9 <Unicorn マスタープロセスPID>
$ bundle exec unicorn_rails -c config/unicorn.rb -E development -D
備考
タイムアウトの設定は「Unicorn」「Nginx」の2箇所にあります。
-
「Nginx」のタイムアウト値に引っかかった場合は、
「504 Gateway Time-out」と表示されます。 -
「Unicorn」のタイムアウト値に引っかかった場合は、
ログ下記のような出力があります。
$ grep timeout /projects/log/development_unicorn_error.log | grep killing
E, [2017-06-15T11:30:50.803344 #23658] ERROR — : worker=0 PID:23661 timeout (61s > 60s), killing
E, [2017-06-15T11:36:41.156568 #23658] ERROR — : worker=1 PID:23663 timeout (61s > 60s), killing
E, [2017-06-15T11:43:53.542174 #23658] ERROR — : worker=1 PID:23769 timeout (61s > 60s), killing
E, [2017-06-15T11:45:32.648281 #23658] ERROR — : worker=0 PID:23720 timeout (61s > 60s), killing
E, [2017-06-15T13:36:51.095563 #23658] ERROR — : worker=0 PID:23978 timeout (61s > 60s), killing