温馨提示×

Debian上LNMP如何进行日志分析

小樊
40
2026-01-03 09:28:08
栏目: 智能运维

Debian上LNMP日志分析实操指南

一 日志位置与关键文件

  • 建议先确认各组件日志路径,必要时在配置中显式指定,便于后续分析。
  • 常见路径与作用如下:
组件 日志文件 典型路径 主要用途
Nginx 访问日志、错误日志 /var/log/nginx/access.log/var/log/nginx/error.log 访问统计、错误定位
MySQL/MariaDB 错误日志、慢查询日志 /var/log/mysql/error.log、慢查询日志(需配置) 启动/运行错误、SQL性能问题
PHP-FPM 错误日志 /var/log/php-fpm.log/var/log/php/ 下按版本命名的文件 PHP 运行时错误、FPM 进程问题
系统 系统日志、认证日志 /var/log/syslog/var/log/auth.log 服务启动、登录审计、内核与系统事件
  • 快速查看与确认:
    • 实时查看 Nginx 错误日志:sudo tail -f /var/log/nginx/error.log
    • 查看 MySQL 错误日志:sudo tail -f /var/log/mysql/error.log
    • 查看系统日志:sudo tail -f /var/log/syslog
    • 查看 PHP-FPM 错误日志:先确认路径(如 /var/log/php-fpm.log/var/log/php/7.x-fpm.log),再执行 tail

二 命令行快速分析范式

  • 以下命令基于常见的 Nginx 组合日志格式(空格分隔,状态码在第 9 列,请求路径在第 7 列;不同发行版或自定义格式可能偏移,建议先用 head 确认字段)。
  • 高频场景命令清单:
    • Top N 访问 IP
      • awk ‘{print $1}’ /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
    • 指定时间段请求量(示例:2025-05-01 10:00–11:00
      • grep “01/May/2025:10” /var/log/nginx/access.log | grep -E “10:[0-9]{2}:|11:00:00” | wc -l
    • 状态码分布
      • awk ‘{print $9}’ /var/log/nginx/access.log | sort | uniq -c | sort -nr
    • 热门 URL(去除查询串)
      • awk ‘{print $7}’ /var/log/nginx/access.log | awk -F ‘?’ ‘{print $1}’ | sort | uniq -c | sort -nr | head -10
    • 高频错误关键词(Nginx 错误日志)
      • grep -i “404” /var/log/nginx/error.log
      • grep -i “500” /var/log/nginx/error.log
    • 实时观察错误日志
      • sudo tail -f /var/log/nginx/error.log
  • 提示:若使用自定义 log_format,请先通过 head -1 /var/log/nginx/access.log 确认字段顺序,再调整上述 $n 的列号

三 可视化与集中化分析

  • GoAccess(实时、本地可视化)
    • 安装:sudo apt-get install goaccess
    • 生成 HTML 报告:goaccess /var/log/nginx/access.log -a -o /var/www/html/nginx_report.html
    • 将报告放到 Web 目录后,可通过 http://服务器IP/nginx_report.html 查看访问趋势、IP 分布、状态码等
  • ELK Stack / EFK(集中化、可观测性)
    • 采集:Filebeat 读取 Nginx/MySQL/PHP-FPM 日志
    • 处理与存储:Logstash 解析并发送到 Elasticsearch
    • 可视化与告警:Kibana 构建仪表盘、设置阈值告警
  • 系统级集中与告警
    • 使用 rsyslog 做日志转发与集中
    • 使用 Prometheus + Grafana 对日志指标做可视化与告警(配合 Exporter/日志采集器)

四 慢请求与数据库性能分析

  • Nginx 慢请求
    • http { } 中自定义日志格式,增加 $request_time(单位:秒):
      • log_format slowlog ‘$remote_addr - $remote_user [$time_local] “$request” $status $body_bytes_sent “$http_referer” “$http_user_agent” “$request_time”’;
    • server { }location { } 中启用:
      • access_log /var/log/nginx/slow.log slowlog;
    • 统计超过 2 秒 的请求:
      • awk ‘$NF > 2’ /var/log/nginx/slow.log | sort -kNF -rn | head -10
  • MySQL/MariaDB 慢查询
    • 确认慢查询日志已启用(编辑 /etc/mysql/my.cnf/etc/mysql/mariadb.conf.d/*.cnf,在 [mysqld] 下设置 slow_query_log=1slow_query_log_file=/var/log/mysql/slow.loglong_query_time=1,重启后生效)
    • 分析慢日志:
      • 直接查看 Top N 慢查询:mysqldumpslow -s t /var/log/mysql/slow.log | head
      • 使用 Percona Toolkit(如 pt-query-digest)深入分析慢查询与执行计划

五 日志轮转与合规安全

  • 使用 logrotate 自动轮转,避免日志过大(示例为 PHP 应用日志,可按需为 Nginx/MySQL/PHP-FPM 配置)
    • 新建配置:sudo nano /etc/logrotate.d/php-app
    • 示例内容:
      • /path/to/your/php/app/logs/*.log {
        • daily
        • missingok
        • rotate 7
        • compress
        • delaycompress
        • notifempty
        • create 0640 www-data adm
        • sharedscripts
        • postrotate
          • if [ -f /var/run/php-fpm/php-fpm.sock ]; then
            • kill -USR2 $(cat /var/run/php-fpm.pid)
          • fi
        • endscript
      • }
    • 测试与启用:sudo logrotate -d /etc/logrotate.d/php-app(干跑),配置无误后由系统定时任务自动执行
  • 安全与合规
    • 设置日志文件权限,仅允许 root 与相应用户组读取(如 0640 www-data adm
    • 定期备份关键日志,必要时将日志发送到远程集中服务器进行审计与留存

0