nginx + lua + kafka实现日志监控

news/2025/3/5 15:56:25/文章来源:https://www.cnblogs.com/curryAhui/p/18752841

nginx + lua + kafka实现日志监控

前言

1)架构图:

2)方案:

  • 1:线上请求打向nginx后,使用lua完成日志整理:如统一日志格式,过滤无效请求,分组等。
  • 2:根据不同业务的nginx日志,划分不同的topic。
  • 3:lua实现producter异步发送到kafka集群。
  • 4:对不同日志感兴趣的业务组实时消费获取日志数据。

3)技术框架

  • openresty: http://openresty.org
  • kafka: http://kafka.apache.org
  • lua-resty-kafka: https://github.com/doujiang24/lua-resty-kafka

当前目录: /home/nginx

一、安装openresty

1)下载openresty

wget https://openresty.org/download/openresty-1.11.2.5.tar.gz

2)解压openresty

tar -zxvf openresty-1.11.2.5.tar.gz

3)重命名

mv openresty-1.11.2.5 openresty

4)安装openresty

# --prefix:代表安装的路径 --with:需要加入的构建的包   --without:需要排除的包
./configure --prefix=/home/nginx/openresty --with-luajit --without-http_redis2_module --with-http_iconv_module
make
make install

如遇报错详见第六章!!!!

二、安装lua-resty-kafka

wget https://github.com/doujiang24/lua-resty-kafka/archive/master.zip
unzip lua-resty-kafka-master.zip -d /home/nginx/

三、部署kafka

参考文档

四、nginx配置

1)进入openresty

  • cd /home/nginx/openresty

  • vim nginx/conf/nginx.conf

worker_processes  1;
events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;# 将所有kafka的lua脚本加载到nginx中lua_package_path "/home/nginx/lua-resty-kafka/lua-resty-kafka-master/lib/?.lua;;";#gzip  on;server {listen       8081;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {root   /home/nginx/nginx-1.22.0/html/web_html;index  index.html index.htm;}location /api {proxy_pass  http://127.0.0.1:18081/api; # 转发规则proxy_set_header Host $proxy_host; # 修改转发请求头,让8080端口的应用可以受到真实的请求proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_connect_timeout 8;  proxy_send_timeout 8;  proxy_read_timeout 8;  proxy_buffer_size 4k;  proxy_buffers 512 8k;  proxy_busy_buffers_size 8k;  proxy_temp_file_write_size 64k;  proxy_next_upstream http_500 http_502  http_503 http_504  error timeout invalid_header;  root   html;  index  index.html index.htm;  proxy_http_version 1.1;# 使用log_by_lua 包含lua代码,因为log_by_lua指令运行在请求最后且不影响proxy_pass机制  log_by_lua '  -- 引入lua所有api  local cjson = require "cjson"  local producer = require "resty.kafka.producer"  -- 定义kafka broker地址,ip需要和kafka的host.name配置一致  local broker_list = {  { host = "192.168.1.31", port = 9092 },  }  -- 定义json便于日志数据整理收集  local log_json = {}  log_json["uri"]=ngx.var.uri  log_json["args"]=ngx.var.args  log_json["host"]=ngx.var.host  log_json["request_body"]=ngx.var.request_body  log_json["remote_addr"] = ngx.var.remote_addr  log_json["remote_user"] = ngx.var.remote_user  log_json["time_local"] = ngx.var.time_local  log_json["status"] = ngx.var.status  log_json["body_bytes_sent"] = ngx.var.body_bytes_sent  log_json["http_referer"] = ngx.var.http_referer  log_json["http_user_agent"] = ngx.var.http_user_agent  log_json["http_x_forwarded_for"] = ngx.var.http_x_forwarded_for  log_json["upstream_response_time"] = ngx.var.upstream_response_time  log_json["request_time"] = ngx.var.request_time  -- 转换json为字符串  local message = cjson.encode(log_json);  -- 定义kafka异步生产者  local bp = producer:new(broker_list, { producer_type = "async" })  -- 发送日志消息,send第二个参数key,用于kafka路由控制:  -- key为nill(空)时,一段时间向同一partition写入数据  -- 指定key,按照key的hash写入到对应的partition  local ok, err = bp:send("test", nil, message)  if not ok then  ngx.log(ngx.ERR, "kafka send err:", err)  return  end  '; }error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}
}

五、检测&运行

# 检测配置,只检测nginx配置是否正确,lua错误日志在nginx的error.log文件中  
./nginx -t /home/openresty/nginx/conf/nginx.conf  
# 启动  
./nginx -c /home/openresty/nginx/conf/nginx.conf  
# 重启  
./nginx -s reload  

参考文章

六、编译失败

!!!!nginx版本不兼容的情况

发生原因: nginx版本不兼容!!!

在openresty make时,会出现 src/os/unix/ngx_user.c:36:7: 错误:‘struct crypt_data’没有名为‘current_salt’的成员

解决方式:

1)编辑nix_user.c

vim /home/nginx/openresty/build/nginx-1.11.2/src/os/unix/ngx_user.c

2)注释 cd.current_salt[0] = ~salt[0];

3)重新编译

make && make install 即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/894043.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day 17思维导图

图上有知识的补充!

Causal learning

简单来看:Causal learning = To learn causal models/features from dataCausal research 里包括两种重要问题,一种是Causal learning,另一种是Causal reasoning(不同的文献有不同的分法和叫法,这里用Jonas Peters等人的书里的)。简单的说,前者想解决如何从数据中发现因…

AI科研到底能做什么?看完你就懂了!

0 前言 本专栏目标:能做什么? 要怎么做? 效果如何?本质: 多Agent实现从数据采集到可视化全流程 AIGC数据应用: 数据采集 通过编写爬虫代码、访问数据库、读取文件、调用API等方式,采集社交媒体数据、数据库内容、文本数据、接口数据等。 数据处理 通过数据清洗、数据集成…

gitlab+jenkins+harbor+k8s安装操作流程之gitlab

GitLab的安装及使用教程GitLab简介GitLab,是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目安装。 它拥有与GitHub类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏…

fastadmin视图文件调用common.php的公共函数

╰︶﹉⋛⋋⊱⋋๑๑⋌⊰⋌⋚﹉︶╯

linux内核编译输出文件:vmlinux/Image/zImage/uImage区别

当前目录 ./ 为linux kernel编译输出根目录: ./vmlinux是编译输出的原始elf文件,可用于调试; ./arch/arm/boot/Image是二进制文件,可用于烧录,文件较大,使用工具链objcopy从./vmlinux生成; ./arch/arm/boot/compressed/vmlinux是elf文件,先将./arch/arm/boot/Image用gz…

AI 造游戏,3 小时开发、9 天狂赚 12 万,这波风口你跟不跟?

​故事要从这个上海程序员说起​ 有个叫Pieter Levels的码农,之前在全球最大的远程办公平台Remote OK工作过。去年某天,他突然想做个能在线玩、还能赚钱的小游戏。结果他和AI搭档,只用了三个小时就捣鼓出了一个能手机玩的飞机大战游戏,上线十天狂揽28万人民币,连马斯克都发…

通义灵码上新推理模型,快来体验数学和编程双冠王 Qwen2.5-Max

近期,通义灵码上新了模型选择功能,除新增 DeepSeek 满血版 V3 和 R1 外, Qwen2.5-Max 也正式上线,它使用了超过 20 万亿 token 的预训练数据及精心设计的后训练方案进行训练。近期,通义灵码上新了模型选择功能,除新增 DeepSeek 满血版 V3 和 R1 外, Qwen2.5-Max 也正式上…

绝了!k3s (k8s) 安装 ollama 运行 deepseek 全流程揭秘,yaml全公开

🎯k3s (k8s) 环境搭建与 ollama 相关 yaml 文件部署 在容器编排的世界中,k3s (k8s) 无疑是备受瞩目的存在。此次聚焦在 k3s (k8s) 环境下安装 ollama,并实现运行 deepseek。首先映入眼帘的是一个关键的 yaml 文件 ——ollama.yaml 。这个文件犹如整个部署流程的指挥棒,规定…

如何在Windows下离线部署DeepSeek并以WebApi形式调用

最近这一块的话题有点火,这里也找资料学习了解了一下,分享出来。 目前应该有很多公司已经通过官方的WebApi接口接入了DeepSeek。 本文可以帮助你离线使用DeepSeek的WebApi,并集成到自己的程序里。 文末会有示例程序。Ollama是什么 Ollama 是一个开源的 AI 模型服务平台,旨在…

基于 MySQL 8.0 细粒度授权:单独授予 KILL 权限的优雅解决方案

基于 MySQL 8.0 细粒度授权:单独授予 KILL 权限的优雅解决方案一、引言 作为一名数据库从业者,我在日常工作中经常会遇到一个棘手的问题:如何在保证安全的前提下,让业务团队拥有足够的权限去管理数据库执行的 SQL,尤其是终止那些失控的慢查询或异常线程?这个问题看似简单…

对比Jira/禅道后,我们为什么选择Leangoo做敏捷项目管理?

Leangoo团队为开发者提供敏捷开发支持:免费获取《敏捷开发指南》;支持企业私有化部署,提供专属API文档及金融、电商行业落地案例,助力研发流程自动化升级。一、敏捷团队的3大隐形痛点 我曾带领过一个6人的Scrum团队,迭代经常遇到: 需求变更黑洞:客户口头需求未及时同步,…