找回密码
 立即注册
首页 业界区 安全 nginx + lua + kafka实现日志监控

nginx + lua + kafka实现日志监控

襁壮鸢 2025-6-1 21:26:43
nginx + lua + kafka实现日志监控

前言

1)架构图:
1.jpeg

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
  1. # --prefix:代表安装的路径 --with:需要加入的构建的包   --without:需要排除的包
  2. ./configure --prefix=/home/nginx/openresty --with-luajit --without-http_redis2_module --with-http_iconv_module
  3. make
  4. 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
  1. worker_processes  1;
  2. events {
  3.     worker_connections  1024;
  4. }
  5. http {
  6.     include       mime.types;
  7.     default_type  application/octet-stream;
  8.     sendfile        on;
  9.     #tcp_nopush     on;
  10.     #keepalive_timeout  0;
  11.     keepalive_timeout  65;
  12.     # 将所有kafka的lua脚本加载到nginx中
  13.     lua_package_path "/home/nginx/lua-resty-kafka/lua-resty-kafka-master/lib/?.lua;;";
  14.     #gzip  on;
  15.     server {
  16.         listen       8081;
  17.         server_name  localhost;
  18.         #charset koi8-r;
  19.         #access_log  logs/host.access.log  main;
  20.         location / {
  21.             root   /home/nginx/nginx-1.22.0/html/web_html;
  22.             index  index.html index.htm;
  23.         }
  24.        
  25.                 location /api {
  26.             proxy_pass  http://127.0.0.1:18081/api; # 转发规则
  27.             proxy_set_header Host $proxy_host; # 修改转发请求头,让8080端口的应用可以受到真实的请求
  28.                         proxy_set_header X-Real-IP $remote_addr;
  29.                         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  30.                         proxy_connect_timeout 8;  
  31.                         proxy_send_timeout 8;  
  32.                                 proxy_read_timeout 8;  
  33.                                 proxy_buffer_size 4k;  
  34.                         proxy_buffers 512 8k;  
  35.                         proxy_busy_buffers_size 8k;  
  36.                         proxy_temp_file_write_size 64k;  
  37.                         proxy_next_upstream http_500 http_502  http_503 http_504  error timeout invalid_header;  
  38.                         root   html;  
  39.                         index  index.html index.htm;  
  40.                         proxy_http_version 1.1;
  41.         # 使用log_by_lua 包含lua代码,因为log_by_lua指令运行在请求最后且不影响proxy_pass机制  
  42.         log_by_lua '  
  43.             -- 引入lua所有api  
  44.             local cjson = require "cjson"  
  45.             local producer = require "resty.kafka.producer"  
  46.             -- 定义kafka broker地址,ip需要和kafka的host.name配置一致  
  47.             local broker_list = {  
  48.                 { host = "192.168.1.31", port = 9092 },  
  49.             }  
  50.             -- 定义json便于日志数据整理收集  
  51.             local log_json = {}  
  52.             log_json["uri"]=ngx.var.uri  
  53.             log_json["args"]=ngx.var.args  
  54.             log_json["host"]=ngx.var.host  
  55.             log_json["request_body"]=ngx.var.request_body  
  56.             log_json["remote_addr"] = ngx.var.remote_addr  
  57.             log_json["remote_user"] = ngx.var.remote_user  
  58.             log_json["time_local"] = ngx.var.time_local  
  59.             log_json["status"] = ngx.var.status  
  60.             log_json["body_bytes_sent"] = ngx.var.body_bytes_sent  
  61.             log_json["http_referer"] = ngx.var.http_referer  
  62.             log_json["http_user_agent"] = ngx.var.http_user_agent  
  63.             log_json["http_x_forwarded_for"] = ngx.var.http_x_forwarded_for  
  64.             log_json["upstream_response_time"] = ngx.var.upstream_response_time  
  65.             log_json["request_time"] = ngx.var.request_time  
  66.             -- 转换json为字符串  
  67.             local message = cjson.encode(log_json);  
  68.             -- 定义kafka异步生产者  
  69.             local bp = producer:new(broker_list, { producer_type = "async" })  
  70.             -- 发送日志消息,send第二个参数key,用于kafka路由控制:  
  71.             -- key为nill(空)时,一段时间向同一partition写入数据  
  72.             -- 指定key,按照key的hash写入到对应的partition  
  73.             local ok, err = bp:send("test", nil, message)  
  74.             if not ok then  
  75.                 ngx.log(ngx.ERR, "kafka send err:", err)  
  76.                 return  
  77.             end  
  78.         ';
  79.          }
  80.         error_page   500 502 503 504  /50x.html;
  81.         location = /50x.html {
  82.             root   html;
  83.         }
  84.     }
  85. }
复制代码
五、检测&运行
  1. # 检测配置,只检测nginx配置是否正确,lua错误日志在nginx的error.log文件中  
  2. ./nginx -t /home/openresty/nginx/conf/nginx.conf  
  3. # 启动  
  4. ./nginx -c /home/openresty/nginx/conf/nginx.conf  
  5. # 重启  
  6. ./nginx -s reload  
复制代码
参考文章
六、编译失败

!!!!nginx版本不兼容的情况
2.jpeg

发生原因: 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.png

3)重新编译
make && make install 即可

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册