搭建 LNMT 架构并配置 Tomcat 日志管理与自动备份

完成LNMT架构,需要日志输出到挂载磁盘/data/logs/tomcat/目录下,并且每天凌晨00:00分crontab备份日志到/nas/logs/$(hostname)/2025/07_10/目录下,同时重载tomcat服务,日志格式需要遵循标准的输出格式。

一、架构与环境说明

组件 版本(推荐) 系统适配
Linux Ubuntu 22.04/Rocky 9 主流企业级发行版
Nginx 1.24+ 通用(包管理器安装)
MySQL 8.0 Ubuntu用MariaDB/MySQL,Rocky用MySQL
Tomcat 9.0 通用(解压安装)
JDK 1.8(OpenJDK) 通用

二、前置准备(区分系统)

1. 系统基础配置

(1)Ubuntu 22.04
bash 复制代码
# 更新系统
apt update && apt upgrade -y
# 关闭防火墙(生产环境精准放行)
ufw disable
# 关闭SELinux(Ubuntu默认无SELinux,可跳过)
# 安装依赖工具
apt install -y wget vim cron rsync openjdk-8-jdk
(2)Rocky Linux 9
bash 复制代码
# 更新系统
dnf update -y
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 关闭SELinux(临时+永久)
setenforce 0 && sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 安装依赖工具
dnf install -y wget vim cronie rsync java-1.8.0-openjdk-devel
# 启用EPEL源(Nginx依赖)
dnf install -y epel-release

2. 磁盘挂载确认

确保/data挂载独立磁盘(核心日志目录):

bash 复制代码
# 查看挂载状态
df -h | grep /data
# 若未挂载,示例挂载(替换/dev/sdb1为实际磁盘)
mkdir -p /data
mount /dev/sdb1 /data
# 开机自动挂载(通用)
echo "/dev/sdb1 /data ext4 defaults 0 0" >> /etc/fstab
# 验证挂载
mount -a

3. 创建核心目录

bash 复制代码
# Tomcat日志目录(设置权限)
mkdir -p /data/logs/tomcat
chmod -R 755 /data/logs/tomcat

# NAS备份目录(提前确保/nas/logs已挂载NAS)
mkdir -p /nas/logs/$(hostname)/$(date +%Y)/$(date +%m_%d)
chmod -R 755 /nas/logs

三、安装LNMT组件(区分系统)

1. 安装数据库(MySQL/MariaDB)

(1)Ubuntu 22.04(MariaDB 10.6)
bash 复制代码
apt install -y mariadb-server
# 启动并开机自启
systemctl start mariadb && systemctl enable mariadb
# 安全初始化(设置root密码、删除匿名用户)
mysql_secure_installation
(2)Rocky Linux 9(MySQL 8.0)
bash 复制代码
# 添加MySQL官方源
dnf install -y https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
# 安装MySQL服务
dnf install -y mysql-community-server
# 启动并开机自启
systemctl start mysqld && systemctl enable mysqld
# 查看初始密码
grep 'temporary password' /var/log/mysqld.log
# 安全初始化(修改密码+配置)
mysql_secure_installation

2. 安装Nginx

(1)Ubuntu 22.04
bash 复制代码
apt install -y nginx
# 启动并开机自启
systemctl start nginx && systemctl enable nginx
(2)Rocky Linux 9
bash 复制代码
dnf install -y nginx
# 启动并开机自启
systemctl start nginx && systemctl enable nginx

3. 安装Tomcat(通用步骤,跨系统)

(1)下载并解压Tomcat 9
bash 复制代码
# 下载稳定版Tomcat 9
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.85/bin/apache-tomcat-9.0.85.tar.gz -P /usr/local/
# 解压
tar -zxvf /usr/local/apache-tomcat-9.0.85.tar.gz -C /usr/local/
# 创建软链接(方便维护)
ln -s /usr/local/apache-tomcat-9.0.85 /usr/local/tomcat
(2)创建Tomcat系统用户
bash 复制代码
# Ubuntu/Rocky通用
useradd -r -m -U -d /usr/local/tomcat -s /sbin/nologin tomcat
chown -R tomcat:tomcat /usr/local/tomcat/
(3)配置Tomcat系统服务(区分系统)
Ubuntu 22.04
bash 复制代码
cat > /etc/systemd/system/tomcat.service << EOF
[Unit]
Description=Apache Tomcat 9 Web Server
After=network.target mariadb.service

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64"
Environment="CATALINA_HOME=/usr/local/tomcat"
Environment="CATALINA_BASE=/usr/local/tomcat"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
Rocky Linux 9
bash 复制代码
cat > /etc/systemd/system/tomcat.service << EOF
[Unit]
Description=Apache Tomcat 9 Web Server
After=network.target mysqld.service

[Service]
Type=forking
User=tomcat
Group=tomcat
Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk"
Environment="CATALINA_HOME=/usr/local/tomcat"
Environment="CATALINA_BASE=/usr/local/tomcat"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
(4)启动Tomcat并设置开机自启
bash 复制代码
# 通用
systemctl daemon-reload
systemctl start tomcat && systemctl enable tomcat
# 验证启动状态
systemctl status tomcat

四、配置Tomcat标准日志(定向到/data/logs/tomcat)

Tomcat日志核心配置文件为conf/logging.properties,需修改输出目录并遵循Apache SimpleFormatter标准格式(时间戳+级别+消息)。

1. 编辑日志配置文件

bash 复制代码
vim /usr/local/tomcat/conf/logging.properties

2. 替换核心配置(通用)

properties 复制代码
# 全局日志级别
.level = INFO

# 日志处理器(文件+控制台)
handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

# ========== Catalina主日志(核心)==========
1catalina.org.apache.juli.FileHandler.level = INFO
1catalina.org.apache.juli.FileHandler.directory = /data/logs/tomcat  # 定向到挂载磁盘
1catalina.org.apache.juli.FileHandler.prefix = catalina
1catalina.org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter
1catalina.org.apache.juli.FileHandler.encoding = UTF-8

# ========== 控制台日志(标准格式)==========
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.encoding = UTF-8

# ========== Localhost日志 ==========
2localhost.org.apache.juli.FileHandler.level = INFO
2localhost.org.apache.juli.FileHandler.directory = /data/logs/tomcat
2localhost.org.apache.juli.FileHandler.prefix = localhost
2localhost.org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter
2localhost.org.apache.juli.FileHandler.encoding = UTF-8

# ========== Manager/Host-Manager日志 ==========
3manager.org.apache.juli.FileHandler.level = INFO
3manager.org.apache.juli.FileHandler.directory = /data/logs/tomcat
3manager.org.apache.juli.FileHandler.prefix = manager
3manager.org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter
3manager.org.apache.juli.FileHandler.encoding = UTF-8

4host-manager.org.apache.juli.FileHandler.level = INFO
4host-manager.org.apache.juli.FileHandler.directory = /data/logs/tomcat
4host-manager.org.apache.juli.FileHandler.prefix = host-manager
4host-manager.org.apache.juli.FileHandler.formatter = java.util.logging.SimpleFormatter
4host-manager.org.apache.juli.FileHandler.encoding = UTF-8

# ========== 标准日志格式定义 ==========
# 格式:[日期 时间] [日志级别] 消息内容
java.util.logging.SimpleFormatter.format = [%1$tF %1$tT] [%4$-7s] %5$s %n

3. 重启Tomcat生效

bash 复制代码
systemctl restart tomcat

4. 验证日志输出

bash 复制代码
# 查看日志是否生成
ls -l /data/logs/tomcat/
# 查看日志格式是否符合标准
cat /data/logs/tomcat/catalina.out | head -10

标准日志示例

复制代码
[2025-07-10 15:30:00] [INFO    ] Initializing ProtocolHandler ["http-nio-8080"]
[2025-07-10 15:30:00] [INFO    ] Starting service [Catalina]
[2025-07-10 15:30:00] [INFO    ] Starting Servlet engine: [Apache Tomcat/9.0.85]

五、配置Crontab自动备份日志+重载Tomcat

1. 创建备份脚本(通用)

bash 复制代码
vim /usr/local/bin/tomcat_log_backup.sh

2. 脚本内容(带容错+日志)

bash 复制代码
#!/bin/bash
# 适配Ubuntu/Rocky Linux,备份Tomcat日志到NAS并重载Tomcat
# 脚本日志文件
BACKUP_LOG=/var/log/tomcat_log_backup.log
# 源日志目录
SRC_DIR=/data/logs/tomcat
# NAS备份目录(按主机名+年+月_日分层)
HOST_NAME=$(hostname)
YEAR=$(date +%Y)
DATE_DIR=$(date +%m_%d)
DEST_DIR=/nas/logs/${HOST_NAME}/${YEAR}/${DATE_DIR}

# 日志输出函数
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> ${BACKUP_LOG}
}

# 检查源目录是否存在
if [ ! -d ${SRC_DIR} ]; then
    log "ERROR: 源日志目录${SRC_DIR}不存在!"
    exit 1
fi

# 创建备份目录(递归创建)
mkdir -p ${DEST_DIR}
if [ $? -ne 0 ]; then
    log "ERROR: 创建备份目录${DEST_DIR}失败!"
    exit 1
fi

# 备份日志(保留源文件,rsync增量备份)
rsync -avz --exclude="*.tmp" --exclude="*.lock" ${SRC_DIR}/ ${DEST_DIR}/
if [ $? -eq 0 ]; then
    log "SUCCESS: 日志备份到${DEST_DIR}完成"
else
    log "ERROR: 日志备份失败!"
    exit 1
fi

# 重载Tomcat服务(平滑重启,避免业务中断)
systemctl reload tomcat
if [ $? -eq 0 ]; then
    log "SUCCESS: Tomcat服务重载完成"
else
    log "ERROR: Tomcat服务重载失败!"
    exit 1
fi

# 可选:清理7天前的备份(根据NAS容量调整)
find /nas/logs/${HOST_NAME}/${YEAR}/ -type d -mtime +7 -exec rm -rf {} \;
log "INFO: 7天前的备份日志已清理(若有)"

exit 0

3. 赋予脚本执行权限

bash 复制代码
chmod +x /usr/local/bin/tomcat_log_backup.sh

4. 测试脚本(确保无报错)

bash 复制代码
/usr/local/bin/tomcat_log_backup.sh
# 查看测试日志
cat /var/log/tomcat_log_backup.log

5. 配置Crontab定时任务(通用)

bash 复制代码
# 编辑当前用户的crontab(建议用root用户)
crontab -e

6. 添加定时任务(凌晨00:00执行)

bash 复制代码
# 每天凌晨00:00执行Tomcat日志备份脚本
0 0 * * * /usr/local/bin/tomcat_log_backup.sh

7. 验证Crontab配置

bash 复制代码
# 查看定时任务列表
crontab -l
# 重启cron服务(区分系统)
# Ubuntu
systemctl restart cron && systemctl enable cron
# Rocky Linux
systemctl restart crond && systemctl enable crond

六、Nginx反向代理Tomcat(LNMT架构闭环)

1. 编辑Nginx配置文件(通用)

bash 复制代码
# Ubuntu
vim /etc/nginx/conf.d/tomcat_proxy.conf
# Rocky Linux
vim /etc/nginx/conf.d/tomcat_proxy.conf

2. 配置反向代理内容

nginx 复制代码
server {
    listen 80;
    server_name localhost;  # 替换为实际域名(如tomcat.example.com)

    # Nginx访问日志/错误日志(定向到/data)
    access_log /data/logs/nginx/tomcat_access.log main;
    error_log /data/logs/nginx/tomcat_error.log warn;

    # 反向代理Tomcat 8080端口
    location / {
        proxy_pass http://127.0.0.1:8080;
        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 60s;  # 连接超时
        proxy_read_timeout 60s;     # 读取超时
    }
}

3. 创建Nginx日志目录并重启

bash 复制代码
# 通用
mkdir -p /data/logs/nginx
chown -R nginx:nginx /data/logs/nginx
# 检查配置语法
nginx -t
# 重启Nginx
systemctl restart nginx

七、验证与故障排查

1. 验证日志备份

bash 复制代码
# 查看NAS备份目录
ls -l /nas/logs/$(hostname)/$(date +%Y)/$(date +%m_%d)/
# 查看备份脚本日志
cat /var/log/tomcat_log_backup.log

2. 验证Tomcat重载

bash 复制代码
# 查看Tomcat进程状态
ps -ef | grep tomcat
# 查看Tomcat服务状态
systemctl status tomcat
# 查看Tomcat重启日志
grep "reload" /data/logs/tomcat/catalina.out

3. 常见故障排查

问题现象 排查方向
日志未输出到/data/logs/tomcat 检查logging.properties中directory配置;检查tomcat用户对/data/logs/tomcat的写入权限
Crontab任务未执行 查看/var/log/cron(Rocky)或/var/log/syslog(Ubuntu);测试脚本手动执行是否报错
NAS备份失败 检查/nas/logs挂载状态(df -h);检查目标目录权限(chmod 755)
Tomcat重载失败 检查tomcat.service配置;执行systemctl daemon-reload;查看journalctl -u tomcat

八、生产环境优化建议

  1. 日志轮转 :配置logrotate管理Tomcat/Nginx日志(避免单文件过大):

    bash 复制代码
    # 示例Tomcat logrotate配置(/etc/logrotate.d/tomcat)
    /data/logs/tomcat/*.log {
        daily
        rotate 7
        compress
        delaycompress
        missingok
        notifempty
        create 644 tomcat tomcat
    }
  2. 监控告警:对接Prometheus+Grafana监控Tomcat状态,或配置脚本失败时邮件/钉钉告警;

  3. 权限加固:禁止root运行Tomcat/Nginx,限制日志目录仅对应用户可读写;

  4. NAS容灾:确保NAS存储做RAID/异地备份,避免日志丢失;

  5. JVM优化:根据业务调整Tomcat的JVM参数(CATALINA_OPTS),避免OOM。

九、系统差异速查表

操作项 Ubuntu 22.04 Rocky Linux 9
防火墙 ufw disable systemctl stop firewalld
SElinux setenforce 0 + 修改/etc/selinux/config
JDK路径 /usr/lib/jvm/java-8-openjdk-amd64 /usr/lib/jvm/java-1.8.0-openjdk
Cron服务 cron crond
MySQL/MariaDB 默认安装MariaDB 10.6 推荐安装MySQL 8.0
相关推荐
青云交2 小时前
Java 大视界 -- Java+Spark 构建企业级用户画像平台:从数据采集到标签输出全流程(437)
java·开发语言·spark·hbase 优化·企业级用户画像·标签计算·高并发查询
音符犹如代码2 小时前
ZooKeeper 实战指南:从入门到场景解析
分布式·微服务·zookeeper·云原生·中间件·架构
铉铉这波能秀2 小时前
正则表达式从入门到精通(字符串模式匹配)
java·数据库·python·sql·正则表达式·模式匹配·表格处理
武子康2 小时前
Java-202 RabbitMQ 生产安装与容器快速启动:Erlang 兼容、RPM 部署与常用命令
java·消息队列·rabbitmq·erlang·java-rabbitmq·mq
老周聊架构2 小时前
架构火花 | 提示词工程在AI时代下的思考
人工智能·架构·提示词工程
a程序小傲2 小时前
米哈游Java后端面试被问:Spring Boot Starter的制作原理
java·spring boot·后端
Misnearch2 小时前
Mock服务是什么?
java·后端·微服务·mock
后端小张2 小时前
【JAVA 进阶】深入理解Sentinel:分布式系统的流量守卫者
java·开发语言·spring boot·后端·spring·spring cloud·sentinel
cheems95272 小时前
[JavaEE] CAS 介绍
java·开发语言·java-ee