mod_reqtimeout: RequestReadTimeout
mod_reqtimeout
は、Apache HTTP Server のモジュールの一つで、リクエストの読み込みにかかる時間を制限することを目的としています。これにより、悪意のあるクライアント(例:低速なリクエストを送り続けることでサーバーを飽和させようとするDoS攻撃)や、単にネットワークが遅いクライアントによってサーバーのリソースが長時間占有されるのを防ぎます。
その中でも RequestReadTimeout
ディレクティブは、特にリクエストボディの読み込みに焦点を当てたタイムアウト設定です。
何を制限するのか?
RequestReadTimeout
は、以下の2つのフェーズにおける読み込み時間を制限します。
-
ヘッダーの読み込みタイムアウト
クライアントがリクエストのヘッダー部分を送信し終えるまでの時間。もしクライアントが一定時間ヘッダーを送信しなかったり、非常に低速で送信した場合にタイムアウトします。 -
ボディの読み込みタイムアウト
ヘッダーの送信が完了した後、リクエストボディ(例:POSTリクエストで送信されるフォームデータやファイルアップロードデータ)の読み込みにかかる時間。これも同様に、クライアントが一定時間ボディを送信しなかったり、低速で送信した場合にタイムアウトします。
設定方法と例
RequestReadTimeout
は通常、httpd.conf
などの Apache の設定ファイルに記述します。設定には主に2つの方法があります。
-
固定タイムアウト (Fixed Timeout)
リクエスト全体に対して固定のタイムアウトを設定します。RequestReadTimeout header=20 body=30
header=20
: ヘッダーの読み込みを20秒以内に完了させる。body=30
: ボディの読み込みを30秒以内に完了させる。
-
レートベースのタイムアウト (Rate-based Timeout)
最初に一定の猶予時間を与え、その後はデータ転送速度に基づいてタイムアウトを計算します。これにより、大きなファイルをアップロードする際など、正規の遅い接続でもタイムアウトしにくくなります。RequestReadTimeout header=20-40,MinRate=500 body=30-60,MinRate=500
header=20-40,MinRate=500
:- 最初の20秒間は無条件に待機。
- その後、もしクライアントがリクエストヘッダーを完了していなければ、次の20秒(合計40秒まで)の間に最低500バイト/秒の速度でデータを送信し続けないとタイムアウトする。
body=30-60,MinRate=500
:- 最初の30秒間は無条件に待機。
- その後、もしクライアントがリクエストボディを完了していなければ、次の30秒(合計60秒まで)の間に最低500バイト/秒の速度でデータを送信し続けないとタイムアウトする。
なぜ重要なのか?
- サーバーの安定性向上
タイムアウトを設定することで、特定のクライアントがサーバーのパフォーマンスに悪影響を与えるのを制限し、全体的な安定性を向上させます。 - リソースの解放
不完全なリクエストや遅いリクエストによって不要にリソースが占有されるのを防ぎ、他の正当なリクエストが処理できるようにします。 - DoS/DDoS攻撃の軽減
低速なリクエストによってサーバーのリソース(コネクション、メモリなど)が枯渇するのを防ぎます。
注意点
- 他のタイムアウト設定との兼ね合い
ApacheにはTimeout
ディレクティブなど、他にも様々なタイムアウト設定があります。これらとRequestReadTimeout
がどのように連携するかを理解し、適切に設定する必要があります。 - 適切な値の設定
タイムアウト値を厳しくしすぎると、正当なユーザー(特にネットワークが遅い環境からのユーザーや、大きなファイルをアップロードするユーザー)がタイムアウトに遭遇してしまう可能性があります。
RequestReadTimeout
は、適切に設定されていないと、予期せぬタイムアウトエラーを引き起こす可能性があります。主なエラーとその解決策は以下の通りです。
エラー: 「408 Request Timeout」が頻繁に発生する
最も一般的な問題は、正当なリクエストに対しても 408 Request Timeout
エラーが返されることです。これは、クライアントが設定された時間内にリクエストを送信し終えられない場合に発生します。
原因
- バックエンド/プロキシとの連携問題
- Apacheがリバースプロキシとして機能している場合、バックエンドサーバーの応答が遅い、またはバックエンドとApache間のネットワークが不安定な場合に、クライアントへの応答が遅延し、結果としてクライアントからの次のリクエストの読み込みがタイムアウトすることがある。
- ロードバランサー(ELBなど)を使用している場合、ロードバランサー側のタイムアウト設定とApache側の
RequestReadTimeout
設定に不整合がある場合。
- Keep-Alive接続の問題
- Keep-Aliveが有効な場合、クライアントが次のリクエストを送信するまでのアイドル時間が短すぎると、
mod_reqtimeout
が不正な接続と判断してタイムアウトさせる場合がある。
- Keep-Aliveが有効な場合、クライアントが次のリクエストを送信するまでのアイドル時間が短すぎると、
- タイムアウト値が短すぎる
- 大規模なファイルアップロードや複雑なフォーム送信など、リクエストボディが大きい場合に、読み込みがタイムアウトしてしまう。
- ネットワークが遅い環境からのアクセス(モバイル回線、遠隔地など)で、リクエストの送信に時間がかかりすぎる。
- SSL/TLSハンドシェイクに時間がかかる場合(特にCRL(証明書失効リスト)の確認などで時間がかかる場合)。
トラブルシューティングと解決策
- LimitRequestBody ディレクティブとの兼ね合い
LimitRequestBody
はリクエストボディの最大サイズを制限するディレクティブです。RequestReadTimeout
とは直接的な関係はありませんが、非常に大きなボディを許可している場合、読み込みにかかる時間も長くなるため、両方の設定を考慮する必要があります。 - プロキシ/ロードバランサーの設定を確認する
Apacheの前にロードバランサーやCDNがある場合、それらのタイムアウト設定も確認し、ApacheのRequestReadTimeout
設定と矛盾がないように調整します。例えば、ELBのアイドルタイムアウトがApacheのRequestReadTimeout
よりも短いと、ELBが先に接続を切断してしまうことがあります。 - クライアント側の要因を調査する
- 特定のクライアントやネットワーク環境でのみ問題が発生するか確認します。
- クライアント側のアプリケーションやスクリプトが、リクエストの送信を意図的に遅らせていないか確認します。
- Apacheのエラーログを確認する
Apacheのエラーログ(通常error_log
)には、mod_reqtimeout
がタイムアウトを検知した場合に以下のようなメッセージが出力されます。
これらのログメッセージから、どのフェーズ(ヘッダーかボディか)でタイムアウトが発生しているか、およびタイムアウトしたクライアントのIPアドレスを特定できます。これにより、原因の絞り込みに役立ちます。[reqtimeout:info] [pid XXXX:tid XXXXXXXXX] [client X.X.X.X:XXXXX] AH01382: Request header read timeout. [reqtimeout:info] [pid XXXX:tid XXXXXXXXX] [client X.X.X.X:XXXXX] AH01383: Request body read timeout.
LogLevel
をinfo
以上に設定しているか確認してください。 - RequestReadTimeout の値を調整する
- header と body の値を増やす
まずは、現在の設定値をログを確認しながら少しずつ増やしてみてください。特に大きなファイルを扱う可能性がある場合は、body
の値を大きく設定することが重要です。# 例: ヘッダーを60秒、ボディを120秒まで許可 RequestReadTimeout header=60 body=120
- レートベースのタイムアウト (MinRate) を活用する
単に固定のタイムアウト値を増やすのではなく、データ転送速度に応じてタイムアウトを延長するMinRate
を活用すると、正当な遅い通信を許容しつつ、悪意のある攻撃を防ぐことができます。
この設定は、特にアップロードなどのボディサイズが大きいリクエストに有効です。# 例: ヘッダーは最初の20秒は無条件、その後は最低500B/sで転送されれば最長40秒まで延長。 # ボディは最初の30秒は無条件、その後は最低500B/sで転送されれば最長60秒まで延長。 RequestReadTimeout header=20-40,MinRate=500 body=30-60,MinRate=500
- header と body の値を増やす
エラー: DoS攻撃が防げない、またはサーバーが不安定になる
RequestReadTimeout
はDoS攻撃(特にSlowlorisのような低速HTTP攻撃)対策に非常に有効ですが、設定が緩すぎると効果が薄れます。
原因
- mod_reqtimeout が有効になっていない、または正しく設定されていない
- Apacheの設定で
mod_reqtimeout.so
がロードされていない。 RequestReadTimeout
ディレクティブがhttpd.conf
や VirtualHost 設定に記述されていない、またはコメントアウトされている。
- Apacheの設定で
- タイムアウト値が長すぎる
攻撃者がリソースを長時間占有できるため、サーバーが飽和状態になる。
トラブルシューティングと解決策
- 他のセキュリティモジュールとの連携
mod_reqtimeout
は第一線の防御策ですが、これだけで全てのDoS攻撃を防げるわけではありません。mod_security
やmod_evasive
といった他のセキュリティモジュール、またはファイアウォール(iptablesなど)やWAF(Web Application Firewall)と組み合わせて多層防御を構築することが推奨されます。 - 適切なタイムアウト値を設定する
DoS攻撃対策を主な目的とする場合は、正当なリクエストに影響が出ない範囲で、タイムアウト値を短めに設定することを検討します。特にMinRate
を活用することで、攻撃者が低速でデータを送り続けるのを防げます。 - mod_reqtimeout が有効であることを確認する
Apacheの設定ファイルでLoadModule reqtimeout_module modules/mod_reqtimeout.so
の行がコメントアウトされていないことを確認します。
エラー: 特定のアプリケーションで問題が発生する
特定のWebアプリケーションやフレームワークを使用している場合にのみ、RequestReadTimeout
に関連する問題が発生することがあります。
原因
- アプリケーションが生成するリクエストのサイズや頻度
- 大きなファイルを扱うアプリケーションで、アップロード処理が長時間かかる。
- アプリケーションの特性
- AJAXリクエストで非常に長いポーリングを行っている。
- WebDAVやWebSocketsなど、標準的なHTTPリクエストとは異なるプロトコルや長時間接続を必要とするサービスを利用している。
- 特定パスの除外(推奨されないが、一時的な対応として)
もし特定のURLパスのみで問題が発生し、かつそのパスがDoS攻撃のリスクが低いと判断できる場合は、そのパスに対してのみRequestReadTimeout
を無効にする(値を0
にする)ことも技術的には可能ですが、これはセキュリティリスクを高めるため、推奨されません。
代わりに、レートベースのタイムアウトを十分に大きく設定することがより安全な方法です。<Location "/long_upload_path/"> RequestReadTimeout header=0 body=0 # 推奨されません! </Location>
- アプリケーションの要件を把握する
アプリケーションが許容するリクエストの最小転送速度や最大処理時間を把握し、それに基づいてRequestReadTimeout
の値を設定します。
Apache HTTP Server の mod_reqtimeout
モジュールにおける RequestReadTimeout
ディレクティブは、Apache の設定ファイル(通常 httpd.conf
や Virtual Host の設定ファイル)に記述されるものであり、プログラミングコードとして直接記述するものではありません。
これは、Apache がリクエストを処理する際の「動作ルール」を定義する設定ディレクティブです。したがって、「プログラミングに関連する例コード」というよりは、「Apache の設定ファイルにおける記述例」として説明することになります。
RequestReadTimeout
ディレクティブは、主に httpd.conf
ファイル、または個別のVirtual Host設定 (<VirtualHost>...</VirtualHost>
) やディレクトリ設定 (<Directory>...</Directory>
) 内で使用されます。
最も基本的な設定例:固定タイムアウト
これは、リクエストのヘッダーとボディの読み込みに対して、それぞれ固定の最大時間を設定する最もシンプルな形式です。
# httpd.conf または Virtual Host 設定ファイル内
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
# ヘッダー読み込みの最大時間を20秒、ボディ読み込みの最大時間を30秒に設定
RequestReadTimeout header=20 body=30
# その他の設定...
</VirtualHost>
解説
body=30
: ヘッダーの送信が完了した後、クライアントがリクエストボディ(例: POSTデータ、ファイルアップロードデータ)をすべて送信し終えるまで、Apache は最大30秒間待機します。30秒以内にボディが完了しない場合、Apache は接続を閉じ、通常408 Request Timeout
エラーを返します。header=20
: クライアントがリクエストのHTTPヘッダーをすべて送信し終えるまで、Apache は最大20秒間待機します。20秒以内にヘッダーが完了しない場合、Apache は接続を閉じ、通常408 Request Timeout
エラーを返します。
用途
小規模なウェブサイトや、DoS攻撃への一般的な対策として非常に有効です。ただし、サイズの大きなファイルをアップロードする際にタイムアウトしやすいという欠点があります。
推奨される設定例:レートベースのタイムアウト (MinRate)
この方法は、固定タイムアウトに加えて「最小転送速度」の条件を追加することで、正当な遅い通信を許容しつつ、攻撃による極端に遅い通信を遮断します。より柔軟で堅牢な設定です。
# httpd.conf または Virtual Host 設定ファイル内
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
# レートベースのタイムアウト設定
# ヘッダー: 最初の20秒は無条件に待機。その後、最低500バイト/秒の転送速度で、最長40秒まで待機。
# ボディ: 最初の30秒は無条件に待機。その後、最低500バイト/秒の転送速度で、最長60秒まで待機。
RequestReadTimeout header=20-40,MinRate=500 body=30-60,MinRate=500
# その他の設定...
</VirtualHost>
解説
- body=30-60,MinRate=500
- ヘッダー読み込み完了後、リクエストボディの読み込みに対して適用されます。
- 最初の
30
秒は無条件に待機。 - その後、追加で
60-30=30
秒間待機しますが、この間は最低500
バイト/秒の転送速度が必要です。この速度を下回るか、合計60
秒を超えるとタイムアウトします。
- header=20-40,MinRate=500
- 最初の
20
(秒): クライアントがヘッダーの送信を開始するまでの初期猶予時間です。この間は転送速度のチェックは行われません。 - 次の
-40
(秒): 初期猶予時間20
秒が過ぎてもヘッダーが完了していない場合、Apache はさらに40-20=20
秒間待機します。ただし、この追加の待機時間中は、クライアントは最低MinRate
で指定された速度でデータを転送し続ける必要があります。 MinRate=500
: 初期猶予時間経過後、毎秒最低500バイトのデータを転送する必要があります。この速度を下回るとタイムアウトします。- 例: ヘッダーの合計読み込み時間が
40
秒を超えるとタイムアウトします。また、20
秒経過後から40
秒までの間に転送速度が500 bytes/sec
を下回るとその時点でタイムアウトします。
- 例: ヘッダーの合計読み込み時間が
- 最初の
用途
ファイルアップロードなど、大きなデータのリクエストボディを持つアプリケーションを運用する場合に非常に有効です。正当な低速な通信を許容しつつ、悪意のある低速攻撃(Slowlorisなど)を効果的に防ぐことができます。
特定の場所(Directory/Location)に対する設定
特定のURLパスやディレクトリに対してのみ異なる RequestReadTimeout
設定を適用することも可能です。これは、例えば特定のアップロード機能を持つパスに対してのみ、タイムアウト値を大きくしたい場合などに役立ちます。
# httpd.conf または Virtual Host 設定ファイル内
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
# デフォルトのタイムアウト設定
RequestReadTimeout header=20 body=30
# /upload/ パスへのアクセスに対して、ボディのタイムアウトをより長く設定
<Location "/upload/">
RequestReadTimeout body=60-120,MinRate=100
</Location>
# その他の設定...
</VirtualHost>
解説
- これにより、特定の機能(ここではアップロード)の要件に合わせて柔軟なタイムアウト設定が可能になります。
/upload/
パスへのリクエストの場合、header
のタイムアウトはデフォルトの20
秒が適用されますが、body
のタイムアウトは<Location>
ブロック内の設定 (60-120,MinRate=100
) が上書きされます。
前述の通り、これらの設定はApacheサーバーの「設定」であり、Python、PHP、Javaなどのプログラミング言語で直接記述してApacheを制御するものではありません。
しかし、プログラミングを行う開発者は、自身のアプリケーションがApacheのこれらのタイムアウト設定によって影響を受けないように、以下の点を考慮する必要があります。
- エラーハンドリング
クライアントサイドのアプリケーション(JavaScriptなど)は、408 Request Timeout
のようなHTTPエラーコードを適切にハンドリングし、ユーザーに分かりやすいメッセージを表示することが望ましいです。 - 長時間のリクエスト処理
リクエストボディをすべて受け取るまでに時間がかかるAPI(例: 大量のデータを受け取るバッチ処理API)を開発する場合、Apacheのタイムアウト設定とアプリケーションの処理時間が整合しているかを確認します。 - 大きなファイルアップロードの処理
アプリケーションが大きなファイルをアップロードする機能を持つ場合、ApacheのRequestReadTimeout
のbody
設定が適切であることを確認する必要があります。ユーザーのネットワーク環境によっては、非常に遅い転送速度になる可能性も考慮し、MinRate
を活用するか、十分に大きな固定値を設定する必要があります。
しかし、「プログラミングに関連する代替手段」という文脈で考える場合、それは主に以下の2つの視点に分けられます。
- Apache サーバーの他の設定ディレクティブやモジュールによる代替/補完
mod_reqtimeout
以外にも、Apache にはタイムアウトやリソース制御に関する様々な設定があります。これらはmod_reqtimeout
を完全に置き換えるものではありませんが、リソース管理やセキュリティの観点から補完的に機能します。 - Web アプリケーションのプログラミング側での対応
サーバーサイドアプリケーション(PHP, Python, Node.js など)や、クライアントサイド(JavaScript)で、リクエストのタイムアウトやリソースの消費を意識したプログラミングを行うことです。これにより、Apache 側でのタイムアウトが適切に機能するようにサポートしたり、タイムアウトが発生した場合のユーザーエクスペリエンスを向上させたりします。
Apache サーバー設定による代替/補完
mod_reqtimeout
が特にリクエストの「読み込み」フェーズに特化しているのに対し、Apache には他のタイムアウト関連ディレクティブやモジュールがあります。
a. Timeout
ディレクティブ
これは Apache HTTP Server の最も基本的なグローバルタイムアウト設定です。mod_reqtimeout
が登場する以前から存在し、入出力操作全般のタイムアウトを制御します。
- 設定例
(300秒)# httpd.conf などに記述 Timeout 300
- mod_reqtimeout との違い
Timeout
はより広範なタイムアウトをカバーしますが、mod_reqtimeout
はリクエストのヘッダーとボディの「読み込み」フェーズに特化し、かつレートベースの制御(MinRate
)が可能です。mod_reqtimeout
が有効な場合、リクエスト読み込みに関してはTimeout
の設定よりも優先されます。 - 何をするか
- クライアントが接続を確立するまでの時間。
- クライアントからのリクエスト(全体)を受信するまでの時間。
- サーバーがクライアントに応答を送信するまでの時間。
KeepAliveTimeout
と組み合わせて、持続的接続のアイドル時間を制御する。
b. KeepAliveTimeout
ディレクティブ
HTTPの持続的接続(Keep-Alive)が有効な場合、クライアントが前のリクエストを終えてから次のリクエストを送信するまでのアイドル時間を制御します。
- 設定例
(5秒間アイドル状態が続くと接続を閉じる)# httpd.conf などに記述 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5
- mod_reqtimeout との関連
mod_reqtimeout
はリクエストの「読み込み中」のタイムアウトに焦点を当てるのに対し、KeepAliveTimeout
は「リクエストとリクエストの間」のアイドル状態に焦点を当てます。これらは異なるフェーズを制御しますが、サーバーのリソース管理やDoS対策の観点から両方重要です。 - 何をするか
クライアントが新しいリクエストを送信せず、接続をアイドル状態に保つことができる最大時間を設定します。この時間を超えると、Apache は接続を閉じます。
c. mod_qos
モジュール (Quality of Service)
mod_qos
は、Apache のリソース管理とDoS攻撃対策に特化したより高度なモジュールです。mod_reqtimeout
がリクエストの読み込みに特化しているのに対し、mod_qos
は接続数、帯域幅、CPU使用率など、より多岐にわたるリソースを制御できます。
- 設定例 (非常に複雑なため一部抜粋)
# httpd.conf などに記述 LoadModule qos_module modules/mod_qos.so <IfModule mod_qos.c> # 1つのIPアドレスからの最大同時接続数を50に制限 QS_SrvMaxConnPerIP 50 # リクエストボディの最大サイズを20MBに制限 QS_LimitRequestBody 20000000 # 他にも多数のディレクティブがある </IfModule>
- mod_reqtimeout との関連
mod_qos
にもリクエストのヘッダー/ボディの読み込みタイムアウトに類似した機能がありますが、mod_reqtimeout
はその目的に特化しており、よりシンプルに設定できます。大規模な環境や、より高度なリソース制御が必要な場合にmod_qos
が検討されます。 - 何をするか
- 接続数を制限する (
QS_SrvMaxConnPerIP
) - リクエストボディの最大サイズを制限する (
QS_LimitRequestBody
) - リクエストのキューイングを制御する
- 特定のIPアドレスからのリクエストレートを制限する
- Keep-Aliveタイムアウトの延長など、よりきめ細かい制御が可能。
- 接続数を制限する (
Web アプリケーションのプログラミング側での対応
Apache サーバーの設定とは別に、Web アプリケーション自体がタイムアウトやリソース消費を意識した設計・実装を行うことで、mod_reqtimeout
と連携したり、より良いユーザーエクスペリエンスを提供したりできます。
a. クライアントサイド (JavaScript など) でのタイムアウト設定
WebブラウザやJavaScriptのfetch
API、XMLHttpRequest
オブジェクトには、リクエストのタイムアウトを設定する機能があります。
- JavaScript (Fetch API) の例
const controller = new AbortController(); const id = setTimeout(() => controller.abort(), 10000); // 10秒でタイムアウト fetch('/api/upload', { method: 'POST', body: myFormData, signal: controller.signal // AbortControllerのシグナルを渡す }) .then(response => { clearTimeout(id); if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .catch(error => { if (error.name === 'AbortError') { console.error('Fetch aborted by timeout'); // ユーザーに「アップロードがタイムアウトしました」と表示 } else { console.error('Fetch error:', error); } });
- mod_reqtimeout との関連
サーバー側でRequestReadTimeout
によって接続が切断された場合、クライアント側でこのタイムアウトが設定されていれば、サーバーからの応答がないこと(または不完全な応答)を検知し、ユーザーにエラーメッセージを表示するなど、適切な処理を行うことができます。 - 何をするか
- クライアントがサーバーからの応答を待つ最大時間を設定します。この時間を超えると、クライアント側でエラー処理が行われます。
- これはサーバー側の
mod_reqtimeout
とは逆方向のタイムアウトであり、クライアントがいつまでサーバーからの応答を待つか、という制御です。
b. サーバーサイドアプリケーションでのファイルアップロード処理の最適化
大きなファイルのアップロードでは、RequestReadTimeout
の body
タイムアウトが問題になることがよくあります。
- Node.js (Express with multer) の例 (チャンクアップロードではないが、ファイル処理の一般的な概念)
このようなサーバーサイドのファイル処理ライブラリを使用する際、Apacheのタイムアウト設定と連携して機能することを確認することが重要です。const express = require('express'); const multer = require('multer'); // ファイルアップロードを扱うミドルウェア const app = express(); const upload = multer({ dest: 'uploads/' }); // アップロード先ディレクトリ app.post('/upload-file', upload.single('myFile'), (req, res) => { if (req.file) { console.log('File uploaded:', req.file); res.send('File uploaded successfully!'); } else { res.status(400).send('No file uploaded.'); } }); app.listen(3000, () => { console.log('Server listening on port 3000'); });
- mod_reqtimeout との関連
チャンクアップロードは、個々のチャンクの読み込み時間を短くするため、mod_reqtimeout
がより効果的に機能するように助けます。サーバー側のRequestReadTimeout
を緩めすぎずに、大規模ファイルのアップロードを可能にする理想的な方法です。 - 何をするか
- チャンクアップロード (Chunked Uploads)
大きなファイルを小さな断片(チャンク)に分割し、それぞれを個別のリクエストとしてアップロードします。各チャンクは小さいため、RequestReadTimeout
に引っかかりにくくなります。サーバー側でこれらのチャンクを再構築します。 - ストリーミング処理
リクエストボディを一度にすべてメモリに読み込むのではなく、ストリームとして処理することで、メモリ使用量を抑え、長時間のリクエスト処理にも対応しやすくなります。
- チャンクアップロード (Chunked Uploads)
c. サーバーサイドアプリケーションでのタイムアウト管理 (アプリケーションレベル)
Apacheのタイムアウトとは別に、アプリケーションコード内で独自のタイムアウトを設定することも可能です。
- Python (Flask with Gunicorn, uWSGIなど) の例
WSGIサーバー(Gunicornなど)は、アプリケーションワーカーのタイムアウトを設定できます。
(60秒以上応答がないワーカーは再起動される)# Gunicorn を実行する際のコマンド例 gunicorn --workers 4 --timeout 60 app:app
- mod_reqtimeout との関連
mod_reqtimeout
はリクエストの「受信」段階でのタイムアウトですが、アプリケーションレベルのタイムアウトはリクエストを「処理」する段階でのタイムアウトです。両方を設定することで、より堅牢なシステムを構築できます。例えば、Apacheがリクエストを正常に受信しても、アプリケーションの処理が遅延すれば、アプリケーション側のタイムアウトが発動する可能性があります。 - 何をするか
- 特定のAPI処理が長時間かかる場合、その処理自体にタイムアウトを設定し、規定時間内に完了しない場合はエラーを返すようにします。
- データベースクエリや外部API呼び出しなど、依存するサービスが応答しない場合のタイムアウトを設定します。