flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去

1. openrestry的安装

  OpenResty = Nginx + Lua,是⼀一个增强的Nginx,可以编写lua脚本实现⾮非常灵活的逻辑

(1)安装开发库依赖

yum install -y pcre-devel openssl-devel gcc curl

(2)配置yum的依赖源

yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

(3)安装OpenResty

yum install openresty

安装过程中出现问题的解决办法

cd /etc/yum.repos.d
yum install wget
wget  https://openresty.org/package/centos/openresty.repo
vi openresty.repo
将https改成http(改两个地方)
yum install openresty

(4)openresty的默认安装⽬目录

/usr/local/openresty

(5)启动openresty(Nginx)

/usr/local/openresty/nginx/sbin/nginx

(6)通过浏览器器查看nginx的⻚页⾯面

flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去_第1张图片

 

  2.  使用nginx+lua将日志数据写入指定文件中

需求:访问某个地址,nginx页面只显示1*1像素的空图片,然后将日志记录到指定的文件中去

(1)创建存放日志的目录并设置权限

mkdir /logs
chmod o+w /logs

为什么要设置权限呢,因为往logs的access.log文件写日志数据的用户是nobody,如下

(2)vi  nginx.conf

location /log.gif{
            #伪装成gif文件
            default_type 'image/gif';
            #关闭access_log
            access_log off;
            # 使用lua将nginx接受的参数写入到日志文件中
            log_by_lua_file 'conf/log.lua';
            #返回空图片
            empty_gif;
        }

(3)在nginx的conf⽬目录下创建⼀一个log.lua⽂文件

vi /usr/local/openresty/nginx/conf/log.lua

log.lua脚本内容如下

-- 引⼊入lua所有解析json的库
local cjson = require "cjson"
-- 获取请求参数列列表
local request_args_tab = ngx.req.get_uri_args()
-- 使⽤用lua的io打开⼀一个⽂文件,如果⽂文件不不存在,就创建,a为append模式
local file = io.open("/logs/access.log", "a")
-- 定义⼀一个json对象
local log_json = {}
-- 将参数的K和V迭代出来,添加到json对象中
for k, v in pairs(request_args_tab) do
log_json[k] = v
end
-- 将json写⼊入到指定的log⽂文件,末尾追加换⾏行行
file:write(cjson.encode(log_json), "\n")
-- 将数据写⼊入
file:flush()

(4)在浏览器上请求feng05/log.gjf,能发现数据写入了/logs/access.log

flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去_第2张图片

 

 上诉做法存在一个问题:如果一直往一个⽂件中写入数据,这个日志文件会过大,造成读写效率变低,现在按照小时生成文件

log.lua脚本内容修改如下所示

-- 引⼊入lua⽤用来解析json的库
local cjson = require "cjson"
-- 获取请求参数列列表
local request_args_tab = ngx.req.get_uri_args()
-- 获取当前系统时间
local time = os.date("%Y%m%d%H",unixtime)
-- 使⽤用lua的io打开⼀一个⽂文件,如果⽂文件不不存在,就创建,a为append模式
local path = "/mylog/access-" .. time .. ".log"
local file = io.open(path, "a")
-- 定义⼀一个json对象
local log_json = {}
-- 将参数的K和V迭代出来,添加到json对象中
for k, v in pairs(request_args_tab) do
log_json[k] = v
end
-- 将json写⼊入到指定的log⽂文件,末尾追加换⾏行行
file:write(cjson.encode(log_json), "\n")
-- 将数据写⼊入
file:flush()

这样就会按照时间滚动生成日志文件了

 

 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去

  此处数据采集的架构为flume+kafka(taildir+kafkachannel), 这样既能实现负载均衡又能使用高可用

flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去_第3张图片

 

 

flume采集数据的配置文件如下所示:nginx-kafka.conf

a1.sources = r1
a1.channels = c1

a1.sources.r1.type = TAILDIR
a1.sources.r1.positionFile = /root/taildir_position.json    //此处表示taildir采集的记录,即偏移量
a1.sources.r1.filegroups = f1
a1.sources.r1.filegroups.f1 = /log/access-.*\.log

a1.channels.c1.type = org.apache.flume.channel.kafka.KafkaChannel
a1.channels.c1.kafka.bootstrap.servers = feng05:9092,feng06:9092,feng07:9092
a1.channels.c1.kafka.topic = access12
a1.channels.c1.parseAsFlumeEvent = false

a1.sources.r1.channels = c1
View Code

运行flume进行采集,数据即可采集至kafka中,命令如下

/usr/apps/apache-flume-1.9.0-bin/bin/flume-ng agent -n a1 -c conf \
-f myconf/nginx-kafka.conf \
-Dflume.root.logger=INFO,console
/usr/apps/kafka_2.11-2.4.0/bin/kafka-console-consumer.sh --bootstrap-server feng05:9092 --topic access --from-beginning

 

你可能感兴趣的:(flink---实时项目--day01--1. openrestry的安装 2. 使用nginx+lua将日志数据写入指定文件中 3. 使用flume将本地磁盘中的日志数据采集到的kafka中去)