一、为什么使用 Nginx 作为数据接收端
Nginx 作为一款高性能的 HTTP Web 服务器,不仅稳定、低消耗,还有非常丰富的功能集,只需要简单的配置就能成为一个数据接收端,自身还能作为负载均衡来使用。
整体只需要配置日志格式、端口监听即可完成。
二、Nginx 格式
数据格式
$proxy_add_x_forwarded_for HTTP 请求端真实的 IP
$msec 写入日志条目到当前时间,精确到百万分之一
$remote_addr 客户端 IP
$time_local 通用日志格式下的本地时间
$status 状态码
$body_bytes_sent 发送给客户端的字节数,不包括响应头大小
$http_user_agent 客户端浏览器信息
$http_referer 请求的 referer 地址
$request 完整的原始请求
$request_method HTTP 请求方法,通常是 GET、POST
$requset_time 请求处理时长
$request_uri 完整的请求地址
$server_protocol 服务器 HTTP 版本,通常是 HTTP/1.0、HTTP/1.1
$request_body POST 请求参数,form 中的参数
token $http_token 自定义 header 字段前面加 http_
version $arg_version 自定义 body 字段前面加 arg_
日志格式
# log_format 是 Nginx 定义日志格式的标识
# log_name 是自定义的名字,可以根据所接收的数据类型命名
# format 是数据记录的格式
log_format log_name format
三、Nginx 接收配置
接收数据是使用 Nginx 的日志功能进行接收写入,最终落盘
http {
include mime.types;
# _++_ 是分隔符,方便后续数据解析
# 数据格式:真实 IP _++_ Nginx 接收时间 _++_ 请求方法 _++_ body project 字段 _++_ body data 字段 _++_ body token 字段 _++_ POST 请求参数 _++_ 浏览器信息
log_format web_point '"$proxy_add_x_forwarded_for" _++_ "$msec" _++_ "$request_method" _++_ "$arg_project" _++_ "$arg_data" _++_ "$arg_token" _++_ "$request_body" _++_ "$http_user_agent"';
# 根据需求自行配置
gzip on;
# 时间格式
map $time_iso8601 $logdate {
'~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd; default 'nodate';
}
server {
listen 8080;
location /web_point {
# 埋点数据关闭缓存
add_header Cache-Control 'no-cache, no-store, must-revalidate';
# 输出 POST 请求的 body,需要加入 Nginx-echo 模块
echo_read_request_body;
# 将数据以 web_point 的格式保存到文件中,文件按照 logdate 格式存储(按天)
access_log /usr/local/logs/nginx/web_access.${logdate} web_point;
}
}
}
四、数据落盘结果
原始数据

“27.258.256.250” _++_ “1612345678.782” _++_ “POST” _++_ “project” _++_ “data” _++_ “toekn” _++_ “key=value&point=line&data=abc” _++_ “PostmanRuntime/7.29.2”
Postman 测试参数

http://localhost:8080/web_point
这个地址可以作为神策埋点 SDK 的服务端接收地址接收埋点数据,再配合 Java IO、Flume 等工具拉取数据进行进一步的处理,然后将数据落入数据仓库给分析系统使用。
329

被折叠的 条评论
为什么被折叠?



