8月18日(周六)成都源创会火热报名中,四位一线行业大牛与你面对面,探讨区块链技术热潮下的冷思考。
Watch Star Fork

金泉 / ngxlogsplitC

加入码云
与超过 300 万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
暂无描述
Loading...
README.md 4.93 KB

logsplit程序采用线程池+MySQL连接池处理NGINX http log中的文本数据,通过MySQL Connector/C并发插入到数据库中;

最终通过MySQL数据库强大的搜索、查询、排序功能,实现对http客户端上网行为的简单分析与判断。

准备工作

:point_right: 安装过程保持网络畅通

:point_right: cmake version 2.8.12.2以上

安装glib2与工具    sudo yum install -y glib2-devel automake wget dos2unix

ngxlogsplit仓库clone

  git clone git@gitee.com:jinquan711/ngxlogsplit.git

自动安装

cd ngxlogsplit

chmod a+x auto_install.sh

./auto_install.sh

:ghost: 剩下的事情就是耐心等待... ... ...

:no_entry: 如果安装过程中出现异常,请尝试手工编译安装 https://gitee.com/jinquan711/ngxlogsplit/blob/master/INSTALL.md

使用logsplit

:point_right: 必须预先完成MySQL服务器部署的相关工作

修改配置文件logsplit.cfg

配置MySQL-Server的IP、login user、login password、DB instance name、table name、表空间最大行数

{

   "db_conn_ipv4":         "192.168.1.100",                # MySQL服务器IP

   "db_conn_user":         "ngxlog",                       # DB用户名

   "db_conn_pass":         "passwd123456",                 # DB用户登录密码

   "db_name":              "ACCLOG",                       # MySQL数据库实例名称

   "db_conn_port":         3306,                           # MySQL服务器连接端口

   "db_conns":             80,                             # DB连接池通道数

   "tab_name":             "ngxproxy_20180604",            # 数据插入表名称

   "tab_engine":           "MyISAM",                       # MySQL存储引擎

   "tab_charset":          "utf8",                         # 表空间默认字符集

   "tab_row_format":       "DYNAMIC",                      # 动态字段空间

   "tab_row_max":          10000000,                       # 表空间最大行数,超过最大行数自动分表

   "threads_max":          64,                             # 数据插入操作最大线程数

   "threads_min":          32                              # 数据插入操作最小线程数

}

NGINX http-log数据插入到MySQL数据库

    sudo more /tmp/proxy01/access.log | ./build/logsplit logsplit.cfg

输入图片说明

nmon监控数据库平均写入速度:5.8MB/s

数据分析

输入图片说明

clnt_addr:        客户端IP地址

clnt_user:        客户端用户名,一般为空

time_tz:          记录时间戳

request_type:     http方法, Post, Get, Other

request:          http请求

request_bytes:    http请求长度

return_code:     http返回值

reply_bytes:     http返回数据长度

url:             http访问URL

url_bytes:       http访问URL长度

website:         站点

clnt_type:       客户端信息

clnt_type_bytes: 客户端信息长度

:point_right: root权限进入CentOS,启动mysqld服务,数据导出路径为/tmp

# mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --socket=/tmp/mysqld.sock --user=mysql --secure-file-priv=/tmp --sql_mode=NO_ENGINE_SUBSTITUTION &

# mysql -uroot -p

> insert into mysql.user(Host, User, Authentication_string) values("localhost", "ngxlog", password("password123456"));

> flush privileges;

> create database ACCLOG;

> use mysql;

> grant all privileges on ACCLOG.* to 'ngxlog'@'%' identified by 'password123456';

> update mysql.user set File_priv='Y' where user='ngxlog';

> flush privileges;

> select user,host,authentication_string from user;

:point_right: 连接MySQL-Server

mysql -h 192.168.1.100 -P 3306 -uusername -ppassword

客户端访问指定站点,返回值大于等于500的所有客户端IP、http request,结果集存放到Excel文件"/tmp/krups.xls"

select clnt_addr,return_code,CONCAT(website,request) from ngxproxy_20180604 where return_code like '50%' and website='www.krups.com.cn'; into outfile '/tmp/krups.xls';

指定IP客户端流量统计

select SUM(reply_bytes) from ngxproxy_20180604 where clnt_addr='115.195.93.119';

客户端访问的目标文件类型匹配

select clnt_addr,request,reply_bytes,website from ngxproxy_20180604 where request like '%.exe';

单次流量大于5MB的客户端统计(首次查询结果集存放到1stset)

select clnt_addr,count(*) as access_times from (select clnt_addr,reply_bytes from ngxproxy_20180604 having reply_bytes>5000000) 1stset group by clnt_addr;

项目点评 ( 0 )

你可以在登录后,发表评论