用Data-pipeline模式将nginx日志存储到elasticsearch中(1)

做运维的小伙伴应该都知道nginx日志的重要性,一般出现访问问题,我们可能第一时间要去看日志去分析问题,但除了协助我们排查问题外,如果对nginx日志进一步分析可以得到更有用的数据,例如可以监控某站点的http状态码、PV,UV情况,request_time和response_time等,如果辅助其它工具进一步分析可以预防一些安全问题,比如同一个IP的访问某页面超出了限制,我们可以设置策略发现后可以自动拒绝有危险的IP访问,这也是我们经常说的防刷功能,今天要跟大家分享的是如何将nginx日志存储到es中,存储的目的当时是为了更好的分析它,大家都知道,如果要存储到es中,数据必须是json格式的,但如果当前日志不是json格式的就需要进行一个转换,要把每行数据转成json格式的这里有几个问题要明确:

首先,access.log是不断增长的,这就需要有个程序能实时读取新的日志进行转换,这是第一个要解决的问题。

其次,对转换完的数据我们能不能直接存储到es中,答案是不建议,因为如果转一次存一次,在程序中我们势必要判断每次存储是否成功,在高并发的网站中日志的产生量是非常巨大的,这样一来会影响整体的效率,那怎么办?在这种情况下,最好的解决办法就是用消息队列的方式去解决,这里我们选择kafka,这个后续会说。

根据上面的内容大家可以看到其实在分析nginx日志的过程就是一个数据流的处理,这也是我们标题所说的data-pipline,pipline故名意思就是管道的意思,加一个data就是一个数据管道,我们就是要建立一个这样的管道将数据源源不断的产生出来,就像水管的水一样。

因为要解决的二个问题,今天我们先解决第一个,先实现access.log实时读取和转换成json格式,先看我们的access.log的文件内容:

 

划重点了,请看代码:

运行结果:

 

 

脚本整体逻辑是先将行日志转换成一个字典(parse_log_line()函数),然后将字典转成json格式(show_entry()函数),最后follow函数是开始从尾部读取日志文件注意seek(0,2)参数是2从文件底部读取。

写到这我们第一个问题就算是解决了,接下来的工作就是如果把数据传给kafka了,因为kafka本身就是一块比较大的内容限于篇幅我们下次继续,多谢各位观看,如果觉得还不错,还请帮转发。

sudo 防止su -i 切到root下

sudo在日常运维中我们经常使用的工具,可以给普通用户授予root用户权限执行某些特殊操作,但这里也有个问题,在设置完后,普通用户通过su -i 仍然可以切到root用户下,那如何防止呢,我们就从基本的先看看如何设置sudo用户:

新建文件webadminsudo 写入:

webadmin ALL=(ALL) NOPASSWD:ALL,!/usr/bin/passwd,!/bin/bash,!/bin/sh,!/bin/tcsh,!/bin/su

看我配置文件内容,sudo -i  默认是调用bash命令切换到root的shell下获取root权限的所有只要禁用bash就可以了.

这样用户就无法切到root用户下了,简单吧。

从网上还看到其它例子,可以增加更多限制,可以参考:

另一个例子:

Cmnd_Alias DENYCMD = !/bin/su,!/usr/bin/passwd,!/usr/bin/passwd root,!/bin/vi /etc/sudoers,!/usr/bin/vim /etc/sudoers,!/usr/sbin/visudo,!/usr/bin/sudo -i,!/bin/vi /etc/ssh/*,!/usr/bin/vim /etc/ssh/*,!/bin/chmod 777 /etc/*,!/bin/chmod 777 *,!/bin/chmod 777,!/bin/chmod -R 777 *

Cmnd_Alias DENYRMCMD = !/bin/rm /*,!/bin/rm /,!/bin/rm -rf /,!/bin/rm -rf /*,!/bin/rm /etc,!/bin/rm -r /etc,!/bin/rm -rf /etc,!/bin/rm /etc/*,!/bin/rm -r /etc/*,!/bin/rm -rf /etc/*,!/bin/rm /root,!/bin/rm -r /root,!/bin/rm -rf /root,!/bin/rm /root/*,!/bin/rm -r /root/*,!/bin/rm -rf /root/*,!/bin/rm /bin,!/bin/rm -r /bin,!/bin/rm -rf /bin,!/bin/rm /bin/*,!/bin/rm -r /bin/*,!/bin/rm -rf /bin/*

!/bin/su

YANFA ALL=(ALL) NOPASSWD:ALL,DENYCMD,DENYRMCMD

这样会增加更多限制。

还有一个问题,有时候普通用户切root需要输入密码,有时候很是很烦人,下面提供一个方法,可以不用输密码了,哈:

如何su – root不需要密码:

vi /etc/pam.d/su

将 auth这一列的注释号 去除

# Uncomment the following line to implicitly trust users in the “wheel” group.

auth            sufficient      pam_wheel.so trust use_uid

然后将登陆用户加入 wheel组

usermod -G wheel martin

设置完成测试。

 

python+mongodb操作方法全(附源码和图形客户端Mongodb-compass)

这篇介绍mongodb和Python使用, 从基本的安装说起,先熟练mongodb的基本操作,然后通过python实现数据插入、查询,以及mongoengine使用,最后是图形化界面连接mongodb数据库,我们从安装开始:

Mongodb 安装

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.6.4.tgz

tar -zxvf mongodb-linux-x86_64-rhel62-3.6.4.tgz

mv mongodb-linux-x86_64-rhel62-3.6.4 /usr/local/mongodb

 

添加环境变量:/etc/profille

 

MONGODB=/usr/local/mongodb

PATH=$MONGODB/bin:$PATH

export  PATH

 

配置文件:

Vi /etc/mongod.conf

 

 

启动:

mkdir -p /data/db

mongod &

关闭:

mongod  –shutdown  –dbpath /data/db

登录数据库关闭:

Mongo  //进入客户端

use admin;

db.shutdownServer();

 

#python升级后pip不能使用,重新安装,你如果pip没问题,不用操作这些步骤。

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

python get-pip.py

python -m pip install pymongo

 

以下是python和mango 的一些脚本程序:

 

脚本1:插入数据

 

 

 

 

脚本2:

 

 

 

#脚本3:多查询

 

 

 

#脚本4:插入一个对象

 

 

 

#脚本5:多对象插入

以下是mongoengine使用,这个可能之前有人没接触过,你可以理解为类似django中的orm的使用,就是可以通过定义class 来定义数据库表和字段,使用也不复杂,它提供了很多方法供我们使用,官网参考:http://docs.mongoengine.org/

 

# mongoengine使用:

pip install -U mongoengine

 

脚本6:

 

 

 

#脚本7 get user

 

 

 

官网参考:http://docs.mongoengine.org/

 

操作mongo数据库用图形化还是很直观,我推荐用官网的Mongodb-compas:

图形化客户端连接:

Mongodb-compas下载

https://www.mongodb.com/download-center?jmp=hero#compass

 

下载安装:

mongodbcomposs

 

selenium + chrome爬虫环境搭建

在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repo

内容如下:

yum -y install google-chrome-stable –nogpgcheck

安装后查看安装目录:

which google-chrome-stable

which google-chrome

查看版本号:

google-chrome –version

如果想看更多内容就用

google-chrome –help #会列出所有参数

然而在使用selenium +chrome时有报错:

需要多加二个参数:

其它参数有:

[‘–headless’, ‘–disable-gpu’, ‘–no-sandbox’, ‘–disable-extensions’, ‘–disable-dev-shm-usage’]

到这其实安装完后通过vnc登录进去也开不开,可以参考这篇解决:

https://blog.csdn.net/tiandaochouqin99/article/details/79643248

windows下安装selenium报错解决

在windows下安装selenium 反复安装了几次,都报这个错误:

File “c:\users\jibingchuan\appdata\local\programs\python\python36-32\lib\conte
xtlib.py”, line 99, in __exit__
self.gen.throw(type, value, traceback)
File “c:\users\jibingchuan\appdata\local\programs\python\python36-32\lib\site-
packages\pip\_vendor\urllib3\response.py”, line 307, in _error_catcher
raise ReadTimeoutError(self._pool, None, ‘Read timed out.’)
pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host=’files
.pythonhosted.org’, port=443): Read timed out.

 

解决也简单,延长超时时间就可以解决:

pip3 –default-timeout=1000 install selenium

安装完上面的还没完,运行时有报错:

ERROR:install_util.cc(597)] Unable to readregistry  value HKLM\SOFTWARE\Policies\Google\Chrome\MachineLevelUserCloudPolicyEnrollmen
tToken for writing result=2

然后在注册表里加一个值就可以了。

selenium-register

新建一个字符串值,名称是:MachineLevelUserCloudPolicyEnrollmentToken

网上也有这么修复的,可以参考: