【プログラミング】【java】ApatchとTomcat連携によるJavaアプリケーション動作フロー - j-komatsu/myCheatSheet GitHub Wiki

ApatchとTomcat連携によるJavaアプリケーション動作フロー

前提条件

  • サーバー構成: Apatchをフロントエンドサーバー、Tomcatをアプリケーションサーバーとして使用。
  • アプリケーションフレームワーク: Spring Bootを利用。
  • データベース: Oracleを使用(接続設定はSpring Bootのapplication.propertiesで管理)。
  • 通信プロトコル: AJP (Apache JServ Protocol) を使用してApatchとTomcatを連携。
  • 開発環境: Eclipseベース。

概要

このチートシートでは、Apatchをフロントエンドサーバー、Tomcatをアプリケーションサーバーとして、静的ファイル配信、APIリクエスト処理、データベースアクセスを連携させる設定や動作フローを解説します。対象はSpring Bootアプリケーションです。


設定ファイル

1. Apatch設定

ApatchがTomcatと連携するために必要な設定です。

httpd.confまたはworkers.properties

# 必要なモジュールを有効化
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

# AJPプロトコルでTomcatにリクエストを転送
ProxyPass /app ajp://localhost:8009/app
ProxyPassReverse /app ajp://localhost:8009/app
  • ProxyPass/ProxyPassReverse:
    • /appで始まるリクエストをTomcatへ転送。
    • 注意: /appはプロジェクトに応じて変更可能。

必要に応じた設定変更

# デフォルトでは8009を使用。変更する場合:
ProxyPass /app ajp://localhost:<custom-port>/app
  • localhostとは?
    • サーバー自身を指す特別なアドレス。サーバーがリモートに存在する場合は、そのサーバーのIPアドレス(例: 192.168.1.100)を指定します。

2. Tomcat設定

TomcatがApatchからのAJPリクエストを受け取るための設定です。

server.xml

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
  • ポート番号: デフォルトの8009を使用。変更が必要な場合はApatch側も合わせて修正してください。
  • redirectPort: HTTPSリダイレクトを指定(必要に応じて設定)。
  • 別サーバー構成: ApatchとTomcatが別サーバーに配置されている場合、ApatchのProxyPass設定にTomcatのIPアドレスを指定します。

例:

ProxyPass /app ajp://192.168.1.100:8009/app
ProxyPassReverse /app ajp://192.168.1.100:8009/app

3. Spring Boot設定

Spring BootアプリケーションがOracleデータベースに接続するための設定です。

application.properties

# データベース接続情報
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=your_username
spring.datasource.password=your_password

# JPA設定
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle12cDialect
  • spring.datasource.url: Oracleの接続URL(デフォルト: ローカルホスト)。
    • 別サーバーにデータベースがある場合は、そのIPアドレスを指定します(例: jdbc:oracle:thin:@192.168.1.200:1521:xe)。
  • spring.datasource.username/password: データベースのユーザー情報。
  • spring.jpa.hibernate.ddl-auto: テーブルの自動更新設定。

動作フロー

以下はブラウザリクエストからレスポンス返却までの一連の流れです。

1. 静的ファイル配信

  1. ユーザーがブラウザでhttp://example.com/index.htmlにアクセス。
  2. Apatchが静的ファイル(HTML/画像)を直接返却。

2. APIリクエスト処理

  1. ユーザーがhttp://example.com/api/userにリクエスト。
  2. ApatchがAJP経由でリクエストをTomcatへ転送。
  3. TomcatがSpring Bootアプリケーションを起動し、リクエストを処理。
  4. Spring Bootがデータベースにアクセス(例: ユーザー情報の取得)。
  5. Tomcatを通じてレスポンスをApatchへ返却し、最終的にブラウザに表示。

3. データベースアクセス

  • リクエスト例: 商品リストを取得するAPI(/api/products)。
  • データベースへのアクセスはSpring JPAが自動的に処理。

気を付けるポイント

  1. AJP設定時の注意

    • AJPポート(8009)のセキュリティ強化(ファイアウォール設定やIP制限)。
    • ポート番号を変更する場合、ApatchとTomcatの両方で統一が必要。
  2. Tomcatの設定ミス

    • server.xmlでAJPコネクタが有効になっているか確認。
    • Spring Bootアプリケーションが正しいパスでデプロイされているか確認。
  3. Spring Bootアプリケーション

    • データベース接続情報(URL、ユーザー名、パスワード)の誤りに注意。
    • 必要な依存関係(例: spring-boot-starter-data-jpa)が含まれているか確認。

用語集


小学生にもわかる動作フロー

  1. Apatchくん: 玄関でお客さん(ブラウザのリクエスト)を迎えるお兄さん。

    • 「静的ファイル(写真や文章)」ならその場で渡してくれる。
    • 「難しい注文(APIリクエスト)」は、奥の部屋のTomcatくんに頼む。
  2. Tomcatくん: 奥の部屋でいろんな作業をする職人さん。

    • Apatchくんから依頼を受けて、必要な作業をしてくれる。
    • 例えば、「このお客さんのデータが知りたい」と言われたら、メモを見たり、さらに奥のOracle博士に聞いたりする。
  3. Oracle博士: 奥の奥にいる物知り博士。

    • たくさんの情報(データベース)を持っていて、Tomcatくんが「これ教えて!」とお願いすると、すぐに教えてくれる。
  4. お客さんへのお返事:

    • Oracle博士が教えた情報をTomcatくんがまとめて、Apatchくんに渡す。
    • Apatchくんがお客さんに「どうぞ!」と返事をする。

これで、お客さんは必要なものを手に入れることができるよ!