早期 Windows 服務器環境下,IIS (Internet Information Services) 作為原生 Web 伺服器承載靜態資源、ASP/ASP.NET 應用,佔據 80 端口。Java 應用需借助 Tomcat/Jetty 運行。為了**統一入口、複用 80 端口、利用 IIS 靜態處理/安全/管理優勢**,產生了「IIS 前端 + Tomcat 後端」的整合需求。
| 方案 | 核心組件 | 原理 | 痛點 | 狀態 |
|---|---|---|---|---|
| JK Connector (mod_jk) | Apache Tomcat Connectors (isapi_redirect.dll) | IIS ISAPI 擴展攔截請求 -> AJP 協議轉發至 Tomcat | 配置極其複雜 (workers.properties, uriworkermap, registry);版本耦合嚴重;AJP 協議安全隱患 (Ghostcat CVE-2020-1938);調試困難 | 不推薦 |
| ISAPI Redirect (舊版 JK2/boncode) | ISAPI Filter/Extension | 類似 mod_jk,不同實現 | 同 mod_jk,維護停滯 | 淘汰 |
| ServletExec (New Atlanta) | 商業 Servlet/JSP 引擎 | 作為 ISAPI 擴展加載於 IIS 進程內,或獨立運行連接 IIS | **商業收費** (高級功能);非標準 Servlet 容器;版本滯後;廠商鎖定 | 不推薦新項目 |
核心思想:IIS (或 Nginx/Apache HTTPD) 作為**前端反向代理**,處理 SSL 終結、靜態資源緩存/壓縮、限流、WAF、負載均衡,**僅將動態請求 (JSP/Servlet/API) 轉發至後端 Tomcat 叢集**。雙方通過標準 HTTP/HTTPS 協議通信,徹底解耦。
客戶端 (瀏覽器/APP)
↓ HTTPS :443 (HTTP :80)
IIS (前端反向代理)
├── 靜態資源 (.css, .js, .jpg, .html) -> 直接響應 (極快)
├── SSL 證書管理 (集中部署、自動續簽)
├── URL 重寫 / 重定向 / 訪問控制 (IP 白黑名單、地理封禁)
└── 動態請求 (/api/*, /app/*, *.jsp, *.do) -> ProxyPass -> 後端 Tomcat 叢集
↓ HTTP :8080/8081 (內網)
Tomcat 叢集 (Session 共享 / Sticky Session)
↓
數據庫 / Redis / 微服務...
<!-- web.config 示例 -->
<configuration>
<system.webServer>
<rewrite>
<rules>
<!-- 靜態資源直接服務,不代理 -->
<rule name="StaticFiles" stopProcessing="true">
<match url="^(.+\.(css|js|jpg|jpeg|png|gif|ico|html|woff|woff2))$" />
<action type="None" />
</rule>
<!-- 動態請求代理至 Tomcat -->
<rule name="ProxyToTomcat" stopProcessing="true">
<match url="^(.*)$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="https://localhost:8080/{R:1}" />
<!-- 或負載均衡: https://tomcat_cluster/{R:1} 需配置 ARR Server Farm -->
</rule>
</rules>
<!-- 保持 Host Header 傳遞給後端 (重要!) -->
<proxy xForwardedFor="true" /> <!-- 設置 X-Forwarded-For, X-Forwarded-Proto, X-Forwarded-Host -->
</rewrite>
</system.webServer>
</configuration>
在 `server.xml` 的 `
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
proxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"
protocolHeaderHttpsValue="https"
internalProxies="127\.0\.0\.1|10\.\d+\.\d+\.\d+|192\.168\.\d+\.\d+"
requestAttributesEnabled="true" />
雖 IIS + ARR 可行,但在**跨平台、高性能、配置靈活、生態工具鏈**上,Nginx / OpenResty / Apache HTTPD (mod_proxy) / Envoy / APISIX / Kong 等是行業標準選擇。Windows 服務器上同樣可運行 Nginx (性能優於 IIS ARR)。
**「JSP + IIS 整合」是歷史產物**。現代架構採用 **標準化反向代理 (Nginx/IIS ARR/Cloud Gateway) + 後端獨立 Servlet 容器叢集**,或直接 **容器化部署 (Spring Boot Fat Jar / Docker + K8s)**。若受限於存量 Windows/IIS 環境,請使用 **IIS ARR + URL Rewrite + Tomcat RemoteIpValve** 方案,拒絕 JK/ISAPI/ServletExec 等舊技術棧。核心原則:**協議標準化 (HTTP)、職責單一化 (靜態/代理/動態分離)、運維自動化 (容器/ IaC)**。
]]>