こんにちは。sinyです。
今回は、Django+IIS環境で発生したタイムアウト問題に関する情報を簡単にまとめました。
同じような境遇に遭遇した方のお役に立てれば幸いです。
前提環境
今回検証した環境は、Django(2.2)+Windows環境+IIS(WEBサーバ)という組み合わせです。
Windows10、2012、2016サーバあたりであればどのバージョンでも有効だと思われますので細かいバージョンは明記しません。
今回発生した問題と原因
DjangoのWEBアプリケーション上から、比較的時間のかかる処理(数分程度)をWEBブラウザ上から実行した際に、以下のようなIISのタイムアウトエラーが発生してしまいました。
処理フローの概要は以下の通りです。
処理フロー
- WEBからPOSTリクエスト実行
- IIS経由でDjangoのカスタムコマンドをCALL
- カスタムコマンドの処理で時間がかかるとIISでタイムアウトが発生
タイムアウト発生までの時間を計測するとぶれはありましたが、60秒~80秒くらいでした。
この時間を頼りにIIS側のタイムアウト設定を調べたところ、「アクティビティタイムアウト」が原因であることがわかりました。
IISのアクティビティタイムアウトとは?
アプリケーションのFastCGIプロセスがIISと通信せずに実行できる時間(秒)を指定します。
デフォルトでは、このアクティビティタイムアウトが70秒に設定されているため、「FastCGIプロセス⇔IIS間の通信が発生しない状態が70秒以上続くとIISのタイムアウトエラーになってしまう。」というのが今回の原因でした。
恐らく、Djangoのカスタムコマンド内の処理に時間がかかっていると、コマンド実行中はFastCGIプロセス⇔IIS間の通信が発生しない状態になっているので、デフォルト70秒を過ぎるとIIS側でエラーが発生してしまうようです。
解決策
上記の通り、アクティビティタイムアウトの時間をデフォルトの70秒から増やすことでエラーを回避することができました。
以下がその手順です。
IISマネージャでFastCGIの設定をクリック
FastCGIの設定パス(python.exe)をクリック⇒画面右の「編集」をクリック。
アクティビティタイムアウトの設定値を70から増やす。
以上でFastCGIプロセス⇔IIS間の通信が発生しない状態に対するタイムアウト発生までの時間を長くすることができます。
以上、Django+IIS環境で発生したタイムアウト問題に関する情報まとめでした。