<?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 | Systems Architecture &amp; DevOps</title><link>https://klifehack.com/en/tags/mod-proxy/</link><description>Recent content in Mod-Proxy on K-Life Hack | Systems Architecture &amp; DevOps</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Wed, 23 Sep 2026 10:20:39 +0900</lastBuildDate><atom:link href="https://klifehack.com/en/tags/mod-proxy/index.xml" rel="self" type="application/rss+xml"/><item><title>Integration and Control Methods for Apache HTTP Server and Tomcat Using mod_proxy</title><link>https://klifehack.com/en/p/apache-tomcat-mod-proxy-integration/</link><pubDate>Wed, 23 Sep 2026 10:20:39 +0900</pubDate><guid>https://klifehack.com/en/p/apache-tomcat-mod-proxy-integration/</guid><description>&lt;p&gt;In the design of multi-tier Web architectures, separating the processing of static content and dynamic application logic is a standard approach to improve overall system availability and resource efficiency. A configuration where Tomcat alone processes static files (HTML, CSS, JavaScript, images, etc.) increases JVM garbage collection (GC) overhead and unnecessarily consumes the thread pool.&lt;/p&gt;&#10;&lt;p&gt;This article explains the steps to build an integration infrastructure that deploys Apache HTTP Server (hereinafter referred to as Apache) as a front-end Web server and reverse proxy, and forwards dynamic requests to Apache Tomcat (hereinafter referred to as Tomcat), which is the back-end Web application server (WAS). For the integration module, we adopt &lt;code&gt;mod_proxy_http&lt;/code&gt;, which has a simpler configuration and more easily maintains standard HTTP/1.1 semantics compared to the binary protocol AJP (mod_jk).&lt;/p&gt;&#10;&lt;h2 id="system-topology-and-verification-environment"&gt;System Topology and Verification Environment&#10;&lt;/h2&gt;&lt;p&gt;This configuration assumes a colocation model where Apache and Tomcat coexist on the same host. When expanding to a multi-node configuration, change the proxy forwarding destination address to the IP address of the target WAS as appropriate.&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;Front-end&lt;/b&gt;: Apache HTTP Server (Port 80)&lt;/li&gt;&#10;&lt;li&gt;&lt;b&gt;Back-end&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="installation-and-initial-configuration-of-apache-http-server"&gt;Installation and Initial Configuration of Apache HTTP Server&#10;&lt;/h2&gt;&lt;p&gt;First, install Apache, which will act as the reverse proxy, and the utility packages used for load testing and other purposes.&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;# Update the package index&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;# Install Apache2 and utility tools&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;# Enable and start the service&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;After the installation is complete, verify that Apache is successfully listening on port 80 using a browser or the &lt;code&gt;curl&lt;/code&gt; command.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="installation-and-service-configuration-of-apache-tomcat"&gt;Installation and Service Configuration of Apache Tomcat&#10;&lt;/h2&gt;&lt;p&gt;Tomcat 10 requires Java 11 or higher as its runtime environment. To ensure security, we will create a non-privileged system user dedicated to Tomcat before deploying the binaries.&lt;/p&gt;&#10;&lt;h3 id="1-installing-java-runtime-environment-jdk"&gt;1. Installing 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-creating-the-system-user-and-directory"&gt;2. Creating the System User and Directory&#10;&lt;/h3&gt;&lt;p&gt;Create a system account without shell login privileges to isolate the process execution privileges.&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;# Create the installation directory&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;# Create the tomcat user with a disabled login shell&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-downloading-binaries-and-configuring-permissions"&gt;3. Downloading Binaries and Configuring Permissions&#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;# Extract the archive, removing the top-level directory wrapper&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;# Change ownership to the tomcat user&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-defining-the-systemd-service-unit"&gt;4. Defining the systemd Service Unit&#10;&lt;/h3&gt;&lt;p&gt;To place the Tomcat lifecycle under the service management of the OS, create &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;Specifying &lt;code&gt;Type=forking&lt;/code&gt; here is extremely critical. The Tomcat startup script (&lt;code&gt;startup.sh&lt;/code&gt;) internally forks the Java process to run in the background. If &lt;code&gt;Type=simple&lt;/code&gt; is specified, systemd will misinterpret the termination of the startup script as the service stopping and will force-terminate the process.&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;# Reload systemd configuration and start the service&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="creating-a-jsp-artifact-for-verification"&gt;Creating a JSP Artifact for Verification&#10;&lt;/h2&gt;&lt;p&gt;To verify dynamic script execution via the proxy, place a JSP file that outputs the system time in the Tomcat document root.&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;&#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;&#10;&lt;/span&gt;&lt;/span&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;&#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&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;&#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&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Syntax check of configuration files&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;# Restart service&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;&lt;connector&gt;&lt;/connector&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;&#10;&lt;/span&gt;&lt;/span&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;&#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;/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;&#10;&lt;/span&gt;&lt;/span&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;&#10;&lt;/span&gt;&lt;/span&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;&#10;&lt;/span&gt;&lt;/span&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;&#10;&lt;/span&gt;&lt;/span&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>