本文針對 RHEL/CentOS 7/8/9、Rocky Linux、AlmaLinux 等紅帽系發布版,提供 JDK 11/17 (LTS) 與 Tomcat 9/10 的生產級安裝、配置、優化、系統服務化全流程。採用 tar.gz 手動部署方式,版本可控、無依賴衝突、便於多版本共存與遷移。
# 關閉 SELinux(生產建議配置策略而非關閉,此處為演示簡化)
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
# 關閉防火牆或開放端口(生產請用 firewall-cmd 精準放行)
systemctl stop firewalld && systemctl disable firewalld
# 或:firewall-cmd --permanent --add-port=8080/tcp --add-port=8443/tcp && firewall-cmd --reload
# 建立專用用戶(安全最佳實踐:不以 root 運行 Tomcat)
useradd -r -s /sbin/nologin -d /opt/tomcat tomcat
# 進入軟件目錄
cd /opt
# 下載 JDK 17 (LTS) - 以 Temurin (Adoptium) 為例,生產推薦
wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.11%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.11_9.tar.gz
# 解壓
tar -zxvf OpenJDK17U-jdk_x64_linux_hotspot_17.0.11_9.tar.gz
# 重命名為通用目錄
mv jdk-17.0.11+9 jdk17
cat > /etc/profile.d/jdk.sh <<'EOF'
export JAVA_HOME=/opt/jdk17
export JRE_HOME=$JAVA_HOME
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
EOF
# 立即生效
source /etc/profile.d/jdk.sh
# 驗證
java -version
# 輸出示例:
# openjdk version "17.0.11" 2024-04-16
# OpenJDK Runtime Environment Temurin-17.0.11+9 (build 17.0.11+9)
# OpenJDK 64-Bit Server VM Temurin-17.0.11+9 (build 17.0.11+9, mixed mode, sharing)
# 安裝 JDK 11 並行
wget https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.23%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.23_9.tar.gz
tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.23_9.tar.gz
mv jdk-11.0.23+9 jdk11
# 使用 alternatives 切換默認版本
alternatives --install /usr/bin/java java /opt/jdk17/bin/java 1700
alternatives --install /usr/bin/java java /opt/jdk11/bin/java 1100
alternatives --config java # 交互選擇
cd /opt
# Tomcat 10 (Servlet 5.0 / Jakarta EE 9,包名 jakarta.*)
wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.25/bin/apache-tomcat-10.1.25.tar.gz
# Tomcat 9 (Servlet 4.0 / Java EE,包名 javax.*)
# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.91/bin/apache-tomcat-9.0.91.tar.gz
tar -zxvf apache-tomcat-10.1.25.tar.gz
mv apache-tomcat-10.1.25 tomcat10
chown -R tomcat:tomcat /opt/tomcat10
cat > /opt/tomcat10/bin/setenv.sh <<'EOF'
#!/bin/bash
# 堆內存:物理內存 50%-70%,此處以 4G 為例
export JAVA_OPTS="-server \
-Xms2g -Xmx2g \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/opt/tomcat10/logs/heapdump.hprof \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps \
-Xlog:gc*:/opt/tomcat10/logs/gc.log:time,uptime,level,tags:filecount=10,filesize=100m \
-Djava.security.egd=file:/dev/./urandom \
-Dfile.encoding=UTF-8 \
-Duser.timezone=Asia/Shanghai"
EOF
chmod +x /opt/tomcat10/bin/setenv.sh
chown tomcat:tomcat /opt/tomcat10/bin/setenv.sh
# 編輯 /opt/tomcat10/webapps/manager/META-INF/context.xml
# 註釋掉原有 Valve,添加允許 IP(如僅內網 10.0.0.0/8)
# 同理配置 host-manager
cat > /etc/systemd/system/tomcat10.service <<'EOF'
[Unit]
Description=Apache Tomcat 10
After=network.target syslog.target
[Service]
Type=forking
User=tomcat
Group=tomcat
Environment=JAVA_HOME=/opt/jdk17
Environment=CATALINA_HOME=/opt/tomcat10
Environment=CATALINA_BASE=/opt/tomcat10
Environment=CATALINA_PID=/opt/tomcat10/temp/tomcat.pid
Environment='JAVA_OPTS=-server -Xms2g -Xmx2g -XX:+UseG1GC'
ExecStart=/opt/tomcat10/bin/startup.sh
ExecStop=/opt/tomcat10/bin/shutdown.sh
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
LimitNPROC=65535
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable tomcat10
systemctl start tomcat10
systemctl status tomcat10
# 驗證端口
ss -ntlp | grep 8080
# 瀏覽器訪問 https://server-ip:8080
# /etc/nginx/conf.d/tomcat.conf
upstream tomcat_backend {
server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s;
# 多實例負載均衡
# server 127.0.0.1:8081 weight=1;
}
server {
listen 80;
server_name your.domain.com;
location / {
proxy_pass https://tomcat_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 30s;
proxy_read_timeout 60s;
}
# 靜態資源由 Nginx 直接服務
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
proxy_pass https://tomcat_backend;
}
}
cat > /etc/logrotate.d/tomcat10 <<'EOF'
/opt/tomcat10/logs/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 tomcat tomcat
sharedscripts
postrotate
systemctl reload tomcat10 > /dev/null 2>&1 || true
endscript
}
EOF
| 現象 | 排查方向 |
|---|---|
| 啟動報錯 "Address already in use" | 端口被佔用:ss -ntlp | grep 8080,殺掉進程或改端口 |
| 管理頁面 403 | 檢查 tomcat-users.xml 角色、context.xml IP 白名單 |
| 中文亂碼 | URIEncoding=UTF-8、JAVA_OPTS -Dfile.encoding=UTF-8、DB 連接字符串 characterEncoding=utf8 |
| OOM / 頻繁 Full GC | 調大 Heap、啟用 G1GC、排查記憶體洩漏、檢查 Metaspace |
| Session 丟失(集群) | 配置 Redis Session 共享、Sticky Session、或 DeltaManager |
按此流程部署,你的 Tomcat 將在生產環境穩如磐石。