发布于2026-07-17 阅读(0)
扫一扫,手机访问
LNMP(Linux+Nginx+MySQL+PHP)这套组合,日志管理绝对是运维环节里绕不开的“基本功”。日志不仅是系统运行状态的晴雨表,更是故障排查时的第一线索,性能优化的重要依据。想把这套玩明白,得从日志分类、轮转策略、清理机制、分析工具到安全防护,一个环节一个环节地抠。下面直接上干货。

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# 所有日志轮转完成后执行postrotatepostrotate[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`# 通知Nginx重新打开日志文件endscript}tail -f /var/log/nginx/access.log;想查404错误,grep "404" /var/log/nginx/access.log搞定。要是想更直观一点,可以用GoAccess生成可视化报告,比如访问量、热门URL这些:goaccess -f /var/log/nginx/access.log -o /var/www/html/report.html --log-format=COMBINEDMySQL的日志类型就多了:错误日志(error_log)记录启动和运行时的错误;慢查询日志(slow_query_log)抓住那些执行时间超过阈值的SQL;通用查询日志(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.loglong_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 {dailyrotate 7compressmissingoknotifemptycreate 0640 mysql mysqlpostrotatesystemctl reload mysql# 通知MySQL重新打开日志文件endscript}PURGE BINARY LOGS命令,比如删掉7天前的:PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);不过更推荐直接设置expire_logs_days参数,让MySQL自动清理。PHP日志主要记脚本执行时的错误、警告和调试信息。如果要推荐一个工具,Monolog库绝对排第一——灵活、功能强,支持各种日志处理器。
require 'vendor/autoload.php';use MonologLogger;use MonologHandlerRotatingFileHandler; // 按日期分割日志$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,组为admchmod 0640 /var/log/nginx/*.log# 仅所有者可写,组可读chown mysql:mysql /var/log/mysql/*.log # MySQL日志所有者为mysqlchmod 0640 /var/log/mysql/*.log# 仅所有者可写,组可读chown www-data:www-data /var/log/php/*.log # PHP日志所有者为www-datachmod 0640 /var/log/php/*.log# 仅所有者可写,组可读Processor处理器来实现。只要把这些策略落实到位,LNMP环境下的日志管理就能做到既满足故障排查的需求,又不会让日志无谓地吞噬磁盘空间。系统稳定性上去了,运维也能省心不少。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8