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

RedHat/CentOS 7 生產環境安裝 JDK 11/17 與 Tomcat 9/10 完整教程

     編輯:Java 相關知識

前言

本文針對 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

一、安裝 JDK 11/17 (LTS)

1. 下載與解壓


# 進入軟件目錄
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

2. 配置環境變量(/etc/profile.d/jdk.sh)


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)

3. 多版本共存(可選)


# 安裝 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  # 交互選擇

二、安裝 Tomcat 9/10

1. 下載與解壓


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

2. 核心配置優化(/opt/tomcat10/conf/server.xml)











3. JVM 參數調優(/opt/tomcat10/bin/setenv.sh)


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

4. 管理用戶配置(/opt/tomcat10/conf/tomcat-users.xml)



  
  
  
  
  
  
  

5. 限制管理頁面訪問 IP(生產必做)


# 編輯 /opt/tomcat10/webapps/manager/META-INF/context.xml
# 註釋掉原有 Valve,添加允許 IP(如僅內網 10.0.0.0/8)

  


# 同理配置 host-manager

三、系統服務化

1. 創建 systemd 服務文件


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

2. 啟動與驗證


systemctl daemon-reload
systemctl enable tomcat10
systemctl start tomcat10
systemctl status tomcat10

# 驗證端口
ss -ntlp | grep 8080
# 瀏覽器訪問 https://server-ip:8080

四、Nginx 反向代理(生產標配)


# /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;
    }
}

五、日誌切割與監控

1. Logrotate 配置


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

2. 關鍵監控指標

  • JVM:Heap/Metaspace 使用率、GC 頻率/耗時、線程數/死鎖
  • Tomcat:請求 QPS、響應時間 P99、活躍線程、錯誤率
  • OS:CPU/內存/磁盤/網絡、文件描述符
  • 工具:Prometheus + JMX Exporter + Grafana / Arthas 線上診斷

六、常見問題排查

現象排查方向
啟動報錯 "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

總結

  1. 用戶隔離:專用 tomcat 用戶,最小權限運行。
  2. 版本鎖定:手動部署 tar.gz,避免 yum/apt 自動升級破壞兼容性。
  3. JVM 調優:G1GC、堆內存固定、GC 日誌、HeapDump。
  4. 安全加固:管理頁面 IP 白名單、強密碼、關閉自動部署、Nginx 反代隱藏端口。
  5. 運維標準化:systemd 服務、logrotate、監控告警、備份恢復演練。

按此流程部署,你的 Tomcat 將在生產環境穩如磐石。

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