nginxのproxy_read_timeoutはupstreamにも注意
proxy_read_timeout
が思ったような挙動ではなかったので実験してみた.
想定していた挙動
こんな設定のnginxに対して
upstream server_pool_a { server web001:80 max_fails=3 fail_timeout=30s; server web002:80 max_fails=3 fail_timeout=30s; } proxy_read_timeout 60
無限ループするようなCGIをプロキシさせたら
web001にリクエスト ↓ 60秒以内にレスポンスが完了しない ↓ 504 Gateway Time-out 発生
となると思っていた.
実際の挙動
ところが実際には以下のような挙動だった.
web001にリクエスト ↓ 60秒以内にレスポンスが完了しない ↓ web002にリクエスト ↓ 60秒以内にレスポンスが完了しない ↓ 504 Gateway Time-out 発生
upstream先のサーバでwhileしてプロセスの状況をみてみた.
web001にリクエストして60秒(proxy_read_timeout)後にweb002にもリクエストしていることがわかる.
- web001
*** 前略 *** 2014年 2月 20日 木曜日 19:33:24 JST 2014年 2月 20日 木曜日 19:33:25 JST 10000 26423 20501 0 19:33 ? 00:00:00 /usr/local/bin/perl chk_loop.cgi *** 後略 ***
- web002
*** 前略 *** 2014年 2月 20日 木曜日 19:34:23 JST 2014年 2月 20日 木曜日 19:34:24 JST 10000 29708 25141 0 19:34 ? 00:00:00 /usr/local/bin/perl chk_loop.cgi *** 後略 ***