こんにちは!運営者のハックです!
今回はデイトラJavaコースWebアプリ開発編のDay2として「アプリケーションサーバーについて」について学習しましたので、紹介します。
アプリケーションサーバーとは
アプリケーションサーバ(APサーバ)とは、インターネットを通じてユーザーのリクエストを処理し、その結果を返す特別なコンピュータです。ショッピングサイトでの検索や購入手続きなどを支えています。APサーバは、プログラムで作られたアプリケーションを実行し、Webサーバを介してクライアントに結果を返します。
Webサーバは、クライアントからのリクエストに応じてHTMLや画像などを返す役割を持ち、クライアントとAPサーバの間を繋ぐ役割を果たします。構成を図にすると、以下のような構造となり、このような構造を「Web三層構造」と表現します。
三層構造についてはデイトラJava中級編Day38「3層構造、MVC」の回で習ったのにゃ!
アプリケーションサーバ(APサーバ)は内部的にWebサーバーの機能も持ち、プログラムの処理だけでなく、ブラウザとの連携によるWeb処理も行います。
ただし、APサーバのWebサーバ機能は簡易的で、大量のアクセスには対応できません。そのため、多くのユーザーが利用するサービスでは、専用のWebサーバを設けて処理を分担します。
アプリケーションサーバの種類
プログラミング言語やフレームワークによって利用するアプリケーションサーバが異なります。選定する基準としては、言語やフレームワークの特性、サービス規模が基準となってきます。
言語ごとに利用される主なアプリケーションサーバは以下の通りです。
Java
- Apache Tomcat: 軽量で広く使われている。ServletやJSPをサポート。
- Wildfly: フル機能のJava EEをサポート。豊富な機能セットと高度な管理機能を提供。
- WebLogic: エンタープライズ向けのJava EEアプリケーションサーバ。
PHP
- Apache HTTP Server + PHP: LAMPスタックの一部として広く利用。
- Nginx + PHP-FPM: 高パフォーマンスなWebサーバ構成。
Ruby
- Puma: 高い並行処理性能を持ち、Railsアプリケーションでよく使用される。
- Unicorn: マルチプロセスのアプリケーションサーバで、並列処理に優れる。
Python
- Gunicorn: WSGIアプリケーションサーバで、DjangoやFlaskと共に使われる。
- uWSGI: 高性能で多機能、様々なWebフレームワークをサポート。
Node.js
- Express.js: 軽量でシンプルなWebアプリケーションフレームワーク。
- Koa.js: エレガントでシンプルなAPIを持つ、次世代のWebフレームワーク。
.NET
- Kestrel: ASP.NET Coreのデフォルトサーバー、軽量かつ高性能。
- IIS: Windows環境で広く使われる、強力なWebサーバー。
今回はJavaで利用するアプリケーションサーバの例のうち、上記で紹介した3種類について詳しく解説します。
Apache Tomcat
引用:Apache Tomcat® – Welcome!
Apache Tomcatは、Java ServletやJSP等をサポートするOSS(オープンソースソフトウェア)です。Apache TomcatはJava EEの仕様に基づく軽量かつ堅牢なサーブレットコンテナで、Javaアプリケーションのデプロイによく使用されます。Spring Bootにも組み込まれています。他のフル機能のアプリケーションサーバに比べて軽量で起動が速く、シンプルな構成が特徴です。オープンソースで広く利用されており、特に開発やテスト環境で一般的です。Java Servlets、JSP、WebSocketなどをサポートし、必要に応じて機能を拡張できます。
Wildfly
引用:Wildfly
Wildflyは、Java EEのアプリケーションサーバの一種であり、豊富な機能セットと高度な管理機能を備えてます。以前「JBoss AS」として知られていたRed Hatが開発するオープンソースのアプリケーションサーバで、フル機能のJava EEをサポートしています。スケーラビリティとパフォーマンスに優れており、最新のEE仕様に迅速に対応します。モジュール管理により必要な機能のみを有効化でき、使いやすい管理インターフェースで設定や管理が容易です。クラスター機能や分散処理をサポートし、大規模なエンタープライズ環境にも対応可能です。
WebLogic
引用:Weblogic Server | オラクル | Oracle 日本
WebLogicは、Oracleが提供する商用のJava EEアプリケーションサーバで、高い信頼性とスケーラビリティを備えています。エンタープライズ環境向けに設計されており、企業の業務システムに必要なさまざまな機能をサポートします。特に銀行や保険会社などの大規模な企業システムで広く利用され、クラウド環境との連携も強化されています。これにより、ハイブリッドクラウドやマルチクラウド環境での使用も可能です。
アプリケーションサーバの主な機能
アプリケーションサーバの役割は「アプリケーションの実行」以外にも多くの重要な機能を持っています。アプリケーションサーバの代表的な機能例は以下の通りです。
データベース接続(コネクト機能)
データベース接続(コネクト機能)は、アプリケーションとデータベースを連携させるための重要な役割を果たします。具体的には以下のような役割があります。
- データの読み書き:アプリケーションがデータベースにデータを保存したり、保存されたデータを取得したりすることを可能にします。例えば、ユーザーが登録フォームに入力した情報をデータベースに保存したり、保存された情報を画面に表示する場合です。
- データの更新と削除:データベース内のデータを更新したり削除したりする操作をサポートします。例えば、ユーザーがプロフィール情報を更新したり、不要なデータを削除する場合です。
- データの管理:複数のユーザーやアプリケーションからの同時アクセスを管理し、データの整合性を保つ役割を果たします。例えば、同時に複数のユーザーがデータを編集する際に、データが矛盾しないように管理します。
- セキュリティ:データベースへのアクセスを制御し、許可されたユーザーだけが特定のデータにアクセスできるようにします。例えば、管理者だけが特定のデータを編集できるように設定する場合です。
- パフォーマンスの最適化:接続プールを利用して、データベース接続の効率を高め、アプリケーションのパフォーマンスを向上させます。例えば、頻繁にデータベースにアクセスするアプリケーションで、接続プールを使うことで毎回新しい接続を確立するコストを削減します。
トランザクション管理
トランザクションは、データベースに対する一連の操作(例えば、データの追加、更新、削除など)をひとまとまりの処理として扱うことです。トランザクションは「全て成功する」か「全て失敗する」のどちらかで完了します。
また、トランザクション処理において重要な「ACID」という特性があります。「Atomicity(原子性)」「Consistency(一貫性)」「Isolation(独立性)」「Durability(永続性)」の頭文字を取ってACID特性と表現します。
原子性 (Atomicity)
- トランザクション内の全ての操作は、一つのまとまりとして実行されます。もし途中でエラーが発生した場合、それまでに行った全ての操作を取り消し(ロールバック)、データベースの状態をトランザクション開始前の状態に戻します。
- 例:銀行での振り込み処理では、お金を送金する口座から引き落とし、受け取り口座に入金する操作をまとめて一つのトランザクションとします。どちらか一方が失敗すると、全ての操作が取り消されます。
一貫性 (Consistency)
- トランザクションが終了した後、データベースは一貫した状態になります。つまり、データベースに設定された制約やルールに違反しないことを意味します。トランザクションの前後でデータの整合性が保たれます。
- 例:商品在庫を管理するシステムで、在庫数が負になることはありません。トランザクション中の操作で在庫が負になりそうな場合、全ての操作が取り消されます。
独立性 (Isolation)
- 複数のトランザクションが同時に実行される場合でも、それぞれのトランザクションは互いに影響を与えず、独立して実行されます。他のトランザクションの途中のデータを見ることはできません。
- 例:同じ商品の在庫を同時に更新する場合、各トランザクションが独立して処理され、データの矛盾を防ぎます。
永続性 (Durability)
- トランザクションが完了すると、その結果は永続的にデータベースに保存されます。システム障害が発生しても、完了したトランザクションの結果は失われません。
- 例:銀行の振り込み処理が完了した後、システムがクラッシュしても、振り込み結果は保持されます。
セキュリティ管理
セキュリティ管理は、アプリケーションやリソースを安全に保つための重要な仕組みです。
以下のような具体的な要素が含まれます。
- 認証 (Authentication):ユーザーが誰であるかを確認するプロセスです。例えば、ユーザー名とパスワードを使ってログインする際、システムは入力された情報を元にユーザーの身元を確認します。
- 認可 (Authorization):認証されたユーザーに対して、どのリソースや操作が許可されているかを決定するプロセスです。例えば、管理者ユーザーにはデータベースへの書き込み権限があるが、一般ユーザーには読み取り権限のみが与えられることがあります。
- データ暗号化 (Data Encryption):データを安全に保つために、特定のアルゴリズムを使ってデータを変換するプロセスです。暗号化されたデータは、正しい鍵を持つ人だけが元のデータを読み取ることができます。これにより、データが盗まれたとしても内容を解読されるリスクが減ります。
- セッション管理 (Session Management):ユーザーがログインしている間、そのセッションを管理するプロセスです。セッション管理では、セッションタイムアウトの設定やセッションIDの保護が重要です。これにより、不正なセッション乗っ取りや長時間のセッション保持によるリスクを低減できます。
アプリケーションサーバは、これらのセキュリティ機能を適切に設定することで、悪意のある攻撃や不正アクセスからアプリケーションとそのデータを保護します。例えば、ファイアウォールの設定や侵入検知システム(IDS)の導入も含まれます。これらの対策を総合的に行うことで、システムのセキュリティレベルを高め、信頼性の高いサービスを提供することができます。
キャッシュ管理
キャッシュ管理は、アプリケーションサーバが頻繁にアクセスされるデータやリソースを一時的に保存する機能です。この仕組みを使うことで、同じデータに対する再処理やデータベースへのアクセスを減らし、アプリケーションのパフォーマンスを向上させることができます。キャッシュは高速なメモリ領域に配置されるため、データの取得や処理にかかる時間を大幅に短縮することができます。しかし、キャッシュを使いすぎるとデータの一貫性が保てなくなるため、バランスを取ることが重要です。
現在のWeb開発では、フレームワークを活用することが一般的です。そのため、開発者がアプリケーションサーバの設定を直接操作することは少なく、フレームワークを通じて操作することが多くなっています。例えば、JavaのフレームワークであるSpring Bootは、内部にApache Tomcatを組み込んでいます。そのため、セッション管理機能については、Spring Bootの「Spring Session」を使うことで、Apache Tomcatのセッション管理機能を拡張・補完することができます。
アプリケーションサーバのセキュリティについて
アプリケーションサーバは外部からのアクセスがあるため、セキュリティ対策をしっかりと行う必要があります。
セキュリティの攻撃例である「クロスサイトスクリプティング(XSS)」、「CSRF(クロスサイトリクエストフォージェリ)」、「SQLインジェクション」については「デイトラJava中級編35 テスト設計、テスト手法」の回で詳しく紹介しているので、そちらを確認してほしいのにゃ!
アプリケーションサーバのログについて
アプリケーションサーバは、システムの動作やエラー、アクセスなどの情報を記録するためにさまざまな種類のログを生成します。これらのログは、システムの監視、トラブルシューティング、セキュリティ監視などに役立ちます。例えば、アプリケーションが正常に動作しているかどうかを確認したり、不正アクセスが発生した場合の追跡に利用できます。ログには、どのユーザーがどのリソースにアクセスしたかや、どのようなエラーが発生したかなどの詳細な情報が含まれており、システム管理者が迅速に対応できるようにします。
以下にログの種類をいくつか紹介します。
アクセスログ
アクセスログは、ユーザーがアプリケーションにアクセスした際の記録です。アクセスログには「クライアントのIPアドレス」「リクエスト日時」「リクエストURL」「HTTPメソッド」「ステータスコード」等が含まれます。これらのログは、アプリケーションへのアクセス状況を把握するのに役立ちます。
具体例
[2023-07-20 12:34:56] 192.168.0.101 "GET /products/123 HTTP/1.1" 200 1432
ユーザーが192.168.0.101
というIPアドレスから/products/123
というURLにアクセスし、HTTPステータスコード200(成功)を受け取った。データサイズは1432バイト。
用途
- トラフィック分析やパフォーマンスのモニタリング。
- 不正アクセスの検出や防止。
エラーログ
エラーログは、アプリケーション内で発生したエラーや例外の記録です。エラーログはアプリケーションの健全性を監視し、トラブルシューティングに重要な情報を提供します。
具体例
[2023-07-20 12:35:10] ERROR - Unable to connect to database: Connection refused
データベース接続が拒否され、接続できなかったエラーが発生した。
用途
- トラブルシューティング。
- バグの検出と修正。
- アプリケーションの安定性向上。
デバッグログ
デバッグログは、開発者がコードの動作を確認するために使用する詳細なログです。デバッグログは開発中やトラブルシューティング時に使用され、アプリケーションの内部動作を理解するのに役立ちます。
具体例
[2023-07-20 12:35:15] DEBUG - Starting method: processOrder
[2023-07-20 12:35:16] DEBUG - Order ID: 456, Customer ID: 789
[2023-07-20 12:35:17] DEBUG - Finished method: processOrder
processOrderメソッドの開始と終了、そしてメソッド内で使用された変数(注文IDと顧客ID)の値を記録している。
用途
- 開発中の問題解決。
- アプリケーションの動作の理解。
- パフォーマンスのボトルネックの特定。
セキュリティログ
セキュリティログは、アプリケーションやシステムへのアクセスに関するセキュリティ関連の記録です。セキュリティログはセキュリティ監視や侵入検知のために使用されます。
具体例
[2023-07-20 12:35:20] SECURITY - User login attempt: username=johndoe, success=true
[2023-07-20 12:36:00] SECURITY - Password change: username=johndoe, success=true
[2023-07-20 12:36:30] SECURITY - Unauthorized access attempt detected from IP: 192.168.0.102
ユーザーjohndoeのログイン試行(成功)、パスワード変更(成功)、およびIPアドレス192.168.0.102
からの不正アクセス試行を記録している。
用途
- セキュリティインシデントの検出と対応。
- 監査目的。
- 規制遵守の証拠。
トランザクションログ
トランザクションログは、データベースで行われたトランザクションの記録です。データの変更や更新履歴を追跡するのに使用されます。
具体例
[2023-07-20 12:37:00] TRANSACTION - BEGIN TRANSACTION ID: 789
[2023-07-20 12:37:01] TRANSACTION - INSERT INTO orders (id, customer_id, amount) VALUES (456, 789, 100.00)
[2023-07-20 12:37:02] TRANSACTION - COMMIT TRANSACTION ID: 789
トランザクションID: 789の開始、注文テーブルへのレコード挿入、そしてトランザクションのコミットを記録している。
用途
- データの整合性の維持。
- トランザクションの履歴の追跡。
- 障害発生時のリカバリ。
まとめ ベースの知識はITパスポートで習得済
今回はアプリケーションサーバについて学習しました。
前回のWebの仕組みについてもそうですが、基本となる知識はITパスポートで学習しております。ITパスポートで出題される内容を学習することにより、IT業界で必要とされる知識を網羅的に学ぶことができました。
もちろん忘れていた部分もありますが、一度学んだ知識なのでスムーズに理解することができています。学習して良かったと実感します。
以上で今回の学習記録を終えます。
ここまでご覧いただきありがとうございました。
コメント