<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mod_remoteip on K-Life Hack | Systems Architecture &amp; DevOps</title><link>https://klifehack.com/en/tags/mod_remoteip/</link><description>Recent content in Mod_remoteip on K-Life Hack | Systems Architecture &amp; DevOps</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sun, 11 Oct 2026 10:07:10 +0900</lastBuildDate><atom:link href="https://klifehack.com/en/tags/mod_remoteip/index.xml" rel="self" type="application/rss+xml"/><item><title>Implementing SSL Offloading with Nginx Reverse Proxy and Apache mod_remoteip Integration</title><link>https://klifehack.com/en/p/nginx-ssl-offload-apache-mod-remoteip/</link><pubDate>Sun, 11 Oct 2026 10:07:10 +0900</pubDate><guid>https://klifehack.com/en/p/nginx-ssl-offload-apache-mod-remoteip/</guid><description>&lt;p&gt;As infrastructure scales, designing a system where SSL/TLS certificates are managed and renewed individually on each backend node, consuming CPU resources for cryptographic handshakes, introduces risks of operational renewal oversights and resource contention. To eliminate this cryptographic overhead and operational cost, an architecture is commonly adopted where a reverse proxy is deployed at the edge layer to centralize SSL termination (SSL Offloading) and route traffic to the backend via plain HTTP at high speeds.&lt;/p&gt;&#10;&lt;p&gt;However, in this configuration, because the proxy server establishes a new TCP session to the backend, an issue arises where the source IP address is masked by the proxy&amp;rsquo;s internal IP in backend web server (Apache) access logs and internal application layers. This document outlines the setup and verification procedures for a client IP restoration pipeline using &lt;code&gt;mod_remoteip&lt;/code&gt; on Apache running on CentOS 7, coupled with TLS 1.2/1.3 termination via Nginx on Rocky Linux 9.&lt;/p&gt;&#10;&lt;h2 id="system-topology-and-design-specifications"&gt;System Topology and Design Specifications&#10;&lt;/h2&gt;&lt;p&gt;The edge proxy and backend web server communicate within the same private segment (&lt;code&gt;192.168.20.0/24&lt;/code&gt;).&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;b&gt;Edge Proxy Node&lt;/b&gt;&lt;/li&gt;&#10;&lt;li&gt;OS: Rocky Linux 9&lt;/li&gt;&#10;&lt;li&gt;Internal IP: &lt;code&gt;192.168.20.11&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Role: Port 80/443 listener, TLS termination, HTTP/2 negotiation, header rewriting&lt;/li&gt;&#10;&lt;li&gt;&lt;b&gt;Backend Node&lt;/b&gt;&lt;/li&gt;&#10;&lt;li&gt;OS: CentOS 7&lt;/li&gt;&#10;&lt;li&gt;Internal IP: &lt;code&gt;192.168.20.12&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Role: Apache (&lt;code&gt;httpd&lt;/code&gt;), PHP runtime, request processing over plain HTTP (Port 80)&lt;/li&gt;&#10;&lt;li&gt;&lt;b&gt;Domain Resolution&lt;/b&gt;: The target FQDN (&lt;code&gt;tech.viahost.co.kr&lt;/code&gt;) resolves to the edge proxy&amp;rsquo;s IP.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="backend-web-server-baseline-configuration-centos-7"&gt;Backend Web Server Baseline Configuration (CentOS 7)&#10;&lt;/h2&gt;&lt;p&gt;On the backend node (&lt;code&gt;192.168.20.12&lt;/code&gt;), direct external HTTPS connections are blocked, accepting only internal forwarded traffic from Nginx.&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;# Install packages and deploy verification script&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yum install -y httpd php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;?php phpinfo(); ?&amp;gt;&amp;#34;&lt;/span&gt; &amp;amp;gt; /var/www/html/phpinfo.php&#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;systemctl enable httpd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl start httpd&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="edge-reverse-proxy-and-ssl-termination-configuration-rocky-linux-9"&gt;Edge Reverse Proxy and SSL Termination Configuration (Rocky Linux 9)&#10;&lt;/h2&gt;&lt;p&gt;Install Nginx on the Rocky Linux 9 node (&lt;code&gt;192.168.20.11&lt;/code&gt;) and configure encryption processing, TLS protocol restrictions, request size limits, and reverse proxy parameters to the backend.&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;dnf install -y nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the VirtualHost configuration file (&lt;code&gt;/etc/nginx/conf.d/tech.viahost.co.kr.conf&lt;/code&gt;) and define the following directives:&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-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# HTTP listener - Canonical redirect to HTTPS&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&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;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&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;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;tech.viahost.co.kr&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;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;301&lt;/span&gt; &lt;span style="color:#e6db74"&gt;https://&lt;/span&gt;$host$request_uri;&#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;&lt;span style="color:#75715e"&gt;# HTTPS listener - SSL termination and proxy forwarding&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&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;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;443&lt;/span&gt; &lt;span style="color:#e6db74"&gt;ssl&lt;/span&gt; &lt;span style="color:#e6db74"&gt;http2&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;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;tech.viahost.co.kr&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;# SSL certificate paths&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_certificate&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/etc/letsencrypt/live/example.com/fullchain.pem&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;ssl_certificate_key&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/etc/letsencrypt/live/example.com/privkey.pem&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;# Cipher suites and protocol restrictions&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ssl_protocols&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.2&lt;/span&gt; &lt;span style="color:#e6db74"&gt;TLSv1.3&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;# Increase payload limit (raised from default 1MB to prevent HTTP 413)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;client_max_body_size&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50m&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;location&lt;/span&gt; &lt;span style="color:#e6db74"&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;proxy_pass&lt;/span&gt; &lt;span style="color:#e6db74"&gt;http://192.168.20.12:80&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;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;Host&lt;/span&gt; $host;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Real-IP&lt;/span&gt; $remote_addr;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-For&lt;/span&gt; $proxy_add_x_forwarded_for;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;proxy_set_header&lt;/span&gt; &lt;span style="color:#e6db74"&gt;X-Forwarded-Proto&lt;/span&gt; $scheme;&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Perform a configuration syntax check and reload the daemon:&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;nginx -t&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl enable nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl start nginx&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="directive-design-intent"&gt;Directive Design Intent&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;ssl_protocols TLSv1.2 TLSv1.3;&lt;/code&gt;: Explicitly disables SSLv3, TLS 1.0, and TLS 1.1 with known vulnerabilities, maintaining Forward Secrecy.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;client_max_body_size 50m;&lt;/code&gt;: Relaxes buffer restrictions to prevent &lt;code&gt;HTTP 413 Request Entity Too Large&lt;/code&gt; errors caused by the default value (1MB) during file uploads.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/code&gt;: Appends the client&amp;rsquo;s original source IP address to the HTTP header chain, passing it transparently downstream.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="restoring-real-ip-addresses-with-mod_remoteip-apache"&gt;Restoring Real IP Addresses with mod_remoteip (Apache)&#10;&lt;/h2&gt;&lt;p&gt;In traffic routed through a reverse proxy, the source IP recorded in Apache access logs becomes the address of the proxy server (&lt;code&gt;192.168.20.11&lt;/code&gt;). To ensure accuracy in access analysis and audit logs, extract and apply the real IP address using Apache&amp;rsquo;s &lt;code&gt;mod_remoteip&lt;/code&gt; module.&lt;/p&gt;&#10;&lt;h3 id="1-verifying-module-loading"&gt;1. Verifying Module Loading&#10;&lt;/h3&gt;&lt;p&gt;In Apache 2.4 on CentOS 7, &lt;code&gt;mod_remoteip&lt;/code&gt; is bundled by default. Verify whether it is loaded in the configuration files.&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;LoadModule remoteip_module modules/mod_remoteip.so&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-modifying-httpdconf-configuration"&gt;2. Modifying httpd.conf Configuration&#10;&lt;/h3&gt;&lt;p&gt;Add proxy trust configurations and adjust the log format in &lt;code&gt;/etc/httpd/conf/httpd.conf&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-apache" data-lang="apache"&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;&lt;span style="color:#75715e"&gt;# Remote IP Configuration&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;RemoteIPHeader X-Forwarded-For&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;RemoteIPInternalProxy &lt;span style="color:#ae81ff"&gt;192.168.20.11&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;# -------------------------------------------------------------&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;# Log Format Adjustments (Change from %h to %a)&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;LogFormat &lt;span style="color:#e6db74"&gt;&amp;#34;%a %l %u %t \&amp;#34;%r\&amp;#34; %&amp;amp;gt;s %b \&amp;#34;%{Referer}i\&amp;#34; \&amp;#34;%{User-Agent}i\&amp;#34;&amp;#34;&lt;/span&gt; combined&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LogFormat &lt;span style="color:#e6db74"&gt;&amp;#34;%a %l %u %t \&amp;#34;%r\&amp;#34; %&amp;amp;gt;s %b&amp;#34;&lt;/span&gt; common&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;By explicitly registering the edge proxy&amp;rsquo;s internal IP (&lt;code&gt;192.168.20.11&lt;/code&gt;) in &lt;code&gt;RemoteIPInternalProxy&lt;/code&gt;, only the &lt;code&gt;X-Forwarded-For&lt;/code&gt; header forwarded by that proxy is trusted, discarding malicious external header spoofing (IP Spoofing). Additionally, change the LogFormat directive from &lt;code&gt;%h&lt;/code&gt;, which represents the direct TCP connection source, to &lt;code&gt;%a&lt;/code&gt;, which indicates the resolved client IP.&lt;/p&gt;&#10;&lt;p&gt;After applying the configuration, restart the Apache service:&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;systemctl restart httpd&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="troubleshooting"&gt;Troubleshooting&#10;&lt;/h2&gt;&lt;p&gt;Common friction points during the initial deployment of a reverse proxy configuration and verification procedures:&lt;/p&gt;&#10;&lt;h3 id="1-http-502-bad-gateway-is-returned"&gt;1. HTTP 502 Bad Gateway Is Returned&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;b&gt;Cause&lt;/b&gt;: Outbound network connections from Nginx may be denied by SELinux policies on the edge proxy (Rocky 9), or the port may not be listening on the backend (&lt;code&gt;192.168.20.12:80&lt;/code&gt;).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;b&gt;Verification Procedure&lt;/b&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;# SELinuxによるHTTPネットワーク接続許可フラグの確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;getsebool httpd_can_network_connect&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 無効（off）の場合は有効化&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;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;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-real-ip-is-not-reflected-on-apache-proxy-ip-continues-to-be-displayed"&gt;2. Real IP Is Not Reflected on Apache, Proxy IP Continues to Be Displayed&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;b&gt;Cause&lt;/b&gt;: Incorrect IP definition in &lt;code&gt;RemoteIPInternalProxy&lt;/code&gt;, or intermediate header name mismatch with &lt;code&gt;X-Forwarded-For&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;b&gt;Verification Procedure&lt;/b&gt;: Verify via browser or &lt;code&gt;curl&lt;/code&gt; using PHP environment variable output (&lt;code&gt;phpinfo.php&lt;/code&gt;) whether the value of &lt;code&gt;$_SERVER['HTTP_X_FORWARDED_FOR']&lt;/code&gt; accurately reaches the backend.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="system-operation-verification-logs"&gt;System Operation Verification Logs&#10;&lt;/h2&gt;&lt;p&gt;Protocol verification logs with all services operational:&lt;/p&gt;&#10;&lt;h3 id="listener-and-forwarding-test-on-proxy-node"&gt;Listener and Forwarding Test on Proxy Node&#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;[root@proxy-node ~]# ss -tulpn | grep -E &amp;#39;:(80|443)&amp;#39;&#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;nginx&amp;#34;,pid=15234,fd=6))&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tcp LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:((&amp;#34;nginx&amp;#34;,pid=15234,fd=7))&#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;[root@proxy-node ~]# curl -I -k https://tech.viahost.co.kr/phpinfo.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HTTP/2 200 &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;server: nginx/1.20.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;date: Sun, 11 Oct 2026 04:12:05 GMT&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="access-log-verification-on-backend-node"&gt;Access Log Verification on Backend Node&#10;&lt;/h3&gt;&lt;p&gt;Output of &lt;code&gt;/var/log/httpd/access_log&lt;/code&gt; when accessed from a client (e.g., public IP &lt;code&gt;203.0.113.45&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-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[root@backend-node ~]# tail -n 1 /var/log/httpd/access_log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;203.0.113.45 - - [11/Oct/2026:13:12:05 +0900] &amp;#34;GET /phpinfo.php HTTP/1.0&amp;#34; 200 45124 &amp;#34;-&amp;#34; &amp;#34;curl/7.88.1&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It can be confirmed that the client&amp;rsquo;s real source IP address (&lt;code&gt;203.0.113.45&lt;/code&gt;) is properly recorded in the leading field (&lt;code&gt;%a&lt;/code&gt;).&lt;/p&gt;&#10;&lt;h2 id="configuration-notes"&gt;Configuration Notes&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;b&gt;Scaling to a Backend Cluster&lt;/b&gt;: When transitioning from single-host forwarding to a redundant configuration, define an &lt;code&gt;upstream&lt;/code&gt; block in Nginx and configure health checks and balancing algorithms.&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-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;upstream&lt;/span&gt; &lt;span style="color:#e6db74"&gt;backend_cluster&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;server&lt;/span&gt; 192.168.20.12:&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt; &lt;span style="color:#e6db74"&gt;max_fails=3&lt;/span&gt; &lt;span style="color:#e6db74"&gt;fail_timeout=10s&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;# 追加のバックエンドノードを順次定義&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;b&gt;Integrating Security Layers&lt;/b&gt;: By integrating a WAF (Web Application Firewall) into the edge proxy layer, the architecture can evolve to inspect and block malicious request parameters and injection attacks before reaching the backend.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>