Lua收集请求日志

news2024/11/15 17:19:53

Kafka搭建

单机版的kafka搭建非常简单,不过我们今天采用Docker搭建kafka。Kafka使用Zookeeper存储Consumer、Broker信息,安装kafak的时候,需要先安装Zookeeper。

Zookeeper安装:

docker run -d --name zookeeper -p 3181:3181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper

讲解:/etc/localtime:/etc/localtime:使容器与宿主机时间能够同步

Kafka安装:

docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=172.17.0.223:3181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.17.0.223:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime wurstmeister/kafka

讲解:

KAFKA_BROKER_ID:当前Kafka的唯一ID
KAFKA_ZOOKEEPER_CONNECT:当前Kafka使用的Zookeeper配置信息
KAFKA_ADVERTISED_LISTENERS:对外发布(暴露)的监听器,对外发布监听端口、地址
KAFKA_LISTENERS:监听器,告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka服务。

IP更改:

外部程序如果想链接Kafka,需要根据IP链接,所以我们可以给Kafka一个IP名字,编辑:/opt/kafka_2.12-2.4.1/config/server.properties,在文件最末尾添加如下代码:

host.name=192.168.211.137

队列创建

进入kafka容器,创建队列:

docker exec -it kafka /bin/sh

cd /opt/kafka_2.12-2.4.1/bin

./kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic itemaccess

讲解:

解释:使用kafka-topics.sh创建队列
        --create:执行创建一个新的队列操作
        --bootstrap-server:需要链接的kafka配置,必填
        --replication-factor 1:设置分区的副本数量
        --topic itemaccess:队列的名字叫itemaccess

消息发布

在kafka容器中执行消息发送(接着上面的步骤执行):

./kafka-console-producer.sh --broker-list localhost:9092 --topic itemaccess

讲解:

解释:使用kafka-console-producer.sh实现向kafka的test队列发送消息
        --broker-list:指定将消息发给指定的Kafka服务的链接列表配置  HOST1:Port1,HOST2:Port2
        --topic itemaccess:指定要发送消息的队列名字

我们发送的消息如下(输入信息,回车即可发送):

{"actime":"2020-4-10 9:50:10","uri":"http://www-seckill.zhushanglin.net/items/333.html","IP":"119.123.33.231","Token":"Bearer zhushanglin"}

消息订阅

在kafka容器中执行消息订阅(接着上面的步骤执行,但要先按ctrl+c退出控制台):

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic itemaccess --from-beginning

讲解:

解释:使用kafka-console-consumer.sh从kafka中消费test队列的数据
        --bootstrap-server:从指定的kafka中读取消息
        --topic itemaccess:读取队列的名字
        --from-beginning:从最开始的数据读取,也就是读取所有数据的意思

查看已经存在的主题:

./kafka-topics.sh --zookeeper localhost:3181 --list

删除主题:

./kafka-topics.sh --zookeeper localhost:3181 --delete --topic itemaccess

查看主题信息:

/kafka-topics.sh --zookeeper localhost:3181 --describe --topic itemaccess

信息查看

​ 上面执行整个流程如下图:
在这里插入图片描述
Kafka注册信息查看:

​ 我们进入到zookeeper中,可以查看到kafka的注册信息,相关操作命令如下:

docker exec -it zookeeper /bin/bash

cd bin

./zkCli.sh

ls /

效果如下:
在这里插入图片描述
关于Kafka的学习,大家可以直接参考:http://kafka.apache.org/quickstart
在这里插入图片描述

收集日志-Lua

​ Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

​ OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。OpenResty 通过lua脚本扩展nginx功能,可提供负载均衡、请求路由、安全认证、服务鉴权、流量控制与日志监控等服务。

​ OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

​ 关于Lua的基本知识,我们这里就不学习了,直接进入日志收集的使用操作。

OpenRestry安装

关于OpenRestry的学习,大家可以参考:http://openresty.org/cn/

下载OpenRestry:

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

解压:

tar -xf openresty-1.11.2.5.tar.gz

安装(进入到解压目录进行安装):

cd openresty-1.11.2.5

./configure --prefix=/usr/local/openresty --with-luajit --without-http_redis2_module --with-http_stub_status_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module

make

make install

软件会安装到/usr/local/openresty,这里面会包含nginx。
在这里插入图片描述
配置环境变量:

vi /etc/profile

export PATH=/usr/local/openresty/nginx/sbin:$PATH

source /etc/profile

详情页发布

​ 商品详情页生成后会存储在/usr/local/server/web/items目录下,详情页是静态网页,我们可以使用Nginx直接发布。

​ 商品详情页的访问:http://192.168.211.137/items/S1235433012716498944.html,我们可以让所有以/items/的请求直接到/usr/local/server/web/目录下找。

修改nginx.conf:

cd /usr/local/openresty/nginx/conf/

vi nginx.conf

修改内容如下:

在这里插入图片描述

启动nginx,并访问测试:http://192.168.211.137/items/S1235433012716498944.html

Lua日志收集

​ 使用Lua实现日志收集,并向Kafka发送访问的详情页信息,此时我们需要安装一个依赖组件lua-restry-kafka。关于lua-restry-kafka的下载和使用,可以参考https://github.com/doujiang24/lua-resty-kafka

1)收集流程

​ 日志收集流程如下:
在这里插入图片描述
用户请求/web/items/1.html,进入到nginx第1个location中,在该location中向Kafka发送请求日志信息,并将请求中的/web去掉,跳转到另一个location中,并查找本地文件,这样既可以完成日志收集,也能完成文件的访问。

2)插件配置

lua-restry-kafka:https://github.com/doujiang24/lua-resty-kafka

在资料\lua中已经提供了该包lua-resty-kafka-master.zip,我们需要将该文件上传到/usr/local/openrestry目录下,并解压,再配置使用。

解压:

unzip lua-resty-kafka-master.zip

配置:

修改nginx.conf,在配置文件中指定lua-resty-kafka的库文件位置:

lua_package_path "/usr/local/openresty/lua-resty-kafka-master/lib/?.lua;;";

配置效果图如下:
在这里插入图片描述
3)日志收集

​ 用户访问详情页的时候,需要实现日志收集,日志收集采用Lua将当前访问信息发布到Kafka中,因此这里要实现Kafka消息生产者。

我们定义一个消息格式:

{
  "actime": "2020-4-10 9:50:30",
  "uri": "http://192.168.211.137/items/S1235433012716498944.html",
  "ip": "119.123.33.231",
  "token": "Bearer ITHEIMAOOPJAVAITCAST"
}

生产者脚本:

定义好了消息格式后,创建一个生产者,往Kafka中发送详情页的访问信息。我们创建一个lua脚本,items-access.lua,脚本内容如下:
在这里插入图片描述
上图脚本内容如下:

--引入json解析库
local cjson = require("cjson")
--kafka依赖库
local client = require "resty.kafka.client"
local producer = require "resty.kafka.producer"
--配置kafka的链接地址
local broker_list = {
      { host = "192.168.211.137", port = 9092 }
}
--创建生产者
local pro = producer:new(broker_list,{ producer_type="async"})

--获取IP
local headers=ngx.req.get_headers()
local ip=headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or ngx.var.remote_addr or "0.0.0.0"

--定义消息内容
local logjson = {}
logjson["uri"]=ngx.var.uri
logjson["ip"]=ip
logjson["token"]="Bearer ITHEIMA"
logjson["actime"]=os.date("%Y-%m-%d %H:%m:%S")

--发送消息
local offset, err = pro:send("itemaccess", nil, cjson.encode(logjson))

--页面跳转
local uri = ngx.var.uri
uri = string.gsub(uri,"/web","")
ngx.exec(uri)

4)nginx配置
按照上面的流程图,我们需要配置nginx的2个location,修改nginx.conf,代码如下:

在这里插入图片描述

上图代码如下:

server {
    listen       80;
    server_name  localhost;

    #/web开始的请求,做日志记录,然后跳转到下面的location
    location /web/items/ {
    content_by_lua_file /usr/local/openresty/nginx/lua/items-access.lua;
    }


    #商品详情页,以/items/开始的请求,直接在详情页目录下找文件
    location /items/ {
    #日志处理
    #content_by_lua_file /usr/local/openresty/nginx/lua/items-access.lua;
    root /usr/local/server/web/;
    }
}

5)日志收集测试

请求地址:http://192.168.211.137/web/items/S1235433012716498944.html

查看Kafka的itemaccess队列数据:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《网络安全自学指南》

《网络安全自学教程》 《网络安全自学》 1、网络协议安全1.1、OSI七层模型1.2、TCP/IP协议栈1.3、Wireshark使用1.4、802.1x协议1.5、ARP协议1.6、ARP欺骗1.7、IP协议1.8、ICMP协议1.9、TCP协议1.10、SYN Flood1.11、SSL协议1.12、HTTP协议1.13、DHCP协议 2、操作系统安全2.1、…

<数据集>TACO垃圾识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:6004张 标注数量(xml文件个数):6004 标注数量(txt文件个数):6004 标注类别数:18 标注类别名称:[Crankshaft, Centrifugal_body, Washer_container, Circlip_containe…

保存和加载工作区变量

目录 保存工作区变量 加载工作区变量 查看 MAT 文件的内容 在 MATLAB 会话之间并不保留工作区。退出 MATLAB 时,工作区清除。但是,您可以将当前工作区中的任何或所有变量保存到 MAT 文件(.mat)中。之后,只需加载保存的 MAT 文件&#xff0…

工业设备定位激光器在工业领域的应用

在日新月异的工业制造领域,技术的每一次飞跃都深刻影响着生产效率和产品质量的双重提升。其中,工业设备定位激光器作为现代工业自动化的核心元件之一,正以其高精度、高效率和广泛的应用范围,引领着制造业的智能化转型。接下来给大…

<PLC><算法>使用汇川eazy521系列PLC,如何使用LiteST语言对乱序数组进行排序?(冒泡法)

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏…

NS4054H 40V 高耐压线性锂离子电池充电管理 IC

1 特性  最大输入电压: 40V  输入过压保护电压: 6V  内置输入过流保护: 1A  支持 0V 电池电压充电  充电电流可编程  4.2V 充电浮充阈值电压  电池待机电流< 1uA  内置 C/10 充满截止功能 …

数据结构-manacher算法

第一种情况: 以t为中心,他的回文串为abedeks, 同时i’的回文为ede,那么i的回文也是ede。 第二种情况:以s为中心的回文串为 tabkdedk,而以i’为中心的回文串为abkde,已不再L和R之间。此时以i为中心的回文串就为kdedk. 第三种情况: 以t为中心…

书生大模型实战营第三期基础岛第六课——OpenCompass 评测 InternLM-1.8B 实践

OpenCompass 评测 InternLM-1.8B 实践 基础作业:创建虚拟环境下载并安装opencompass安装相关依赖复制测评数据集到当前目录下并解压测评前环境变量配置使用命令行配置参数法进行评测 基础作业: 使用 OpenCompass 评测 internlm2-chat-1.8b 模型在 ceval 数据集上的性能&#x…

强化学习,第 4 部分:蒙特卡洛控制

目录 一、介绍 1.1 强化学习 2.1 关于此文章 三、ε贪婪策略 四、蒙特卡洛控制 4.1 基本原理 4.2 举个例子 五、On-policy & off-policy 方法 六、重要性采样 6.1 赋予动机 6.2 想法 6.3 应用 七、增量实施 7.1 增量的理论 7.2 常α MC 八、结论 一、介绍 …

Livekit本地部署Egress录制服务

Livekit本地部署Egress录制服务 Egress官方推荐使用Docker方式部署。官方文档 创建Egress配置文件 新建config文件 vim config.yamlconfig.yaml文件内容 log_level: debug# api_key 参考livekit 部署 配置的 api_key: 2yJimTMFeF9h15PHEv api_secret: Mvi9ZgqGJ3LqwEAcTV…

项目管理的七大核心要素

项目管理不仅涉及一系列复杂的活动,还涵盖了多个关键要素,这些要素相互交织,共同构成了项目成功的基石。 项目管理七大要素: 1、明确的项目目标: 项目管理的起点是确立清晰、具体、可衡量的项目目标。这些目标不仅为…

新手网络爬虫利器介绍 之 移动蜂窝网络代理

移动蜂窝代理对接说明 在爬虫与反爬虫斗争愈演愈烈的情况下,各大网站和 App 的风控检测越来越强,其中一项就是 IP 封禁。 为了解决 IP 封禁的困扰,一个有效的方式就是设置代理,设置代理之后,爬虫可以借助代理的 IP 来…

IntelliJ IDEA 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开设置对话框2. 设置编辑器字体3. 设置编译软件整体字体 前言 IntelliJ IDEA 自定义字体大小,统一设置为 JetBrains Mono 具体操作 【File】>【Settings...】>【Editor】>【Font】 统一设置…

关于git报错please clean your repository working tree

在vscode中使用git拉取代码提示:在签出前,请清理存储库工作树。有时候在写代码前未更新远程代码,会出现代码冲突。 1.git stash 先将本地修改存储在暂存区2.git pull 拉取远程代码3.git stash pop 释放暂存区内容

书生大模型实战营-进阶关卡-6-MindSearch 快速部署

任务:将 MindSearch 部署到 HuggingFace 教程:https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/MindSearch/readme_github.md 环境配置 打开codespace主页https://github.com/codespacescodespace主页,选择blank template。 新…

turtlebot 测试 Gazebo Harmonic ROS Jazzy

源码移植后理论上支持所有Gazebo和ROS版本,但花费时间较多。 只推荐学习Gazebo 经典版和Gazebo Harmonic以及之后版本。 在中间的过渡版本,不推荐学习。 Gazebo经典版包括Gazebo 7 Gazebo 9 Gazebo 11。 Gazebo Harmonic 和 ROS2 jazzy 安装和测试-CSDN博…

核心数据加密的实现方式

核心数据加密是保护企业敏感数据和技术机密的重要手段,它通过加密算法和密钥将明文数据转换为难以解读的密文,以防止数据在存储、传输或使用过程中被未授权访问或泄露。以下是对核心数据加密的详细解析: 一、核心数据加密的重要性 在数字化时…

短视频SDK解决方案,原开发团队,一对一技术支持

美摄科技,作为行业领先的视频技术提供商,凭借深厚的技术积累和敏锐的市场洞察,隆重推出其短视频SDK解决方案,旨在为全球开发者及内容创作者搭建一座通往无限创意与高效生产的桥梁。 【一站式解决方案,赋能创意无界】 …

华裔二、三代长相变迁的多维度解析

华裔二、三代长相变迁的多维度解析http://www.rebootvip.com/wenzhang/3182.html 在全球化日益加深的今天,华裔二、三代的长相特征逐渐展现出与传统中国人形象不同的风貌,这一现象背后蕴含着丰富的生物学、文化、社会及个人层面的原因。以下是对此…

8.27练习

一.创建3个线程&#xff0c;一个子线程拷贝文件的前一半&#xff0c;一个子线程拷贝后一半文件 创建两个子线程分别负责拷贝文件的前半段和后半段&#xff0c;从而提高文件拷贝的效率。父线程负责创建和管理子线程&#xff0c;并等待它们完成任务。 #include <myhead.h>…