自己学習で,バックエンドにPythonを使ったWebアプリを製作しています。
(プロジェクトの詳細は後日掲載します)
製作にあたり,Webアプリの仕組みについて学んだ内容をまとめてみました。
動作環境
Webアプリは,基本的に以下のように
- クライアントとWebサーバ
- アプリサーバ
- データベースサーバ
の3層構造となります。
各層のミドルウェアロゴは一例です
-
クライアント(ブラウザ)
ブラウザに表示されたWebアプリをユーザが操作することで,URLのホスト名が該当するサーバ宛にhttpリクエストを送信し,応答として返されたHTMLファイルをブラウザへ表示する。
-
Webサーバ
サーバ内のWebサーバにて,クライアントの要求(リクエスト)のアプリケーションへの振り分けや,アプリケーションの処理結果のクライアントへの応答(レスポンス)を行う。また,不正な通信の遮断や負荷の分散なども行う。
-
アプリサーバ(アプリケーション)
サーバ内のアプリケーションにて,リクエストの内容に応じた処理を実行し,処理結果や取得したデータを反映したHTMLファイルをWebサーバへ返す。
-
データベースサーバ(DBMS)
サーバ内のDBMS(データベースマネジメントシステム)にて,アプリケーションから送信されるクエリに応じて,該当するデータベースから取得したデータを返す。
リクエスト通信内容
1. クライアント ~ Webサーバ
上図のように,ユーザがWebサイトのリンクやボタンを押下すると,URLのHost名が該当するWebサーバ宛(ここではDNSサーバの説明は省略します)に以下のような,要求(httpリクエスト)が送信されます。
GET /website HTTP/1.1
Host: www.kachi.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-US;q=0.9
Connection: keep-alive
Cookie: session_id=abc123xyz
2. Webサーバ ~ アプリサーバ
Webサーバは,受信したリクエストのパス(上図の ”website" や "content" )に応じて,あらかじめ設定された転送先のアプリケーションへリクエストを転送します。
この仕組みを「リバースプロキシ」 と呼びます。
ただし,リクエストのパスが静的ページ("page.html"のようにHTMLファイル指定)の場合は,転送せずWebサーバが直接応答します。
3. アプリサーバ ~ データベースサーバ
アプリケーションとデータベースは,上図のようにデータを取得したいデータベースを管理しているDBMSへ対し,そのDBMSに応じた通信方式で接続を行います。
接続後,データベースとテーブルおよび取得したいデータを指定したクエリ(SQL)を送信します。
レスポンス通信内容
1. データベースサーバ ~ アプリサーバ
クエリが成功の場合は,
・結果セット(取得したデータや,列名・型などの情報)
失敗の場合は,
・エラーコード
・エラーメッセージ
などが返されます。
2. アプリサーバ ~ Webサーバ
アプリケーションは,
・ステータスコード(成功の"200"や,ページが見つからない"404"など)
・処理によって生成したHTMLおよび取得したデータ
をWebサーバへ返します。
3. Webサーバ ~ クライアント
Webサーバは,アプリケーションから受け取ったレスポンスをクライアントへ返し,ブラウザは受け取ったレスポンスのコンテンツを表示し,通信が終了します。
さいごに
学習の過程でまとめた内容のため,内容には理解不足や誤りが含まれている可能性があります。
お気づきの点があれば、ご指摘いただけると幸いです。






