pip安装pycurl报错解决

 

错误1:Command “python setup.py egg_info” failed with error code 1 in /tmp/pip-install-u_NBeS/pycurl/

解决:

pip install –upgrade

pip install pycurl==7.43.0

 

错误2:运行时报错:

 

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

接上篇的内容,这篇我们要解决第二个问题,就是如何将我们转换完成的json数据发送到es中去,上篇提到了要存储到es中,我们要使用kafka来做消息队列,实现发布和订阅消息流模式,因为涉及kafka内容,所以我们先说一下Kafka的一些基本知识,然后再看代码不然一是一头雾水。

kafka介绍:

1、什么是kafka?

2、kafka特性

3、kafka解决了什么问题?

4、kafka的一些概念和名词

除了上面的一些内容外,我也谈一下我自己的一些理解,为什么kafka变得如此流行,很大程度上因为的特性决定的,

比如数据的聚合,怎么理解,就是我们可以把产生数据的系统就做生产者,有多少生产者无所谓,只要建立对应的topic,把数据发送到这个topic中就可以,如果有不同部门向要相同的数据,就去订阅这个topic即可,这样最大的好处是使我们系统结构清晰,同时能减少我们很多重复的工作。

另外一个重要的特性就是高并发性,并支持分布式部署,在一个繁忙的系统中,产生的日志或者其它数据是非常庞大的,要对这些数据进行处理,必须要一个高吞吐量、低延迟的处理系统,Kafka正好满足这个需求,每个topic可以建立一个或多个分区,每个分区你可以简单理解为一个公路上的多个车道,每个车就是数据,因为车道多所以它可以加速数据的传输。

经过上面的介绍,相信大家都对Kafka有了一个基本的了解,那接下来回到我们上面的问题,看如何在我们这个例子中使用:

1、安装kafka,这个因为比较简单就不在费篇幅写了。

2、安装完毕后建立一个topic, 命令:

bin/kafka-topics.sh –create –zookeeper 127.0.0.1:2181 –replication-factor 1 –partitions 1 –topic www_logs

3、安装:pip install kafka-python

4、实现生产者类:

代码不是很多,先定义了初始化类的__init__方法,需要两个参数,一个就是broker这个没什么可说的,value_serializer的意思是用于将用户提供的消息值转换为字节,send_page_data()方法是将数据发送给对应的topic。

5、修改下上篇中的脚本,使其实现转换后发送到kafka中,修改如下:

增加的行都已注释,不多解释了。

到这我再梳理下我们都干了什么。

第一,我们实现了access.log日志的实时读取,并传唤成json格式。

第二,我们讲转换完毕的数据发送到kafka中,topic名词是www_logs

以上我们都已完成,接下来的问题是要怎么把数据存储到es中,不过先别急,先让我们验证下我们之前的工作是否正确吧,要验证是否可以从topic中读取数据,我们还需要一个消费者程序,为简单验证,我这边实现一个最简单的消费者程序,如下:

就是从topic中读取数据,然后打印,如果没问题,就可以证明这条通路是通的,首先在一个终端运行,我们的日志分析程序,结果如下:

行太多,我只截取了2行,因为我们有打印,说明转换是没有问题的,但是否发送到了kafka呢,我们在另一个终端运行我们的消费程序,结果如下:

可以看到我们消费者成功的从kafka中取得了数据,说明这条通路我们已经打通了,这条数据流已经没有问题,那接下来就剩下最后存储到es中的问题了,我们后续再接续,这篇已经很长了。

 

 

 

用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