完成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 |
八、生产环境优化建议
-
日志轮转 :配置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 } -
监控告警:对接Prometheus+Grafana监控Tomcat状态,或配置脚本失败时邮件/钉钉告警;
-
权限加固:禁止root运行Tomcat/Nginx,限制日志目录仅对应用户可读写;
-
NAS容灾:确保NAS存储做RAID/异地备份,避免日志丢失;
-
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 |