LNMP(Linux+Nginx+MySQL+PHP)日志管理指南
日志是LNMP环境中监控系统运行、排查故障、优化性能的核心工具。有效的日志管理需覆盖日志分类、轮转策略、清理机制、分析工具及安全防护五大环节,以下是具体实施方案:
Nginx的日志主要分为两类:访问日志(access_log)(记录客户端请求详情,如IP、URL、状态码)和错误日志(error_log)(记录服务器运行异常,如配置错误、连接超时)。
nginx.conf或虚拟主机server块)设置日志路径与格式。例如:http {
access_log /var/log/nginx/access.log combined; # 使用内置的combined格式
error_log /var/log/nginx/error.log warn; # 设置错误日志级别为warn(仅记录警告及以上级别)
}
可自定义日志格式(如添加客户端真实IP、请求时间):log_format custom '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
access_log /var/log/nginx/custom_access.log custom;
logrotate工具自动分割、压缩旧日志,避免文件过大。创建/etc/logrotate.d/nginx配置文件:/var/log/nginx/*.log {
daily # 每天轮转
rotate 14 # 保留14天日志
compress # 压缩旧日志(gzip)
delaycompress # 延迟压缩(当天日志不压缩)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 www-data adm # 新日志文件权限与所有者
sharedscripts # 所有日志轮转完成后执行postrotate
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` # 通知Nginx重新打开日志文件
endscript
}
tail -f /var/log/nginx/access.log实时查看最新请求;使用grep "404" /var/log/nginx/access.log搜索特定错误;借助GoAccess工具生成可视化报告(如访问量、Top URL):goaccess -f /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED
MySQL的日志类型包括错误日志(error_log)(记录启动、运行错误)、慢查询日志(slow_query_log)(记录执行时间超过阈值的查询)、通用查询日志(general_log)(记录所有SQL语句,生产环境慎开)及二进制日志(binlog)(记录数据变更,用于主从复制与数据恢复)。
my.cnf(或my.ini)文件,开启所需日志:[mysqld]
log_error = /var/log/mysql/error.log # 错误日志路径
slow_query_log = 1 # 开启慢查询日志
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2 # 慢查询阈值(秒)
log_bin = /var/log/mysql/binlog # 二进制日志路径
binlog_expire_logs_seconds = 604800 # 二进制日志保留7天(自动清理)
logrotate管理错误日志与慢查询日志(二进制日志无需手动轮转,通过expire_logs_seconds自动清理)。创建/etc/logrotate.d/mysql配置文件:/var/log/mysql/error.log /var/log/mysql/slow.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 mysql mysql
postrotate
systemctl reload mysql # 通知MySQL重新打开日志文件
endscript
}
PURGE BINARY LOGS命令手动删除旧日志(如删除7天前的日志):PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
或设置expire_logs_days参数自动清理(推荐)。PHP日志主要用于记录脚本执行错误、警告及调试信息,推荐使用Monolog库(灵活、功能强大,支持多种日志处理器)。
require 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler; // 按日期分割日志
$log = new Logger('my_app');
$log->pushHandler(new RotatingFileHandler('/var/log/php/app.log', 30, Logger::DEBUG)); // 保留30天日志
$log->info('User logged in', ['username' => 'john.doe']); // 记录info级别日志(带上下文)
DEBUG→INFO→NOTICE→WARNING→ERROR→CRITICAL→ALERT→EMERGENCY),生产环境建议设置为ERROR或WARNING,避免日志泛滥。RotatingFileHandler处理器自动分割日志(如每天一个文件,保留30天),无需额外配置logrotate。chown www-data:adm /var/log/nginx/*.log # Nginx日志所有者为www-data,组为adm
chmod 0640 /var/log/nginx/*.log # 仅所有者可写,组可读
chown mysql:mysql /var/log/mysql/*.log # MySQL日志所有者为mysql
chmod 0640 /var/log/mysql/*.log # 仅所有者可写,组可读
chown www-data:www-data /var/log/php/*.log # PHP日志所有者为www-data
chmod 0640 /var/log/php/*.log # 仅所有者可写,组可读
Processor处理器)。通过以上策略,可实现LNMP环境中日志的有效管理,既满足故障排查需求,又避免日志占用过多磁盘空间,提升系统稳定性与可维护性。