[フェイルシュート]上流タイムアウト(110:Connectionタイムアウト)エラー

2607 ワード

エラー


サーバを実行すると、最初は正常に動作します.10分後に接続すると、サーバはAPI要求を処理できません.

Gunicorn Log



Nginx Log



問題の原因を特定


どこが問題なのかを知るために、Nginx、Guncornで彼を確認した.
Guiconlogで見たのに、Flaskサーバーを確認.
では、DBからデータをロードする問題かもしれないので、DBログを見ました.
DBはAWS RDSを使用しているので、AWSホームページで確認します.

Got timeoutが通信パケットを読み込み、Got an errorが通信パケットを読み込むなどのエラーが発生した.
もしそうであれば,データベースがクエリを処理できず,サーバがAPI要求を処理できないと推定できる.
でもDBに何か問題があったのか...Googleで関連エラーを検索しました.
クエリ文が長すぎるため、DB設定のinteractive timeout設定値を超えています.だから私は時間を測った.しかし、0.008秒になってから0.01秒の実行速度を示すという言葉は納得できない.
しかしtimeoutという言葉を見て、DBの時間設定部分とどのように動くかを学びました.
https://okky.kr/article/540700以降、次の記事が見つかりました.
つまり、データベースにクエリーがなくなり、接続が中断してエラーが発生しました.
これは問題だと思い、DBの設定値をチェックしました.
show variables like 'wait_timeout';
wait_timeoutオプションとは、アクティブでない接続を切断する前にサーバが待機する時間です.すなわち、接続が確立されているが、クエリがこの間送信されていない場合、切断されます.
定価は28800です.8時間後に掛けたということですが、うん...8時間以内にちゃんと...と思います.それはこれからも勉強を続けますまずこの問題を解決しましょう.

解決策


そこで,無意味なクエリーを展開し,連絡を維持する方法を探した.
Flask-SQLAlchemyにはpool_recycleのオプションがあります.データベースに設定されたwait_timeoutが接続を切断する前に、接続を維持するために無意味なクエリーが行われます.
SQLALCHEMY_ENGINE_OPTIONS = {
	'pool_recycle': 120
}
これは、次のように設定されている場合、120秒ごとにデータベース・クエリーが実行されることを意味します.
注意事項はDB設定のwait_timeoutより小さく設定した方が意味があります.
とりあえず、このように設定してから、再配置しました.エラーは表示されず、正常に動作していることを確認しました.
三日ぐらいはこれで苦労しました.Nginx、Guncorn設定などに触れてみましたが、やはりログを見ていて、一つ一つついていくと、答えがあることに気づきました.
リファレンス
https://sjinstorage.blogspot.com/2019/11/got-timeout-reading-communication.html
https://yongho1037.tistory.com/569
https://pythonq.com/so/docker/1133414