centos

centos lnmp中nginx日志分析

小樊
40
2025-11-03 20:20:25
栏目: 智能运维

CentOS LNMP环境中Nginx日志分析指南

在CentOS LNMP(Linux+Nginx+MySQL+PHP)架构中,Nginx日志是监控网站运行状态、排查问题、优化性能的核心依据。本文将围绕Nginx日志的位置、基础分析命令、实战场景及优化工具展开说明。

一、Nginx日志文件位置

Nginx的日志主要分为两类,路径由nginx.conf配置文件中的access_logerror_log指令定义(LNMP默认路径如下):

二、基础分析命令

1. 统计访问IPTop N

通过awk提取IP地址,sort排序,uniq -c统计重复次数,sort -rn降序排列,可快速找出访问量最高的IP:

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

说明$1代表日志中的第1个字段(远程主机IP),head -10限制显示前10条结果。

2. 统计指定时间段访问量

使用grep过滤特定时间范围的日志(如2025-05-01 10:00-11:00),再用wc -l统计行数(即请求数):

grep "01/May/2025:10" /var/log/nginx/access.log | grep -E "10:[0-9]{2}:|11:00:00" | wc -l

说明-E启用扩展正则,10:[0-9]{2}:匹配10点到10:59:59的记录,11:00:00匹配11点的记录。

3. 分析状态码分布

统计不同HTTP状态码(如200、404、500)的出现次数,快速识别请求成功率:

awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

说明$9代表日志中的第9个字段(HTTP状态码),常见状态码含义:200(成功)、404(未找到)、500(服务器内部错误)。

4. 统计热门URL

提取请求的URL(第7个字段),统计访问频率,找出最受欢迎的页面:

awk '{print $7}' /var/log/nginx/access.log | awk -F '?' '{print $1}' | sort | uniq -c | sort -nr | head -10

说明-F '?'?为分隔符,$1取URL路径部分(去除参数),避免参数干扰统计结果。

5. 查找高频错误

过滤错误日志中的关键词(如404500connection refused),快速定位问题:

grep -i "404" /var/log/nginx/error.log
grep -i "500" /var/log/nginx/error.log

说明-i忽略大小写,可根据需要替换为其他错误关键词(如timeoutpermission denied)。

三、实战场景分析

1. 检测恶意IP(暴力破解)

若网站遭遇暴力破解(如频繁登录尝试),可通过以下命令找出访问/admin/login路径的高频IP:

grep "/admin/login" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -5

应对措施:将高频IP加入防火墙黑名单(如iptables -A INPUT -s 高频IP -j DROP)。

2. 分析慢请求

虽然Nginx默认不记录响应时间,但可通过自定义日志格式添加$request_time字段(单位:秒),再统计慢请求(如超过2秒的请求):

# 1. 修改nginx.conf,在http块中添加自定义日志格式
log_format slowlog '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$request_time"';

# 2. 应用自定义格式到access_log
access_log /var/log/nginx/slow.log slowlog;

# 3. 统计慢请求(需重启Nginx生效)
awk '$11 > 2' /var/log/nginx/slow.log | awk '{print $1, $7, $11}' | sort -k3 -rn | head -10

说明$request_time代表请求处理时间,sort -k3 -rn按第3列(响应时间)降序排列。

四、日志分析工具推荐

1. GoAccess(实时可视化分析)

GoAccess是一款开源的实时日志分析工具,支持生成HTML报告,直观展示访问量、IP分布、状态码等数据:

# 1. 安装依赖
yum install glib2 glib2-devel GeoIP GeoIP-devel ncurses-devel zlib zlib-devel gcc -y

# 2. 下载并编译安装
wget https://tar.goaccess.io/goaccess-1.5.6.tar.gz
tar -xzvf goaccess-1.5.6.tar.gz
cd goaccess-1.5.6/
./configure --enable-utf8 --enable-geoip
make && sudo make install

# 3. 生成HTML报告
goaccess -f /var/log/nginx/access.log -a > /var/www/html/nginx_report.html

说明--enable-utf8支持UTF-8编码,--enable-geoip支持地理位置分析,报告可通过浏览器访问http://服务器IP/nginx_report.html查看。

2. ELK Stack(大规模日志管理)

对于高流量的LNMP环境,可使用ELK(Elasticsearch+Logstash+Kibana)堆栈集中管理、搜索和分析日志:

五、日志管理最佳实践

1. 日志轮转(避免日志过大)

使用logrotate工具定期切割、压缩日志文件,保留最近7天的日志:

# 创建logrotate配置文件(/etc/logrotate.d/nginx)
/var/log/nginx/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 nginx adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

说明daily表示每天轮转,rotate 7保留7天,compress压缩旧日志,postrotate脚本通知Nginx重新打开日志文件。

2. 调整日志级别

根据需求设置Nginx日志级别,避免记录过多无用信息(如debug级别会产生大量日志):

# 在nginx.conf的http或server块中设置
error_log /var/log/nginx/error.log warn;  # 生产环境建议使用warn或error级别

说明:日志级别从低到高依次为debuginfonoticewarnerrorcritalertemerg

通过以上方法,可全面掌握CentOS LNMP环境中Nginx的运行状态,快速定位问题并优化网站性能。

0
看了该问题的人还看了