一、标准化Nginx日志配置
要进行精准的流量拆解,第一步是确保日志记录了所有必要的维度。默认的Nginx combined格式缺少部分关键信息,我们需要自定义一个包含更详细字段的日志格式,特别是Referer(来源)、Request_URI(访问路径)和Request_Time(响应时间)。
1.1 修改nginx.conf配置文件
打开服务器的Nginx配置文件,通常位于/etc/nginx/nginx.conf或/usr/local/nginx/conf/nginx.conf。在http块中添加或修改log_format。我们将该格式命名为traffic_format。
请复制以下完整配置代码段替换原有的log_format部分:
```nginx
log_format traffic_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
```
配置说明:
- $remote_addr:客户端IP地址,用于计算UV(独立访客)。
- $time_local:访问时间,用于按小时或天聚合流量。
- $request:请求行,包含请求方法和URI。
- $http_referer:来源页面,这是流量拆解的核心字段,用于判断是搜索引擎、外链还是站内跳转。
- $request_time:请求处理总时间,用于分析页面性能。
1.2 应用配置并重载
在server块中确保access_log引用了我们定义的格式:
```nginx
server {
listen 80;
server_name your-domain.com;
确保这里引用了 traffic_format
access_log /var/log/nginx/traffic_access.log traffic_format;
...
}
```
保存配置文件后,执行以下命令检查语法并重载服务,使配置生效:
```bash
nginx -t
nginx -s reload
```
二、Python环境与依赖安装
我们将使用Python进行日志解析,因为它在处理文本和正则匹配方面具有极高的灵活性。你需要准备一台安装了Python 3.6+环境的服务器或本地机器。
2.1 安装依赖库
为了处理数据和分析,我们需要安装pandas和urllib(Python 3通常内置,但为了兼容性建议检查)。在终端执行以下命令安装所需的第三方库:
```bash
pip install pandas numpy
```
三、核心解析脚本编写
创建一个名为traffic_analysis.py的文件。该脚本将完成日志读取、来源识别、路径分类及数据统计。我们将实现两个核心功能:流量来源归因和站内路径热度分析。

请复制以下完整代码到文件中:
```python
import re
import pandas as pd
from urllib.parse import urlparse
from collections import Counter
配置项
LOG_FILE = '/var/log/nginx/traffic_access.log' 你的日志文件路径
OUTPUT_CSV = 'traffic_report.csv' 输出结果文件
定义常见的搜索引擎列表,用于识别搜索流量
SEARCH_ENGINES = {
'baidu.com': 'Baidu',
'google.com': 'Google',
'bing.com': 'Bing',
'sogou.com': 'Sogou'
}
定义站内主要路径的正则匹配规则
PATH_RULES = {
'Home': r'^/$',
'Product_List': r'^/products',
'Product_Detail': r'^/product/\d+',
'Cart': r'^/cart',
'Checkout': r'^/checkout',
'Article': r'^/article/\d+',
'Other': r'.'
}
def parse_log_line(line):
"""解析单行Nginx日志"""
使用正则提取关键部分,注意:这里假设日志格式严格遵循上文配置
匹配模式:IP - - [Time] "Method URL Protocol" Status Size "Referer" "UA" ReqTime UpTime
pattern = re.compile(
r'(?P
\d+\.\d+\.\d+\.\d+) - - \[(?P