1.概叙

科普文:软件架构Nginx系列之【常用shell脚本分析nginx日志】_系统 请求成功率-CSDN博客

科普文:看懂Linux日志分析_linux系统日志分析-CSDN博客

科普文:软件架构Linux系列之【Linux日志和日志分析工具】-CSDN博客

前面文章提到使用命令行工具如awk、grep、sort等来分析Nginx的访问日志access_log,提取高频IP。虽然access_log和error_log结构不同,但处理IP提取的方法有相似之处。在分析nginx日志前我们先来了解一下这两种日志:

  • access_log‌:用于记录客户端请求,是‌行为分析‌和‌安全防护‌的核心依据。
  • error_log‌:用于记录服务端错误,是‌故障排查‌和‌服务健康监控‌的关键工具。
  • 结合使用‌:通过关联两种日志(例如根据请求ID或时间戳),可精准定位问题根源。

1.1 access_log和error_log主要区别

特性 access_log error_log
记录内容 客户端请求的详细信息(请求方法、URL、状态码等) 服务器处理请求时的错误信息(配置错误、资源未找到等)
主要用途 流量分析、用户行为追踪、安全审计 故障排查、服务异常监控
日志级别 无级别划分 支持级别:debuginfonoticewarnerrorcrit
默认存储路径 /var/log/nginx/access.log /var/log/nginx/error.log

1.2 access_log和error_log使用场景对比

场景 access_log error_log
流量统计 统计PV/UV、热门页面、访问来源 不适用
安全分析 检测异常请求(如SQL注入、暴力破解) 发现配置错误或资源访问失败(如文件泄露)
性能优化 分析响应时间、慢请求 定位服务崩溃或连接超时问题
SEO优化 监控爬虫行为(如Googlebot) 不适用

2. access_log 详解

2.1 记录内容示例

192.168.1.100 - - [12/Jul/2023:14:28:32 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
  • 字段说明‌:
    • 192.168.1.100:客户端IP
    • [12/Jul/2023:14:28:32 +0800]:请求时间
    • GET /index.html HTTP/1.1:请求方法、路径、协议
    • 200:HTTP状态码
    • 612:响应体大小(字节)
    • Mozilla/5.0...:User-Agent

2.2 配置方式

在 nginx.conf 或虚拟主机配置中定义:

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;  
}  
  • 参数说明‌:
    • log_format:自定义日志格式(如main)。
    • access_log:指定日志路径和格式名称。

3. error_log 详解

3.1 记录内容示例

2023/07/12 14:30:45 [error] 12345#0: *6789 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.1.100, server: localhost, request: "GET /favicon.ico HTTP/1.1"
  • 字段说明‌:
    • [error]:日志级别
    • 12345#0:进程ID和线程ID
    • *6789:请求标识符
    • No such file or directory:具体错误描述
    • client: 192.168.1.100:客户端IP

3.2 配置方式

rror_log /var/log/nginx/error.log warn; 
  • 日志级别‌:
    • debug:调试信息(最详细,适用于开发环境)。
    • warn:警告信息(生产环境推荐)。
    • error:严重错误(默认级别)。

5. 日志管理最佳实践

  1. 日志切割‌:使用 logrotate 定期切割日志,避免文件过大。

    /var/log/nginx/*.log {  
        daily  
        rotate 30  
        compress  
        missingok  
        notifempty  
        sharedscripts  
        postrotate  
            /usr/bin/systemctl reload nginx  
        endscript  
    }  
    
  2. 敏感信息过滤‌:在 access_log 中隐藏敏感字段(如$http_cookie)。

    log_format filtered '$remote_addr - $remote_user [$time_local] "$request" $status';  
    
  3. 错误日志监控‌:通过 grep 或日志分析工具(如ELK、Graylog)实时监控 error_log

    tail -f /var/log/nginx/error.log | grep -E 'error|crit'
  4. 安全加固‌:在 access_log 中记录攻击者IP并封禁:

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

看一下服务器上 access_log日志

error_log日志 

access日志中的404错误,在error日志中都有对应的记录。

根据错误日志中的client: <IP>字段,以下IP尝试访问敏感路径(如.envlogin.rspsetup-config.php等),疑似恶意扫描或攻击行。

  1. 攻击特征‌:

    • .env文件通常包含敏感配置(如数据库密码),攻击者通过扫描此文件尝试获取系统权限。
    • setup-config.php是WordPress安装配置文件,攻击者可能试图篡改或窃取数据库信息。
    • login.rsp可能是伪造的登录接口,用于爆破或注入攻击。
    • 高频访问不存在的敏感路径,属于典型自动化扫描行为。
  2. IP风险评级‌:

    • 高危‌:35.194.89.135、112.74.37.75(直接针对敏感配置文件)。
    • 中危‌:1.192.195.11(可能为初步扫描或探测)。
    • 低危‌:其他统计次数为1的ip

     3.建议防护措施:IP封禁

  • 在Nginx配置中屏蔽这些IP:deny 35.194.89.135;
  • 或在防火墙(如iptables)中直接拦截:iptables -A INPUT -s 35.194.89.135 -j DROP

在这里我才用nginx黑名单,来屏蔽这些ip的访问。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐