Apache请求日志采集

Apache 请求日志记录了服务器接收到的 HTTP 请求的详细信息,用于监控、分析和调试。日志中包括诸如请求的来源 IP 地址、请求方法、响应状态码、处理时间等信息。

日志的作用:
  1. 监控与调试:日志可以帮助系统管理员监控服务器的运行状态,快速定位并解决请求失败或错误的问题。
  2. 性能优化:通过分析请求的处理时间和响应大小,可以识别出性能瓶颈,进而优化服务器配置和资源分配。
  3. 安全分析:日志可以用于检测异常访问模式和潜在的攻击活动,例如频繁的404错误、异常的请求方法或大量的请求来自同一IP地址。
  4. 用户行为分析:通过跟踪用户的访问模式和行为,可以对网站内容和用户体验进行优化,提高用户满意度。
  5. 访问统计:日志数据可以用来生成访问统计报告,了解网站的访问量、访问者的地理分布、最受欢迎的页面等信息。
  6. 合规性和审计:在需要符合特定法规或标准的情况下,日志可以作为审计的证据,证明系统的使用和访问符合规定。
  7. 个性化推荐:分析用户的访问习惯和偏好,可以为用户提供个性化的内容推荐。
触发条件:
  • 所有 HTTP 请求 :每次客户端向服务器发出请求,都会在日志中生成一条记录。
  • 特定事件或条件 :可以通过自定义配置记录特定的请求或事件,如错误状态码或特定的请求方法。

1.配置请求日志

1.1 日志来源

  • 默认日志路径:Apache 的默认访问日志通常位于 /var/log/apache2/access.log(Debian/Ubuntu 系统)或 /etc/httpd/logs/access_log(CentOS/RHEL 系统)。
  • 默认配置文件路径:Apache 的主配置文件通常位于 /etc/apache2/apache2.conf(Debian/Ubuntu 系统)或 /etc/httpd/conf/httpd.conf(CentOS/RHEL 系统)。

1.2修改日志路径和格式

在 Apache 中,可以通过修改配置文件来设置自定义日志格式和日志文件路径。

示例配置:

  • 主配置文件 /etc/apache2/apache2.conf 或 /etc/httpd/conf/httpd.conf:

apache

设置自定义日志格式

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" combined_with_all_vars

应用自定义日志格式到默认日志文件

CustomLog "/var/log/apache2/access.log" combined_with_all_vars

  • 虚拟主机配置 在 /etc/apache2/sites-available/example.com.conf 或其他虚拟主机文件中:

apache

<VirtualHost *:80>

ServerName example.com

DocumentRoot "/var/www/example.com"

为虚拟主机设置自定义日志文件和格式

CustomLog "/var/log/apache2/example_access.log" combined_with_all_vars

</VirtualHost>

1.3 配置测试和重载

测试配置:

使用以下命令测试 Apache 配置文件是否有语法错误:

sudo apachectl configtest

# 或者

sudo httpd -t

1.4 重载重启配置

若无错误,使用以下命令重载 Apache 以应用配置更改:

sudo systemctl reload apache2

如果需要,使用以下命令重启 Apache:

sudo systemctl restart apache2

1.5 字段参考

|----|---------------|---------------------------|---------------------------------------------------------------------------------------|------------------------------|-------------------------------------------------------------------------------------------------------------|---|
| | Apache 字段 | 命名 | 示例值 | 中文解释 | 正则表达式 | |
| 1 | %a | remote_addr | 192.168.0.1 | 请求的客户端 IP 地址 | \b(?:[0-9]{1,3}.){3}[0-9]{1,3}\b | |
| 2 | %{c}a | real_ip | 10.0.0.1 | 连接的底层对等 IP 地址(代理下的最初发起请求的IP) | \b(?:[0-9]{1,3}.){3}[0-9]{1,3}\b | |
| 3 | %A | server_addr | 127.0.0.1 | 本地 IP 地址 | \b(?:[0-9]{1,3}.){3}[0-9]{1,3}\b | |
| 4 | %B/%b | body_bytes_sent | 2048 | 响应大小,不包括 HTTP 标头 | \d+ | |
| 5 | %{VARNAME}C | cookie_VARNAME | cookie1=value1; cookie2=value2 | 请求中 Cookie 的内容 | [A-Za-z0-9_]+(?:=[^\s;]+)?(?:\\s*;\\s*[A-Za-z0-9_]+(?:=[^\s;]+)?)* | |
| 6 | %D | request_time_microseconds | 123456 | 处理请求所花费的时间(微秒) | \d+ | |
| 7 | %{VARNAME}e | env_VARNAME | VARNAME=value | 环境变量的内容 | [A-Za-z0-9_]+(?:=[^\s]+)? | |
| 8 | %f | filename | /path/to/file | 文件名 | .+ | |
| 9 | %h | remote_host | Example Domain | 远程主机名 | [a-zA-Z0-9.-]+.[a-zA-Z]{2,} | |
| 10 | %{c}h | real_host | www.realexample.com | 底层 TCP 连接的主机名 | [a-zA-Z0-9.-]+.[a-zA-Z]{2,} | |
| 11 | %H | request_protocol | HTTP/1.1 | 请求协议 | HTTP/\d.\d | |
| 12 | %{VARNAME}i | http_VARNAME | User-Agent: Mozilla/5.0 | 请求头内容 | [A-Za-z0-9_-]+:\s[^\s]+ | |
| 13 | %k | keepalive_requests | 0 | Keepalive 请求数 | 0 | |
| 15 | %L | request_id | [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12} | 错误日志中的请求日志 ID | | |
| 16 | %m | request_method | GET | 请求方法 | [A-Z]+ | |
| 18 | %{VARNAME}o | response_header_VARNAME | Content-Type: text/html | 响应头内容 | [A-Za-z0-9_-]+:\s[^\s]+ | |
| 19 | %p | server_port | 80 | 服务器端口 | \d+ | |
| 20 | %P | process_id | 1234 | 子进程 ID | \d+ | |
| 21 | %q | query_string | arg1=val1&arg2=val2 | 查询字符串 | .+? | |
| 22 | %r | request_line | GET /index.html HTTP/1.1 | 第一行请求 | [A-Z]+\s/.+\sHTTP/\d.\d | |
| 23 | %R | handler | directory | 生成响应的处理程序 | [a-zA-Z0-9_]+ | |
| 24 | %s | status | 200 | 状态码 | \d{3} | |
| 25 | %t | time_local | [09/Apr/2023:12:00:00 +0000] | 收到请求的时间 | (?:\d1,2/[A−Za−z]3/\d4:\d2:\d2:\d2\+\d4)(?:\d1,2/[AZaz ]3/\d4:\d2:\d2:\d2\+\d4) | |
| 26 | %{format}t | time_format | 2023-04-09 12:00:00 | 时间(自定义格式) | \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} | |
| 27 | %T | request_time | 0.123 | 处理请求所花费的时间(秒) | \d+.\d{3} | |
| 28 | %{UNIT}T | request_time_UNIT | 123ms | 以不同单位表示的处理请求时间 | \d+[a-z]+ | |
| 29 | %u | remote_user | username | 远程用户 | [a-zA-Z0-9_-]+ | |
| 30 | %U | request_uri | /index.html | 请求的 URL 路径 | .+ | |
| 31 | %v | server_name | server.example.com | 服务器规范名称 | [a-zA-Z0-9.-]+.[a-zA-Z]{2,} | |
| 32 | %V | host | Example Domain | 根据设置的服务器名称 | [a-zA-Z0-9.-]+.[a-zA-Z]{2,} | |
| 33 | %X | connection_status | + | 连接状态 | [+-] | |
| 34 | %I | received_bytes | 1500 | 接收的字节数 | \d+ | |
| 35 | %O | sent_bytes | 1024 | 发送的字节数 | \d+ | |
| 36 | %S | bytes_transferred | 3000 | 传输的字节数 | \d+ | |

默认配置日志通常包括 CLF(通用日志格式)和扩展格式。带虚拟主机的通用日志格式和 NCSA 扩展/组合日志格式也常见于不同的配置。

  1. 日志采集概述

2.1 access日志格式样例

复制代码
172.16.100.2 - - [19/Aug/2024:10:31:34 +0800] "GET /zabbix/zabbix.php?action=dashboard.list HTTP/1.1" 200 10258 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"`
`

这条Apache日志记录了在2024年8月19日上午10点31分34秒,一个来自IP地址172.16.100.2的客户端使用Chrome浏览器(版本127.0.0.0)成功访问了服务器上的 /zabbix/zabbix.php 页面,请求了仪表板列表,并接收到了10258字节的响应数据。

日志字段解释: 客户端IP地址: 172.16.100.2 ,发起请求的客户端的IP地址。2. 身份验证和授权: - - ,表示请求没有特定的用户身份验证或授权信息。3. 时间戳: [19/Aug/2024:10:31:34 +0800] ,请求发生的具体时间,包括日期、时间以及时区。4. 请求行: "GET /zabbix/zabbix.php?action=dashboard.list HTTP/1.1" ,包括:请求方法: GET ,表示请求类型为获取。请求资源: /zabbix/zabbix.php?action=dashboard.list ,请求的URL,包括查询参数 action=dashboard.list 。HTTP协议版本: HTTP/1.1 。5. 状态码: 200 ,表示请求成功,服务器正常响应。6. 内容大小: 10258 ,响应内容的字节数。7. 引用页: "-" ,表示没有引用页或该信息未提供。8. 用户代理: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0" ,客户端浏览器的详细信息,包括浏览器类型、操作系统、浏览器版本等。

2.1 access日志采集方式

Vector配置

复制代码
`
`

2.3 access日志格式样例解析结果

复制代码
{`  
`"remote_host":` `"172.16.100.2",`
  `"authentication_info":` `"-",` 
   `"timestamp":` `"19/Aug/2024:10:31:34 +0800",` 
    `"request_line":` `{`    
    `"method":` `"GET",`  
      `"resource":` `"/zabbix/zabbix.php",`    
      `"query_string":` `"action=dashboard.list",`    
      `"http_version":` `"HTTP/1.1"` 
       `},` 
        `"status_code":` `200,` 
         `"content_length":` `10258,`  
         `"referrer":` `"-",` 
          `"user_agent":` `"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"`
          `}`
`

日志字段分析用途

  • %a%{c}a:客户端IP地址和底层对等IP地址,可以用来分析访问来源和识别代理后的原始IP。
  • %A:本地IP地址,有助于了解请求被哪个服务器处理。
  • %b%B:响应大小,分析带宽使用和页面加载性能。
  • %D:请求处理时间,可以用来识别慢速请求和性能问题。
  • %h%{c}h:远程主机名和底层TCP连接的主机名,有助于了解访问者的身份和地理位置。
  • %m:请求方法,分析GET、POST等请求的分布。
  • %q:查询字符串,了解用户的具体请求内容。
  • %r:请求行,包含请求方法、资源和HTTP版本,用于分析请求的类型和协议兼容性。
  • %s:状态码,分析成功请求和错误类型(如404、500等)。
  • %t:时间戳,了解请求发生的时间,有助于识别流量高峰时段。
  • %u:远程用户,如果进行了身份验证,可以用来分析特定用户的访问行为。
  • %U:请求的URL路径,分析页面访问的热门程度。
  • %{Referer}i%{User-agent}i:引用页和用户代理,分别用来分析流量来源和访问者使用的浏览器/操作系统。

通过对这些字段的分

5. 参考

  • Apache 官方文档: 用于理解 Ng 配置和日志处理。

mod_log_config - Apache HTTP Server Version 2.4

  1. 完成时间

本文档完成于:2024年08月19日。

相关推荐
s甜甜的学习之旅10 小时前
Apache POI练习代码
apache
是小崔啊10 小时前
开源轮子 - Apache Common
java·开源·apache
程序猿阿伟16 小时前
《探索 Apache Spark MLlib 与 Java 结合的卓越之道》
java·spark-ml·apache
开心工作室_kaic1 天前
springboot461学生成绩分析和弱项辅助系统设计(论文+源码)_kaic
开发语言·数据库·vue.js·php·apache
cr.sheeper1 天前
Vulnhub靶场Apache解析漏洞
网络安全·apache
ccc_9wy2 天前
Apache Solr RCE(CVE-2017-12629)--vulhub
apache·solr·lucene·burp suite·vulhub·远程命令执行漏洞rce·cve-2017-12629
ccc_9wy2 天前
Apache Solr RCE(CVE-2019-0193)--vulhub
网络安全·apache·solr·lucene·vulhub·cve-2019-0193·远程命令执行漏洞rce
casual_clover2 天前
搭建一个简单的Web服务器(Apache2.4)
服务器·apache
李三醒2 天前
Apache Tomcat 漏洞CVE-2024-50379条件竞争文件上传漏洞 servlet readonly spring boot 修复方式
spring boot·tomcat·apache
鸠摩智首席音效师3 天前
Apache 如何监听多个端口 ?
apache