nginxでリダイレクト回避してヘルスチェック成功

Androidのユーザーの方から、通信が少し遅いと言われたので、サーバーがちゃんと稼働しているか見ました。
使っているのはLightsailなので、CloudWatchの方からは見られないっぽいです。
ので、Lightsailのメトリクスの方から見ました。

逆に全然使われてない…。
まぁアクセス数もまだまだ全然なのでそれはそう。
自分のiPhoneからは速かったので、遅かったのは端末の問題かなと。
他のサイトへのアクセスは軽いらしいので、キャッシュとかが溜っているのかなと思い、サイトデータ削除を提案しました(結果はまだ聞いてないです)。

そういえば、サーバーは軽いので今まで後回しにしていたんですが、実はロードバランサ―によるヘルスチェックがずっと失敗してたんですね。
気持ち悪いのでそろそろ直そうかと思い調べたところ、リダイレクト設定で300系のリダイレクトが返されてる可能性があるとのことでした。
Djangoの設定で、httpはhttpsに流すようにしてあったのでそれかなと思い、nginxのlogを見たらまさに

"GET /login.html HTTP/1.1" 301 5 "-" "ELB-HealthChecker/2.0" "-"

とありました(index.htmlは割と重いので、loginページでヘルスチェック)。
EC2だと、ヘルスチェックのポート番号を変えることが出来るらしいのですが、Lightsailはデフォルトの80で変更が効かない模様。

じゃあDjangoに渡してリダイレクトされる前に、nginxで200返せばええやんということで、

location /healthcheck {
       return 200;
       break;
   }

というコードをnginx.confに書き込み、ヘルスチェックをhealthcheck.htmlに設定したら

"GET /healthcheck.html HTTP/1.1" 200 0 "-" "ELB-HealthChecker/2.0" "-"

と出て、ヘルスチェック成功となりました。
めでたしめでたし。

実はこの200が数回出るまではヘルスチェック失敗のまま(数回成功でやっと成功表示)だったので、この方法ではダメなのか…と思い、Djangoのリダイレクトをやめる方法も調べていました。
今は
settings.pyに

SECURE_SSL_REDIRECT = True

を書くことでhttp => httpsにリダイレクトさせているんですが、SECURE_REDIRECT_EXEMPTにリストで正規表現を書いておけば、マッチするURLはhttpsリダイレクトされないように設定できるらしいです。
頭の片隅に置いておこう。

少しずつインフラ系も慣れてきて楽しいです。


今日もお読みくださりありがとうございます。
ほぼ毎日、アプリ開発や事業に関する日記を書いておりますので是非またお読みになってください!

この記事が気に入ったらサポートをしてみませんか?