温馨提示×

Ubuntu上LNMP日志如何管理

小樊
40
2025-11-02 08:38:47
栏目: 智能运维

Ubuntu上LNMP日志管理指南

一、LNMP日志分类及默认路径

LNMP(Linux+Nginx+MySQL+PHP)环境的日志主要分为四类,每类日志的默认存储路径如下:

  • Nginx:访问日志(/var/log/nginx/access.log)、错误日志(/var/log/nginx/error.log);
  • MySQL/MariaDB:错误日志(/var/log/mysql/error.log)、慢查询日志(/var/log/mysql/slow.log,需手动启用)、通用查询日志(/var/log/mysql/query.log,需手动启用);
  • PHP-FPM:访问日志(/var/log/php-fpm/www-access.log,需在配置中开启)、错误日志(/var/log/php-fpm/www-error.log,需在配置中开启);
  • 系统日志:认证日志(/var/log/auth.log,记录SSH登录等)、系统日志(/var/log/syslog,记录系统级事件)。

二、日志轮转配置(避免日志膨胀)

日志轮转是LNMP日志管理的核心任务,可使用Ubuntu自带的logrotate工具实现自动切割、压缩、删除旧日志。以下是各组件的轮转配置方法:

1. Nginx日志轮转

  • 配置文件路径/etc/logrotate.d/nginx(需手动创建);
  • 配置示例
    /var/log/nginx/*.log {
        daily                # 每天轮转一次
        missingok            # 日志文件不存在时不报错
        rotate 7             # 保留最近7个轮转日志
        compress             # 压缩旧日志(如access.log.1.gz)
        delaycompress        # 延迟压缩(本次轮转不压缩上一次的日志)
        notifempty           # 日志为空时不轮转
        create 0640 root adm # 创建新日志文件,权限0640,属主root,属组adm
        sharedscripts        # 所有日志轮转完成后执行postrotate脚本
        postrotate
            [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` # 向Nginx主进程发送信号,重新打开日志文件
        endscript
    }
    
  • 测试配置sudo logrotate -d /etc/logrotate.d/nginx(模拟运行,不实际执行);
  • 手动触发sudo logrotate -f /etc/logrotate.d/nginx(强制执行)。

2. MySQL日志轮转

  • 配置文件路径/etc/logrotate.d/mysql(Ubuntu默认已存在);
  • 配置示例(若未配置,可手动添加):
    /var/log/mysql/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        create 0640 mysql adm
        sharedscripts
        postrotate
            [ -f /var/run/mysqld/mysqld.pid ] && kill -USR1 `cat /var/run/mysqld/mysqld.pid`
        endscript
    }
    
  • 注意事项:若启用了二进制日志(log-bin),需额外配置expire_logs_days参数(在/etc/mysql/mysql.conf.d/mysqld.cnf中),设置二进制日志的自动过期天数(如expire_logs_days = 7),避免二进制日志占用过多磁盘空间。

3. PHP-FPM日志轮转

  • 配置文件路径/etc/logrotate.d/php-fpm(需手动创建);
  • 配置示例
    /var/log/php-fpm/*.log {
        daily
        missingok
        rotate 7
        compress
        notifempty
        create 0640 www-data adm # PHP-FPM进程属主通常为www-data
        sharedscripts
        postrotate
            [ -f /var/run/php-fpm/php-fpm.pid ] && kill -USR2 `cat /var/run/php-fpm/php-fpm.pid` # 向PHP-FPM主进程发送信号,重新打开日志文件
        endscript
    }
    
  • 测试与手动触发:同Nginx配置。

三、日志分析与监控

1. 命令行工具(快速排查问题)

  • 查看实时日志tail -f /var/log/nginx/access.log(Nginx访问日志)、tail -f /var/log/mysql/error.log(MySQL错误日志);
  • 关键词搜索grep 'ERROR' /var/log/mysql/error.log(查找MySQL错误日志中的“ERROR”关键词)、grep '404' /var/log/nginx/access.log(查找Nginx访问日志中的404请求);
  • 统计分析awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr(统计Nginx访问日志中的IP访问频率,找出高频访问IP)。

2. 可视化工具(深入分析趋势)

  • GoAccess:实时分析Nginx访问日志,生成HTML报告(包含PV/UV、访问来源、请求路径等)。安装与使用:
    sudo apt install goaccess
    goaccess /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINED
    
    访问http://服务器IP/report.html即可查看可视化报告。

3. 综合监控工具(实时告警)

  • Prometheus+Grafana:搭建监控体系,采集Nginx(通过nginx_exporter)、MySQL(通过mysqld_exporter)的指标,设置告警规则(如Nginx请求量突增、MySQL连接数超标),通过邮件/Slack发送告警。

四、日志安全与管理最佳实践

  • 权限控制:确保日志文件的属主和属组正确(如Nginx日志属主为root、属组为adm,PHP-FPM日志属主为www-data、属组为adm),避免未授权访问;
  • 敏感信息过滤:在日志配置中关闭敏感信息记录(如Nginx的access_log中避免记录Authorization头),防止密码等敏感信息泄露;
  • 定期备份:将重要日志(如MySQL错误日志、Nginx访问日志)备份到远程服务器(如使用rsyncscp),避免本地磁盘损坏导致数据丢失;
  • 日志分级:根据需求调整日志级别(如MySQL的general_log设为OFF,仅在调试时开启;Nginx的error_log设为warn,避免记录过多调试信息),减少不必要的磁盘占用。

0