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

Tomcat 多服務配置實戰:80 端口發布 Web 應用而不動預設 8080

     編輯:Java 相關知識

需求場景

  • Tomcat 預設 Connector port="8080",webapps/ 下有預設應用 (ROOT, docs, examples...)
  • 生產環境需在 80 端口 發布自有應用,且不影響現有 8080 服務
  • 避免修改預設 server.xml 降低升級/維護風險

解決方案:新增 Service 元素

server.xml 結構:Server → Service → Connector + Engine → Host → Context

新增獨立 Service,擁有專屬 Connector、Engine、Host、appBase,完全隔離。

配置範例

<Server port="8005" shutdown="SHUTDOWN">
  <!-- 原有 Service (8080) 保持不變 -->
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1" />
    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost" appBase="webapps" />
    </Engine>
  </Service>

  <!-- 新增 ServiceA (80 端口) -->
  <Service name="ServiceA">
    <Connector port="80" protocol="HTTP/1.1"
               maxThreads="200" connectionTimeout="20000"
               redirectPort="8443" />
    <Engine name="EngineA" defaultHost="localhost">
      <Host name="localhost" appBase="webappsA" />
    </Engine>
  </Service>
</Server>

關鍵點解析

屬性說明本例值
Service name唯一標識,JMX 物件名一部分ServiceA
Connector port監聽端口,< 1024 需 root/Admin 權限80
Engine name請求處理管線名稱,需唯一EngineA
Host appBase應用部署目錄 (相對 $CATALINA_BASE),勿與 webapps 同名webappsA
Host name虛擬主機名,通常 localhostlocalhost

部署步驟

  1. 建立目錄:mkdir $CATALINA_BASE/webappsA
  2. 將 WAR 檔或解壓目錄放入 webappsA/ (如 myapp.war 或 myapp/)
  3. 可選:在 conf/Catalina/localhost/ 建立 myapp.xml Context 描述符微調
  4. 重啟 Tomcat:shutdown.sh && startup.sh
  5. 驗證:瀏覽器訪問 https://localhost/myapp/ (80 端口無需帶 port)

Linux 非 root 啟用 80 端口方案

  • authbind:apt-get install authbind,touch /etc/authbind/byport/80,chmod 755 /etc/authbind/byport/80,啟動腳本加 authbind --deep
  • setcap:setcap 'cap_net_bind_service=+ep' /path/to/java (需檔案系統支援 capabilities)
  • iptables 轉發:iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
  • Nginx 反向代理 (推薦):80/443 由 Nginx 終結 SSL、靜態資源、負載均衡,轉發至 Tomcat 8080/8443

常見坑點

  1. 端口衝突:80 已被 Apache/Nginx/IIS 佔用 → 止用衝突服務或改用反向代理
  2. 權限不足:非 root 啟動 Tomcat 綁定 80 失敗 → 採上述方案
  3. Session 混淆:兩 Service 共用 localhost Host 名,Cookie Path 相同 → 設定 sessionCookiePath 或分離 Host 名
  4. webappsA **自動部署失效** → 檢查 Host autoDeploy="true"、deployOnStartup="true"

現代化部署建議

  • 容器化:Docker 映射 -p 80:8080,單容器單進程,無需多 Service
  • Kubernetes:Service/Ingress 處理 80/443,Pod 內容器僅暴露 8080
  • Spring Boot:內嵌 Tomcat,server.port=8080,外層 Nginx/Ingress 代理

總結

在 server.xml 新增 Service 元素,配置專屬 Connector port="80"、Engine、Host appBase="webappsA",實現與預設 8080 服務完全隔離的 80 端口發布。生產環境強烈建議前置 Nginx 反向代理,統一處理 SSL、靜態資源、限流、日誌,Tomcat 專注業務邏輯。

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