タイムアウトと一言で言ってもいろいろな意味や状況が考えられます。
今回は「タイムアウト(Timeout)」について解説します。
タイムアウト(Timeout)とは?
タイムアウトとは、分かりやすくいうと「時間切れによる終了」という意味です。
Webやネットワークなどでタイムアウトが設定されていることがありますが、時間もまちまちです。
「4分」、「60分」、「3時間」、「なし(無制限)」など設定もバラバラです。
システムの機能や状況によりタイムアウトの設定値が変わります。
静的ページで前後のつながりがなければ「タイムアウト」は不要
単純な静的ページ(index.html)を表示しているだけなら「タイムアウト」という概念はありません。
クライアントブラウザからリクエストが来たら、そのページを返すだけです。
静的なページでブラウザよりWebサイトにアクセスして一度ページを表示してしまえば、そのページはローカルコンピュータのメモリ上に残ります。
その後はLANケーブルが抜けようが、FWで遮断されようが、Webサーバーがシャットダウンしようが、ローカルコンピュータのブラウザより閲覧できます。(もちろん、ページ移動はできませんが)
静的なページの場合は「タイムアウト」という概念はないので、その瞬間瞬間でページにアクセスできればいいだけの話です。
しかし会員サイトでアカウントを特定してログイン処理をするといったシステムでは「セッション」が必要になり、セッションが必要なサイトは「タイムアウト」を設定することが多いです。
※設定していないサイトもあります。その場合は、ログイン処理でパスワードの入力待ちで1日経っても問題なくパスワード入力でログインできたりします。ただしセキュリティ上問題があります。
様々なタイムアウトがある
- ブラウザのタイムアウト(IE、Firefoxなど)
- Webサーバーのタイムアウト(Apacheなど)
- リクエストタイムアウト
- レスポンスタイムアウト
- APIサーバーのタイムアウト(Tomcatなど)
- Amazon ELB のタイムアウト
通信には「タイムアウト」と「接続拒否」がある
- タイムアウト ← そもそも宛先が存在しない
- 接続拒否 ← 宛先は存在するが許可されていない(FWでブロックなど)
以下は存在しないURLを指定した場合です。
5秒くらい経過して下図のように「このサイトにアクセスできません」のメッセージが表示されます。
接続拒否の場合は、すぐにレスポンスが返ってきます。
【HTTP セッションタイムアウト】Web サーバーのセッションタイムアウト
ブラウザが Web サーバーにリクエストを送信しセッションが張られた後、ブラウザから全く通信が来ない場合、Webサーバー側では、ユーザーがまだ閲覧しているのか、それとも閲覧を終了してしまったのかを知ることができません。
その場合、Webサーバーがブラウザからの次の通信を待ち続けると以下の問題が発生します。
- セッションを張り続けることで無駄にリソースを消費する
- セッションを残し続けるとセキュリティが低下する
そのため、セッションを張るような Web サーバー(Web サービス)の場合は一定時間でセッションを「タイムアウト」させて終了させるようにしています。
(サーバー側のポリシーで敢えてセッションを終了させずに残し続けることもあります)
セッションがタイムアウトすると、セッションを維持するために使用されていたサーバー上のリソースは解放されます。
【Apache】httpd.conf でのタイムアウト
Apache のバージョンは「2.4.6」です。
[root@SAKURA_VPS ~]# httpd -v |
- KeepAliveTimeout ディレクティブ
- TimeOut ディレクティブ
KeepAliveTimeout ディレクティブ
KeepAliveTimeout ディレクティブは、持続的な接続の場合、次のリクエストが来るまでサーバーが待つ時間を設定します。
デフォルトでは「5秒」になっています。
TimeOut ディレクティブ
TimeOut ディレクティブは、リクエストを失敗させるまでにサーバーが待つ時間を設定します。
デフォルトでは「60秒」になっています。
※2.2では「300秒」になっています。バージョンによりデフォルト値が異なることがあります。
HTTPステータス
HTTPステータスのタイムアウトは以下の2種類があります。
- 408 Request Timeout ← リクエストタイムアウト。リクエストが時間以内に完了していない場合に返されます。
- 504 Gateway Timeout ← ゲートウェイタイムアウト。ゲートウェイ・プロキシサーバは URI から推測されるサーバからの適切なレスポンスがなくタイムアウトした場合です。
Google Chrome で HTTP ステータスが簡単に分かる拡張機能
Google Chrome の拡張機能「HTTP Status」をインストールすると簡単に HTTP ステータスを確認できます。
HTTP Status
https://chrome.google.com/webstore/detail/http-status/cknfnacbckhfpjahnmkblajcpledpfnp
上記 URL にアクセスしたら右上にある「CHROME に追加」ボタンをクリックします。
拡張機能「HTTP Status」を導入すると下図のように右上に「HTTP ステータス」が表示されるようになります。
ブラウザ側のタイムアウト
IE(Internet Explorer)の場合
HTTP KeepAlive タイムアウト値で設定しています。
HTTP KeepAlive タイムアウト値 ← デフォルト 1分
マイクロソフト公式サイト
Internet Explorer の既定の Keep-Alive タイムアウト値を変更する方法
https://support.microsoft.com/ja-jp/help/813827
以下の手順でレジストリで設定できます。
- 以下のレジストリキーに移動します。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings - 新規追加で「KeepAliveTimeout」という名前の DWORD 値を追加し、待機時間を設定します。
単位はミリセコンド(1/1000秒)です。
ブラウザ側のタイムアウト値と Web サーバー側のタイムアウト値が異なった場合
例えば以下の場合
- ブラウザのタイムアウト値 1分
- Web サーバー側のタイムアウト値 3分
この場合はブラウザのタイムアウト値が 1分なので「1分」でタイムアウトになります。
Tomcat のタイムアウト
Apache と Tomcat が連携している場合は、Apache 側でセッションタイムアウトの設定をするので、Tomcat 側でも設定することはあまりないのかもしれませんが「web.xml」ファイルでセッションタイムアウトの設定をすることができます。
数値の単位は「分」です。
<session-config> |
コメント