首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JSP 與 IIS 整合方案演進:從 JK/ISAPI 到 反向代理/容器化的現代最佳實踐

     編輯:關於JSP
歷史背景:為什麼曾需要 JSP + IIS?

早期 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 / 微服務...

IIS 配置反向代理 (ARR - Application Request Routing)

  1. 安裝組件:Web Platform Installer (WebPI) 搜索並安裝 **Application Request Routing (ARR) 3.0+** + **URL Rewrite 2.1+**。
  2. 啟用代理:IIS 管理器 -> 服務器節點 -> Application Request Routing Cache -> Server Proxy Settings -> 勾選 **Enable proxy**。
  3. 配置 URL Rewrite 規則 (站點級 `web.config` 或 IIS 管理器 GUI):
<!-- 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>

Tomcat 端配置協配合 (關鍵:獲取真實客戶端 IP 與協議)

在 `server.xml` 的 `` 或 `` 中添加 `RemoteIpValve` (Tomcat 7+ 內置):

<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" />
  • 使 `request.getRemoteAddr()` 返回真實客戶端 IP。
  • 使 `request.isSecure()` / `request.getScheme()` 返回 `https`。
  • 使 `request.getServerName()` / `getServerPort()` 返回前端域名/端口 (生成正確絕對 URL)。

為什麼不再推薦 ServletExec?

  • 技術棧孤島:非 Apache Tomcat 標準實現,Spring Boot 等現代框架測試/兼容性無保障。
  • 版本滯後:Servlet/JSP 規範支持滯後 (可能停留在 3.0/3.1),無法使用 Servlet 4.0 (HTTP/2)、5.0 (Jakarta EE) 新特性。
  • 商業授權成本:生產環境高級功能 (叢集、負載均衡、高級監控) 需購買授權,長期 TCO 高。
  • 運維孤立:無法納入標準化容器化部署 (Docker/K8s)、CI/CD 流水線、觀測體系 (Prometheus/Grafana/SkyWalking)。

更現代的選擇:Nginx / Apache HTTPD / Cloud Native Gateway

雖 IIS + ARR 可行,但在**跨平台、高性能、配置靈活、生態工具鏈**上,Nginx / OpenResty / Apache HTTPD (mod_proxy) / Envoy / APISIX / Kong 等是行業標準選擇。Windows 服務器上同樣可運行 Nginx (性能優於 IIS ARR)。

終極趨勢:容器化與雲原生 (徹底告別 IIS 整合煩惱)

  1. Docker 容器化:Spring Boot / Tomcat 應用打包為鏡像,內嵌 Tomcat/Jetty/Undertow,**無需外部 Web 伺服器**。
  2. Kubernetes 編排:Service (ClusterIP/LoadBalancer) + Ingress Controller (Nginx/Traefik/Envoy) 統一入口、SSL、路由、限流、金絲雀發布。
  3. 雲負載均衡器:ALB (AWS), CLB (阿里雲), LB (騰訊雲) 直接對接 K8s Service / Pod IP,層級更高、運維更簡。

總結

**「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)**。

]]>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved