<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mod-Proxy on K-Life Hack | システムアーキテクチャ &amp; DevOps</title><link>https://klifehack.com/tags/mod-proxy/</link><description>Recent content in Mod-Proxy on K-Life Hack | システムアーキテクチャ &amp; DevOps</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Wed, 23 Sep 2026 10:20:37 +0900</lastBuildDate><atom:link href="https://klifehack.com/tags/mod-proxy/index.xml" rel="self" type="application/rss+xml"/><item><title>mod_proxyによるApache HTTP ServerとTomcatの連携制御手法</title><link>https://klifehack.com/p/apache-tomcat-mod-proxy-integration/</link><pubDate>Wed, 23 Sep 2026 10:20:37 +0900</pubDate><guid>https://klifehack.com/p/apache-tomcat-mod-proxy-integration/</guid><description>&lt;p&gt;マルチティアWebアーキテクチャの設計において、静的コンテンツと動的アプリケーションロジックの処理を分離することは、システム全体の可用性とリソース効率を向上させるための標準的なアプローチです。Tomcat単体で静的ファイル（HTML、CSS、JavaScript、画像など）を処理させる構成は、JVMのガベージコレクション（GC）のオーバーヘッドを増加させ、スレッドプールを不要に消費する原因となります。&lt;/p&gt;&#10;&lt;p&gt;本稿では、フロントエンドのWebサーバーおよびリバースプロキシとしてApache HTTP Server（以下、Apache）を配置し、バックエンドのWebアプリケーションサーバー（WAS）であるApache Tomcat（以下、Tomcat）へ動的リクエストを転送する連携基盤の構築手順を解説します。連携モジュールには、バイナリプロトコルであるAJP（mod_jk）に比べ、設定がシンプルでHTTP/1.1の標準的なセマンティクスを維持しやすい&lt;code&gt;mod_proxy_http&lt;/code&gt;を採用します。&lt;/p&gt;&#10;&lt;h2 id="システムトポロジーと検証環境"&gt;システムトポロジーと検証環境&#10;&lt;/h2&gt;&lt;p&gt;本構成は、同一ホスト内にApacheとTomcatを共存させるコロケーションモデルを前提としています。マルチノード構成に拡張する場合は、プロキシ転送先のアドレスを対象WASのIPアドレスに適宜変更してください。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;b&gt;OS&lt;/b&gt;: Ubuntu 24.04 LTS&lt;/li&gt;&#10;&lt;li&gt;&lt;b&gt;フロントエンド&lt;/b&gt;: Apache HTTP Server (Port 80)&lt;/li&gt;&#10;&lt;li&gt;&lt;b&gt;バックエンド&lt;/b&gt;: Apache Tomcat 10.1.59 (Port 8080 / localhost)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="apache-http-serverの導入と初期設定"&gt;Apache HTTP Serverの導入と初期設定&#10;&lt;/h2&gt;&lt;p&gt;まず、リバースプロキシとなるApacheおよび負荷テスト等で使用するユーティリティパッケージをインストールします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# パッケージインデックスの更新&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Apache2およびユーティリティツールのインストール&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install apache2 apache2-utils -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# サービスの有効化と起動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable --now apache2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インストール完了後、ブラウザまたは&lt;code&gt;curl&lt;/code&gt;コマンドを用いて、Apacheがポート80で正常に待機していることを確認します。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="apache-tomcatの導入とサービス化"&gt;Apache Tomcatの導入とサービス化&#10;&lt;/h2&gt;&lt;p&gt;Tomcat 10系は動作環境としてJava 11以上を要求します。セキュリティを担保するため、Tomcat専用の非特権システムユーザーを作成した上でバイナリを配置します。&lt;/p&gt;&#10;&lt;h3 id="1-java-runtime-environment-jdk-のインストール"&gt;1. Java Runtime Environment (JDK) のインストール&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install openjdk-11-jdk -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-システムユーザーおよびディレクトリの作成"&gt;2. システムユーザーおよびディレクトリの作成&#10;&lt;/h3&gt;&lt;p&gt;シェルログイン権限を持たないシステムアカウントを作成し、プロセスの実行権限を隔離します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# インストール先ディレクトリの作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -p /opt/tomcat&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ログインシェルを無効化したtomcatユーザーの作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo useradd -r -s /bin/false -d /opt/tomcat tomcat&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-バイナリのダウンロードと権限設定"&gt;3. バイナリのダウンロードと権限設定&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.59/bin/apache-tomcat-10.1.59.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# アーカイブを展開し、最上位ディレクトリのラッパーを除去して配置&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo tar xzvf apache-tomcat-10.1.59.tar.gz -C /opt/tomcat --strip-components&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 所有権をtomcatユーザーに変更&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown -R tomcat:tomcat /opt/tomcat&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chmod +x /opt/tomcat/bin/*.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-systemdサービスユニットの定義"&gt;4. systemdサービスユニットの定義&#10;&lt;/h3&gt;&lt;p&gt;TomcatのライフサイクルをOSのサービス管理下に置くため、&lt;code&gt;/etc/systemd/system/tomcat.service&lt;/code&gt;を作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Unit]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Description&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;Tomcat 10 servlet container&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;After&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;network.target&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Service]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Type&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;forking&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;User&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;tomcat&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Group&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;tomcat&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Environment&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Environment&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;CATALINA_HOME=/opt/tomcat&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Environment&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;CATALINA_BASE=/opt/tomcat&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ExecStart&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/opt/tomcat/bin/startup.sh&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ExecStop&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/opt/tomcat/bin/shutdown.sh&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Install]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;WantedBy&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;multi-user.target&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで&lt;code&gt;Type=forking&lt;/code&gt;を指定することは極めて重要です。Tomcatの起動スクリプト（&lt;code&gt;startup.sh&lt;/code&gt;）は、内部でJavaプロセスをバックグラウンドへフォーク（fork）して実行します。もし&lt;code&gt;Type=simple&lt;/code&gt;を指定した場合、systemdは起動スクリプトの終了と同時にサービスが停止したと誤認し、プロセスを強制終了してしまいます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# systemd設定の再読み込みとサービス起動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl daemon-reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable --now tomcat&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="検証用jspアーティファクトの作成"&gt;検証用JSPアーティファクトの作成&#10;&lt;/h2&gt;&lt;p&gt;プロキシ経由での動的スクリプト実行を検証するため、Tomcatのドキュメントルートにシステム時刻を出力するJSPファイルを配置します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo nano /opt/tomcat/webapps/ROOT/test.jsp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;```&lt;/span&gt;jsp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;amp;lt;%@ page contentType&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text/html; charset=UTF-8&amp;#34;&lt;/span&gt; %&amp;amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;amp;lt;%@ page import&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;java.util.Date&amp;#34;&lt;/span&gt; %&amp;amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Integration Test&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;body&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;h1&amp;gt;Apache &amp;amp;amp; Tomcat Integration Test&amp;lt;/h1&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;h3&amp;gt;Current Time: &amp;amp;lt;%&lt;span style="color:#f92672"&gt;=&lt;/span&gt; new Date&lt;span style="color:#f92672"&gt;()&lt;/span&gt; %&amp;amp;gt;&amp;lt;/h3&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Request URI: &amp;amp;lt;%&lt;span style="color:#f92672"&gt;=&lt;/span&gt; request.getRequestURI&lt;span style="color:#f92672"&gt;()&lt;/span&gt; %&amp;amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/body&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="mod_proxyによる連携設定"&gt;mod_proxyによる連携設定&#10;&lt;/h2&gt;&lt;p&gt;Apacheでリバースプロキシ機能を有効化するには、&lt;code&gt;proxy&lt;/code&gt;モジュールおよびHTTPプロトコルを処理する&lt;code&gt;proxy_http&lt;/code&gt;モジュールを有効化する必要があります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo a2enmod proxy proxy_http&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、&lt;code&gt;/etc/apache2/sites-available/000-default.conf&lt;/code&gt;を編集し、プロキシ転送ルールを定義します。要件に応じて以下のいずれかの戦略を選択します。&lt;/p&gt;&#10;&lt;h3 id="パターンaグローバルリバースプロキシ全リクエストを転送"&gt;パターンA：グローバルリバースプロキシ（全リクエストを転送）&#10;&lt;/h3&gt;&lt;p&gt;すべてのクライアントリクエストをバックエンドのTomcatへ透過的に転送する構成です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-apache" data-lang="apache"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;virtualhost&lt;/span&gt; &lt;span style="color:#e6db74"&gt;*:80=&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ProxyPreserveHost &lt;span style="color:#66d9ef"&gt;On&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ProxyPass / http://localhost:8080/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ProxyPassReverse / http://localhost:8080/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/virtualhost&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;&lt;code&gt;ProxyPreserveHost On&lt;/code&gt;&lt;/b&gt;: クライアントが送信したオリジナルの&lt;code&gt;Host&lt;/code&gt;ヘッダーをバックエンドのTomcatに引き渡します。これにより、Tomcat側でのバーチャルホスト判定やURL生成が正しく機能します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;b&gt;&lt;code&gt;ProxyPass&lt;/code&gt;&lt;/b&gt;: 特定のパスに対するリクエストを、指定したバックエンドサーバーへマッピングします。&lt;/li&gt;&#10;&lt;li&gt;&lt;b&gt;&lt;code&gt;ProxyPassReverse&lt;/code&gt;&lt;/b&gt;: Tomcatが返却するリダイレクト応答（&lt;code&gt;Location&lt;/code&gt;ヘッダーなど）に含まれるスキーマやホスト名を、Apache側の公開アドレスに書き換えます。これにより、クライアントが直接ポート8080にリダイレクトされるのを防ぎます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="パターンbセレクティブルーティングjspのみを転送"&gt;パターンB：セレクティブルーティング（JSPのみを転送）&#10;&lt;/h3&gt;&lt;p&gt;静的コンテンツはApacheが直接高速に処理し、&lt;code&gt;.jsp&lt;/code&gt;拡張子を持つ動的リクエストのみをTomcatへルーティングする高効率な構成です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-apache" data-lang="apache"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;virtualhost&lt;/span&gt; &lt;span style="color:#e6db74"&gt;*:80=&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ProxyRequests &lt;span style="color:#66d9ef"&gt;Off&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ProxyPreserveHost &lt;span style="color:#66d9ef"&gt;On&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;locationmatch&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;\.jsp$&amp;#34;=&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ProxyPass http://localhost:8080&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ProxyPassReverse http://localhost:8080&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/locationmatch&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/virtualhost&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;&lt;code&gt;ProxyRequests Off&lt;/code&gt;&lt;/b&gt;: オープンプロキシ（フォワードプロキシ）としての動作を明示的に無効化し、セキュリティ脆弱性を排除します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;b&gt;&lt;code&gt;&amp;lt;locationmatch &amp;quot;\.jsp$&amp;quot;=&amp;quot;&amp;quot;&amp;gt;&lt;/code&gt;&lt;/locationmatch&gt;&lt;/b&gt;: 正規表現を用いて、末尾が&lt;code&gt;.jsp&lt;/code&gt;で終わるURIのみをプロキシ転送の対象とします。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;設定変更後、構文チェックを実行し、Apacheを再起動します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 設定ファイルの構文チェック&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apache2ctl configtest&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# サービスの再起動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart apache2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="ライフサイクルとゼロダウンタイムへの配慮"&gt;ライフサイクルとゼロダウンタイムへの配慮&#10;&lt;/h2&gt;&lt;p&gt;本番環境においてTomcatのローリングアップデートやコンテナの再配置を行う際、単純にTomcatプロセスを停止すると、Apache側で一時的に&lt;code&gt;503 Service Unavailable&lt;/code&gt;が発生します。これを回避するためには、以下の設計を考慮する必要があります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;b&gt;接続プーリングとタイムアウトの最適化&lt;/b&gt;: &lt;code&gt;ProxyPass&lt;/code&gt;ディレクティブに&lt;code&gt;connectiontimeout&lt;/code&gt;や&lt;code&gt;timeout&lt;/code&gt;パラメータを明示的に設定し、バックエンドの無応答時に迅速にフェイルオーバーさせます。&lt;/li&gt;&#10;&lt;li&gt;&lt;b&gt;ドレイン（Draining）状態の活用&lt;/b&gt;: ロードバランサー配下に複数のTomcatノードを配置している場合、対象ノードへの新規セッション割り当てを停止（ドレイン）し、既存セッションが終了した段階で安全にアップデートを実施します。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="troubleshooting"&gt;Troubleshooting&#10;&lt;/h2&gt;&lt;h3 id="1-ポート競合によるtomcatの起動失敗"&gt;1. ポート競合によるTomcatの起動失敗&#10;&lt;/h3&gt;&lt;p&gt;すでに他のプロセスがポート8080を占有している場合、Tomcatは起動に失敗します。この場合、&lt;code&gt;/opt/tomcat/conf/server.xml&lt;/code&gt;を開き、&lt;code&gt;&amp;lt;Connector&amp;gt;&lt;/code&gt;要素の&lt;code&gt;port&lt;/code&gt;属性を競合しないポート（例: 8081）に変更してください。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;connector&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;connectiontimeout=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;20000&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;port=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;8081&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;protocol=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTP/1.1&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;redirectport=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;8443&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/connector&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-パーミッションエラーによるアクセス拒否"&gt;2. パーミッションエラーによるアクセス拒否&#10;&lt;/h3&gt;&lt;p&gt;Tomcatの実行ユーザー（&lt;code&gt;tomcat&lt;/code&gt;）に、&lt;code&gt;/opt/tomcat&lt;/code&gt;配下のファイル読み込み・実行権限が正しく付与されていない場合、起動スクリプトがエラーを吐き出します。ディレクトリの所有権が&lt;code&gt;tomcat:tomcat&lt;/code&gt;になっているか再確認してください。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown -R tomcat:tomcat /opt/tomcat&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-selinux--apparmorによる接続拒否"&gt;3. SELinux / AppArmorによる接続拒否&#10;&lt;/h3&gt;&lt;p&gt;セキュリティモジュールが有効な環境では、Apacheからローカルポートへのアウトバウンド通信がブロックされることがあります。SELinux環境下でプロキシ通信を許可するには、以下のブール値を有効化します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo setsebool -P httpd_can_network_connect &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="稼働状態の検証ログ"&gt;稼働状態の検証ログ&#10;&lt;/h2&gt;&lt;p&gt;システムが正常に動作している場合の各種コマンドの出力プロトコル例を以下に示します。&lt;/p&gt;&#10;&lt;h3 id="ポートバインド状況の確認-ss--tulpn"&gt;ポートバインド状況の確認 (&lt;code&gt;ss -tulpn&lt;/code&gt;)&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((&amp;#34;apache2&amp;#34;,pid=1024,fd=4))&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tcp LISTEN 0 100 127.0.0.1:8005 0.0.0.0:* users:((&amp;#34;java&amp;#34;,pid=2048,fd=15))&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tcp LISTEN 0 100 *:8080 *:* users:((&amp;#34;java&amp;#34;,pid=2048,fd=12))&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="tomcatサービスステータスの確認-systemctl-status-tomcat"&gt;Tomcatサービスステータスの確認 (&lt;code&gt;systemctl status tomcat&lt;/code&gt;)&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;● tomcat.service - Tomcat 10 servlet container&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; preset: enabled)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Active: active (running) since Wed 2026-09-23 10:00:00 UTC; 5m ago&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Process: 2040 ExecStart=/opt/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Main PID: 2048 (java)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Tasks: 32 (limit: 4615)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Memory: 142.5M&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CPU: 1.82s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CGroup: /system.slice/tomcat.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─2048 /usr/lib/jvm/java-11-openjdk-amd64/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="httpレスポンスヘッダーの検証-curl--i"&gt;HTTPレスポンスヘッダーの検証 (&lt;code&gt;curl -I&lt;/code&gt;)&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HTTP/1.1 200 OK&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Date: Wed, 23 Sep 2026 10:05:00 GMT&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Server: Apache/2.4.58 (Ubuntu)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Content-Type: text/html;charset=UTF-8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Content-Length: 245&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Connection: keep-alive&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;⚠️ &lt;b&gt;注意&lt;/b&gt;: &lt;code&gt;Server&lt;/code&gt;ヘッダーに&lt;code&gt;Apache&lt;/code&gt;が表示されつつ、&lt;code&gt;Content-Type&lt;/code&gt;にTomcat側で処理された&lt;code&gt;charset=UTF-8&lt;/code&gt;が返却されていることから、プロキシ連携が正常に機能していることが実証されます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="operational-notes"&gt;Operational Notes&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;b&gt;本番環境におけるテストファイルの削除&lt;/b&gt;: 本番環境へのデプロイ前に、システム情報やパス構造を露呈させるリスクのある&lt;code&gt;test.jsp&lt;/code&gt;などの検証用スクリプトは必ず削除してください。&lt;/li&gt;&#10;&lt;li&gt;&lt;b&gt;タイムアウト値のチューニング&lt;/b&gt;: クライアントとApache間、およびApacheとTomcat間のタイムアウト値（&lt;code&gt;KeepAliveTimeout&lt;/code&gt;, &lt;code&gt;ProxyTimeout&lt;/code&gt;）を整合させることで、不要なゾンビコネクションの滞留を防ぎ、リソースの枯渇を防止できます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>