LNMP(Linux+Nginx+MySQL+PHP)是常见的Web服务架构,有效的日志管理对于系统维护、故障排查和安全分析至关重要。以下是LNMP环境下的日志管理技巧:
Nginx日志:
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/nginx/
目录下,以域名命名MySQL日志:
/var/log/mysql/error.log
/var/log/mysql/mysql-slow.log
/var/lib/mysql/mysql-bin.*
PHP日志:
/var/log/php-fpm.log
或/var/log/php7.x-fpm.log
/var/log/php_errors.log
http {
log_format main '$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 main buffer=32k flush=5m;
error_log /var/log/nginx/error.log warn;
# 按虚拟主机分离日志
server {
server_name example.com;
access_log /var/log/nginx/example.com.access.log main;
error_log /var/log/nginx/example.com.error.log;
}
}
[mysqld]
# 错误日志
log_error = /var/log/mysql/error.log
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
# 二进制日志
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
[PHP]
error_log = /var/log/php_errors.log
log_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
[PHP-FPM]
pm.status_path = /status
ping.path = /ping
catch_workers_output = yes
access.log = /var/log/php-fpm.access.log
slowlog = /var/log/php-fpm.slow.log
request_slowlog_timeout = 10s
使用logrotate进行日志轮转,创建/etc/logrotate.d/lnmp
文件:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
/usr/sbin/nginx -s reload
endscript
}
/var/log/mysql/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 mysql adm
sharedscripts
postrotate
test -x /usr/bin/mysqladmin || exit 0
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
$MYADMIN ping &>/dev/null && $MYADMIN flush-logs
endscript
}
/var/log/php*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 640 www-data adm
sharedscripts
postrotate
/usr/bin/pkill -USR1 -u www-data -x php-fpm
endscript
}
Nginx日志分析:
goaccess
:实时Web日志分析工具awstats
:高级Web统计工具简单命令:
# 查看访问最多的IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 20
# 查看HTTP状态码统计
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
MySQL慢查询分析:
mysqldumpslow
:MySQL自带的慢查询分析工具pt-query-digest
:Percona Toolkit中的强大分析工具
bash
pt-query-digest /var/log/mysql/mysql-slow.log
PHP错误分析:
# 统计PHP错误类型
grep "PHP " /var/log/php_errors.log | awk -F 'PHP ' '{print $2}' | sort | uniq -c | sort -nr
使用fail2ban
监控日志并阻止恶意IP:
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
action = iptables[name=HTTP, port=http, protocol=tcp]
logpath = /var/log/nginx/error.log
使用logwatch
或swatch
进行日志监控和邮件告警
ELK(Elasticsearch+Logstash+Kibana)搭建集中式日志分析平台
设置适当的日志文件权限:
chmod 640 /var/log/nginx/*.log
chown www-data:adm /var/log/nginx/*.log
敏感信息不要记录在日志中,如密码、信用卡号等
定期检查日志文件大小,防止磁盘被占满
重要日志可以考虑实时同步到远程服务器备份
通过以上技巧,您可以有效地管理LNMP环境中的日志,提高系统维护效率和安全性。