前回の記事でmod_rewriteのRewriteMapを使い、なんちゃってフェイルオーバーを作ってみましたが、どうもたまにヘルスチェックをおこなうrubyのスクリプトが落ちるわけです・・・。
エラーはこんな感じ。
/usr/lib/ruby/1.8/timeout.rb:54:in `open': execution expired (Timeout::Error) from /usr/lib/ruby/1.8/net/http.rb:560:in `connect' from /usr/lib/ruby/1.8/timeout.rb:56:in `timeout' from /usr/lib/ruby/1.8/timeout.rb:76:in `timeout' from /usr/lib/ruby/1.8/net/http.rb:560:in `connect' from /usr/lib/ruby/1.8/net/http.rb:553:in `do_start' from /usr/lib/ruby/1.8/net/http.rb:542:in `start' from /usr/local/etc/shells/healthcheck.rb:30
rescueで捕捉しているのにどうしてだろう?と思っていたのですが、下記のような記事を発見。どうやら今のやり方では、Timeout::Errorの例外は捕捉してくれないようです。
Net::HTTPの例外補足方法 – OVERT MEMO
さっそく以下のように修正。
begin http = Net::HTTP.new(hostname, port ? port : 80) http.open_timeout = HTTP_TIMEOUT http.read_timeout = HTTP_TIMEOUT http.start {|p| response = p.head(path ? path : '/') } rescue Exception # ここを修正 # end