LNMP日志分析指南:从基础到进阶
LNMP(Linux+Nginx+MySQL+PHP)架构的日志分析是运维工作的核心环节,能有效排查故障、优化性能及提升安全性。以下从日志文件定位、基础分析命令、工具化分析、安全审计、自动化与优化五大维度展开说明:
首先需明确LNMP各组件的日志路径(默认路径可能因发行版或自定义配置调整):
/var/log/nginx/access.log(记录用户请求详情)、错误日志/var/log/nginx/error.log(记录Nginx运行错误);/var/log/mysql/error.log(数据库运行错误)、慢查询日志/var/log/mysql/slow_query.log(执行时间超过阈值的SQL)、一般查询日志/var/log/mysql/general_log(所有SQL记录,需手动开启);/var/log/php-fpm/error.log(PHP执行错误,如语法错误、超时);/var/log/syslog(Ubuntu/Debian)或/var/log/messages(CentOS/RHEL),记录系统级事件。通过Linux原生工具快速提取关键信息,适合日常快速排查:
grep筛选目标日志,如查找Nginx中404错误的请求:grep ' 404 ' /var/log/nginx/access.log(注意空格匹配状态码);查看MySQL连接错误:grep 'Connection refused' /var/log/mysql/error.log;awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10;/api/payments)的访问频率:grep '/api/payments' /var/log/nginx/access.log | wc -l;tail -f动态查看新增日志,如跟踪Nginx错误日志:tail -f /var/log/nginx/error.log,或监控PHP-FPM错误:tail -f /var/log/php-fpm/error.log。对于大规模或长期日志,原生命令效率有限,推荐使用以下工具:
sudo apt install goaccess;分析Nginx日志:goaccess -f /var/log/nginx/access.log --log-format=COMBINED(--log-format需与Nginx配置一致);生成可视化页面:goaccess -f /var/log/nginx/access.log --log-format=COMBINED > /var/www/html/access.html;通过日志分析识别潜在安全威胁,及时阻断攻击:
/admin)、SQL注入尝试(含union select、insert into等关键词)、XSS攻击(含<script>标签):grep -E 'union.*select|insert.*into|<script>|/admin' /var/log/nginx/access.log | awk '{print $1,$7}' | sort | uniq -c | sort -rn
root用户从陌生IP登录):grep -i 'failed|access denied|root@%' /var/log/mysql/error.log | awk '{print $9,$11}' | sort | uniq -c | sort -rn
#!/bin/bash
LOG_DIR="/var/log/nginx"
REPORT="/tmp/nginx_security_report_$(date +%F).txt"
echo "Nginx安全审计报告 - $(date)" > $REPORT
grep -E 'union.*select|insert.*into|<script>' $LOG_DIR/access.log >> $REPORT
grep -i 'failed|access denied' $LOG_DIR/error.log >> $REPORT
mail -s "Nginx安全报告" admin@example.com < $REPORT
添加到crontab(每天凌晨1点运行):0 1 * * * /path/to/security_script.sh。logrotate工具(默认已安装)。编辑Nginx轮转配置(/etc/logrotate.d/nginx):/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
endscript
}
手动测试:sudo logrotate -d /etc/logrotate.d/nginx(模拟运行),sudo logrotate -f /etc/logrotate.d/nginx(强制执行);access_log),便于后续分析。示例(/etc/nginx/nginx.conf):log_format combined '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log combined;
通过以上方法,可系统化完成LNMP日志分析,从海量数据中提取有价值信息,保障服务器稳定运行。