前提・実現したいこと
Heroku上でPython3.x(Flask)アプリが稼働中です。
スマホからアクセスすると時折「Application error」という画面になります。
Herokuのログには「at=error code=H18 desc="Server Request Interrupted"」と出力されています。
同じ操作をしてもこのエラーが発生するとは限りません。
このエラーの発生を減らすor無くす方法が知りたいです。
発生している問題・エラーメッセージ
Heroku CLIから「heroku logs」コマンドで確認したところ、以下のようなログが出力されていました。
heroku[router]: sock=backend at=error code=H18 desc="Server Request Interrupted" method=POST path="XXX" host=XXX request_id=XXX fwd="XX.XX.XX.XX" dyno=web.1 connect=Xms service=XXms status=503 bytes= protocol=https
前後に関連するエラーメッセージは出力されていません。
Heroku Error Codesには以下のような記載があります。
H18 - Server Request Interrupted The backend socket, belonging to your app’s web process was closed before the backend returned an HTTP response.
該当のソースコード
Python
1@app.route("<URL>", methods=["POST"]) 2def <関数名>(): 3 : 4 (略) 5 : 6 return render_template("<HTMLファイル名>", <パラメーター>=<値>)
このような関数が複数あり、どの関数でエラーが発生しやすい、といった傾向も無いようです。
試したこと
時間を置いて再度同じ操作を実行してみました。
同じエラーになる事もあれば、成功する事もありました。
時間を置かずに再読み込みすると同じエラーになる事が多かったです。
前のページに戻って同じ操作をすると、時間を置かなくても成功する事もありました。
補足情報(FW/ツールのバージョンなど)
Heroku
python-3.7.3
gunicorn==19.9.0
Flask==1.0.2
9/17追記 前後のログの内容
あまり参考にならないかもしれませんが、エラーが発生した前後のログを追記します。
行頭★印がエラーのログです。
Sep 16 00:48:46 <アプリ名> heroku/router: at=info method=GET path="<パス②>" host=<URL> request_id=<リクエストID> fwd="<IPアドレス>" dyno=web.1 connect=1ms service=21ms status=200 bytes=18350 protocol=https Sep 16 00:48:46 <アプリ名> app/web.1: <IPアドレス> - - [16/Sep/2019:16:48:46 +0900] "GET <パス②> HTTP/1.1" 200 18187 "<URL>" "<アクセス元のブラウザ等>" ★Sep 16 00:48:50 <アプリ名> heroku/router: sock=backend at=error code=H18 desc="Server Request Interrupted" method=POST path="<パス③>" host=<URL> request_id=<リクエストID> fwd="<IPアドレス>" dyno=web.1 connect=1ms service=95ms status=503 bytes= protocol=https Sep 16 00:48:50 <アプリ名> app/web.1: 10.41.169.187 - - [16/Sep/2019:16:48:50 +0900] "POST <パス③> HTTP/1.1" 200 13763 "<URL>" "<アクセス元のブラウザ等>" Sep 16 00:48:57 <アプリ名> heroku/router: at=info method=POST path="<パス③>" host=<URL> request_id=<リクエストID> fwd="<IPアドレス>" dyno=web.1 connect=0ms service=75ms status=200 bytes=14085 protocol=https
Sep 16 04:21:21 <アプリ名> heroku/router: at=info method=GET path="<パス④>" host=<URL> request_id=<リクエストID> fwd="<IPアドレス>" dyno=web.1 connect=1ms service=112ms status=200 bytes=31467 protocol=https Sep 16 04:21:21 <アプリ名> app/web.1: 10.47.135.182 - - [16/Sep/2019:20:21:20 +0900] "GET <パス④> HTTP/1.1" 200 31145 "<URL>" "<アクセス元のブラウザ等>" ★Sep 16 04:21:30 <アプリ名> heroku/router: sock=backend at=error code=H18 desc="Server Request Interrupted" method=POST path="<パス④>" host=<URL> request_id=<リクエストID> fwd="<IPアドレス>" dyno=web.1 connect=1ms service=79ms status=503 bytes= protocol=https Sep 16 04:21:31 <アプリ名> app/web.1: 10.47.135.182 - - [16/Sep/2019:20:21:30 +0900] "POST <パス④> HTTP/1.1" 200 31145 "<URL>" "<アクセス元のブラウザ等>" Sep 16 04:21:45 <アプリ名> heroku/router: at=info method=POST path="<パス⑤>" host=<URL> request_id=<リクエストID> fwd="<IPアドレス>" dyno=web.1 connect=0ms service=152ms status=200 bytes=30369 protocol=https