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的⻚页⾯面
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
上诉做法存在一个问题:如果一直往一个⽂件中写入数据,这个日志文件会过大,造成读写效率变低,现在按照小时生成文件
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), 这样既能实现负载均衡又能使用高可用
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
运行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