はじめに
個人サイトの運用でstrapiというHeadlessCMSをherokuサーバで動かしていたら、レスポンスが20秒ほどかかってデータが中々取得できない問題に遭遇した。
herokuサーバ(dyno)の無料プランだと30分間リクエストがない場合にsleep状態に入ってしまうので、sleep→サーバ再起動→strapi起動という流れになってたのが原因。
newRelicの無料アドオンを使って15分おきにpingを送ることで問題を回避できたので、その備忘録を書いておく。
このブログがとても参考になった。Heroku Free DynoのSleepを防止する
herokuのログをみて原因調査
最初はそもそもなんでherokuがこんなに遅いのかわからなかったが下記の記事が参考になった。
Herokuって本当に遅いんですか?
dynoがsleepしているのでは?!??!!?
Free Dyno Hours - Dyno sleeping
web dynoは30分以上トラフィックがないとsleepしてしまうんですが、これが起きるのが結構時間かかるんですね。
30分感覚で眠らないようにアクセスしてあげるみたいなのやってる人もいますが、どうしても無料でやりたかったらそれもあり。
実際にherokuのログを見ることでこの休眠現象を確認できる。
$ heroku log -t
2021-01-10T09:27:01.218869+00:00 heroku[router]: at=info method=POST path="/graphql" host=strapi-asakawa-family.herokuapp.com request_id=7a6e142f-4ce7-4176-b237-d2032efe8722 fwd="60.73.16.105" dyno=web.1 connect=1ms service=81ms status=200 bytes=1247 protocol=https
2021-01-10T09:27:01.216416+00:00 app[web.1]: [2021-01-10T09:27:01.216Z] debug POST /graphql (75 ms) 200
2021-01-10T09:27:01.248257+00:00 app[web.1]: [2021-01-10T09:27:01.248Z] debug POST /graphql (86 ms) 200
2021-01-10T10:01:18.451053+00:00 heroku[web.1]: Idling
2021-01-10T10:01:18.452808+00:00 heroku[web.1]: State changed from up to down
2021-01-10T10:01:19.964249+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2021-01-10T10:01:20.136459+00:00 heroku[web.1]: Process exited with status 143
strapiのgraphqlのエンドポイントにpostリクエストを送ってから30分待ってみたら、全プロセスが停止して休眠状態に入るのが確認できた。
その後リクエストがくると、サーバ再起動→strapi起動→yarn build完了→レスポンス返すって感じなので20秒ぐらいかかる。
newRelicアドオンの追加
個人サイト用だからアクセスも全然無いし、これを回避するために定期的にpingを打つことにした。
まずnewRelicのアドオンをherokuのアプリに追加する。
# newRelicアドオン追加コマンド
$ heroku addons:add newrelic:wayne -a { heroku_app_name }
newRelicのアカウント新規作成
newRelicのアカウントが無い場合は新規に作る。
下記リンクからnewRelicに登録。
https://newrelic.com/signup
Free access to all of New Relic. Forever.
No credit card required.
無料プランで使えるのでクレカも必要ない。
pingの送信設定
New Relic Syntheticsを選択。
そこで新規モニターを作成。
herokuのログにリクエストが出てればおk。
データ取得に20秒かかる地獄のような問題が解決した。