Nginxのauth_requestがPOST時にTimeoutする
Nginxのauth_request
Module ngx_http_auth_request_module
これをつかってSSO認証を制御していた。
上手いこと動いていた感じだったのだが、この認証下にある WordpressのログインがTimeoutするという問題が発生。
調査していくと、wordpressへのPOST時のauth_requestでタイムアウトが発生していることがわかった。 認証サーバ側のNginxのログは見ると408を返していた。
解決策
auth_requestをProxyに流すときには、
- Content-Length を空にして
- proxy_request_body を off にすること。
proxy_pass_request_body off; proxy_set_header Content-Length "";
公式にちゃんと書いてある()
行きつくまで
認証サーバ自体はRailsでできたちょっとしたものなので処理の中でタイムアウトが起きるはずはなかった。 またRailsには一切ログが吐き出されていなかった。
Railsのログに記載されないというのはどういうこと???ってなった。 低レイヤでどうなってるのか調べようと、unicornにstraceを掛けたり、tcpdumpしたり色々していた。 その過程でそこそこしょうもない知識を得た。
結局、nginxがGETを受けたまま、そのまま固まっているのでは?感がnginx-workerプロセスのstraceから見えてきた。 ヘッダを全部見返していったら、大本の設定でContent-Lengthが抜けてたことに気づいた。
他のauth_requestの設定をしてある場所はちゃんと公式の見本通りにヘッダがセットしてあったのに、ここだけ抜けていたのはなんでなんだろう。。。 Gitのログ曰く、最近テンプレートを書き直したときに、このヘッダだけ削っていたっぽい。 ふぇぇって感じ。
どうでもいいはなし
Nginxのことも含めて、
vagrantで立ち上げたcentosにssh公開鍵で入れなくてログも見れなくてなんでだ??ってやってたら、同じIP持ったVMが二つ立ち上がってた。。。
— namazu (@namazu510) 2018年2月25日
とか絶賛しょうもない日だった。
タスクが山積みなのでなんとかしないと。。。 明日大学に行って進捗を出すかなぁ。。。