运维如何写出不耍流氓的Shell脚本

开源技术小白菜 发表了文章 • 0 个评论 • 19 次浏览 • 11 小时前 • 来自相关话题

声明

大家都是文明人,尤其是做运维的,那叫一个斯文啊。怎么能耍流氓呢?赶紧看看,编写 SHELL 脚本如何能够不耍流氓。

Mysql备份脚本案例

1、不记录日志的 SHELL 脚本就是耍流氓!
我们经常在工作中会遇到一个苦恼的事情,一个 Shell 脚本到底干了什么,什么时候开始执行,什么时候结束的。尤其是数据库备份,我们想知道我们的 MySQL 数据库备份时间。所以给脚本加日志显得尤为重要。那么我们的脚本应该有一个日志的函数,专门用于记录日志:#!/bin/bash

# Shell Env
SHELL_NAME="shell_template.sh"
SHELL_DIR="/opt/shell"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
LOCK_FILE="/tmp/${SHELL_NAME}.lock"

#Write Log
shell_log(){
LOG_INFO=$1
echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
}

shell_log "shell beginning, Write log test"
shell_log "shell success, Write log test"


上面的脚本我编写了一个日志函数shell_log,每次记录日志,我们直接执行shell_log把日志内容当作第一个参数传给它就可以了,赶紧试试。[root@LinuxNode2 shell]# cat shell_template.sh.log
2016-08-27 06-01-19 : shell_template.sh :shell beginning ,write log test
2016-08-27 06-01-19 : shell_template.sh :shell success ,write log test
2、直接就能执行的Shell脚本很容易耍流氓?
一个脚本直接就能执行?难道不是直接就能执行吗?试想,你临时编写了一个特别重要的脚本,干的事情可能有破坏性,一不小心被别人./执行了怎么办呢?而且很多时候我们一个脚本的功能可能有多个,所以我们有必要让用户可以选择进行执行。#!/bin/bash

# Shell Env
SHELL_NAME="shell_template.sh"
SHELL_DIR="/opt/shell"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
LOCK_FILE="/tmp/${SHELL_NAME}.lock"

#Write Log 
shell_log(){
    LOG_INFO=$1
    echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
}

# Shell Usage
shell_usage(){
    echo $"Usage: $0 {backup}"
}


# Backup MySQL All Database with mysqldump or innobackupex
mysql_backup(){
    shell_log "mysql backup start"
    shell_log "mysql backup stop"
}

# Main Function
main(){
    case $1 in
        backup)
            mysql_backup
            ;;
        *)
            shell_usage;
    esac
}

#Exec
main $1


上面的脚本我们编写了shell_usage函数,用来告诉用户,这个脚本的使用方法。同时,我要强调一下,像编写Shell, 我们经常是面向过程的,建议以函数为单位,这样脚本非常的清晰可读。赶紧执行以下看看效果吧。[root@LinuxNode2 shell]# ./shell_template.sh
Usage: ./shell_template.sh {backup}
3、不加锁的Shell脚本就是让别人耍流氓
你编写的脚本能多个人同时执行吗?如果不能,那么如果多个人一起执行会怎么样呢?想想是不是有点冒冷汗。所以,不要给我们的其它小伙伴留下陷阱。不过如果你公司就你一个运维,真的不用怕吗?试想如果是定时任务再运行这个脚本,上一次没有运行完毕,然后到时间又运行了?然后,然后,然后,后果好可怕。#!/bin/bash

# Shell Env
SHELL_NAME="shell_template.sh"
SHELL_DIR="/opt/shell"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
LOCK_FILE="/tmp/${SHELL_NAME}.lock"

#Write Log
shell_log(){
LOG_INFO=$1
echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
}

# Shell Usage
shell_usage(){
echo $"Usage: $0 {backup}"
}

shell_lock(){
touch ${LOCK_FILE}
}

shell_unlock(){
rm -f ${LOCK_FILE}
}

# Backup MySQL All Database with mysqldump or innobackupex
mysql_backup(){
if [ -f "$LOCK_FILE" ];then
shell_log "${SHELL_NAME} is running"
echo "${SHELL_NAME}" is running && exit
fi
shell_log "mysql backup start"
shell_lock
sleep 10
shell_log "mysql backup stop"
shell_unlock
}

# Main Function
main(){
case $1 in
backup)
mysql_backup
;;
*)
shell_usage;
esac
}

#Exec
main $1我为脚本增加了两个函数shell_lock和shell_unlock非常简单,就是创建一个锁文件。然后再执行的时候先判断锁文件是否存在,如果存在说明有其它用户在执行,就退出。如果没有自己创建锁文件,开始执行,执行完毕删除锁文件。
 
好的,现在你可以赶紧再开一个窗口试试能不能执行这个脚本,或者到/tmp目录下看看是否创建了锁文件。请注意:如果已知的异常退出,一定也要删除这个锁文件。
 

做好事必须留名

对于一个功能脚本来说,貌似还少了点什么。对,就是注释!我们要说明白这个脚本是干啥的。或者以后你离职后,别人看到这个脚本之后,我擦,这么牛掰的脚本是谁写的呢?不要怕,写上你的大名。#######################################################
# $Name: shell_template.sh
# $Version: v1.0
# $Function: Backup MySQL Databases Template Script
# $Author: Jason Zhao
# $organization: https://www.unixhot.com/
# $Create Date: 2016-08-27
# $Description: You know what i mean,hehe
#######################################################当然还有很多编写脚本的技巧,没法一一描述,不过如果能掌握上面的三种技巧,立马感觉编写的脚本有点高大上,有木有?

文章作者:赵班长
分享原文:http://dwz.cn/4JDIFv  查看全部
liumang.jpg


声明


大家都是文明人,尤其是做运维的,那叫一个斯文啊。怎么能耍流氓呢?赶紧看看,编写 SHELL 脚本如何能够不耍流氓。


Mysql备份脚本案例


1、不记录日志的 SHELL 脚本就是耍流氓!
我们经常在工作中会遇到一个苦恼的事情,一个 Shell 脚本到底干了什么,什么时候开始执行,什么时候结束的。尤其是数据库备份,我们想知道我们的 MySQL 数据库备份时间。所以给脚本加日志显得尤为重要。那么我们的脚本应该有一个日志的函数,专门用于记录日志:
#!/bin/bash

# Shell Env
SHELL_NAME="shell_template.sh"
SHELL_DIR="/opt/shell"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
LOCK_FILE="/tmp/${SHELL_NAME}.lock"

#Write Log
shell_log(){
LOG_INFO=$1
echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
}

shell_log "shell beginning, Write log test"
shell_log "shell success, Write log test"


上面的脚本我编写了一个日志函数shell_log,每次记录日志,我们直接执行shell_log把日志内容当作第一个参数传给它就可以了,赶紧试试。
[root@LinuxNode2 shell]# cat shell_template.sh.log
2016-08-27 06-01-19 : shell_template.sh :shell beginning ,write log test
2016-08-27 06-01-19 : shell_template.sh :shell success ,write log test

2、直接就能执行的Shell脚本很容易耍流氓?
一个脚本直接就能执行?难道不是直接就能执行吗?试想,你临时编写了一个特别重要的脚本,干的事情可能有破坏性,一不小心被别人./执行了怎么办呢?而且很多时候我们一个脚本的功能可能有多个,所以我们有必要让用户可以选择进行执行。
#!/bin/bash

# Shell Env
SHELL_NAME="shell_template.sh"
SHELL_DIR="/opt/shell"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
LOCK_FILE="/tmp/${SHELL_NAME}.lock"

#Write Log 
shell_log(){
    LOG_INFO=$1
    echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
}

# Shell Usage
shell_usage(){
    echo $"Usage: $0 {backup}"
}


# Backup MySQL All Database with mysqldump or innobackupex
mysql_backup(){
    shell_log "mysql backup start"
    shell_log "mysql backup stop"
}

# Main Function
main(){
    case $1 in
        backup)
            mysql_backup
            ;;
        *)
            shell_usage;
    esac
}

#Exec
main $1


上面的脚本我们编写了shell_usage函数,用来告诉用户,这个脚本的使用方法。同时,我要强调一下,像编写Shell, 我们经常是面向过程的,建议以函数为单位,这样脚本非常的清晰可读。赶紧执行以下看看效果吧。
[root@LinuxNode2 shell]# ./shell_template.sh
Usage: ./shell_template.sh {backup}

3、不加锁的Shell脚本就是让别人耍流氓
你编写的脚本能多个人同时执行吗?如果不能,那么如果多个人一起执行会怎么样呢?想想是不是有点冒冷汗。所以,不要给我们的其它小伙伴留下陷阱。不过如果你公司就你一个运维,真的不用怕吗?试想如果是定时任务再运行这个脚本,上一次没有运行完毕,然后到时间又运行了?然后,然后,然后,后果好可怕。
#!/bin/bash

# Shell Env
SHELL_NAME="shell_template.sh"
SHELL_DIR="/opt/shell"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
LOCK_FILE="/tmp/${SHELL_NAME}.lock"

#Write Log
shell_log(){
LOG_INFO=$1
echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
}

# Shell Usage
shell_usage(){
echo $"Usage: $0 {backup}"
}

shell_lock(){
touch ${LOCK_FILE}
}

shell_unlock(){
rm -f ${LOCK_FILE}
}

# Backup MySQL All Database with mysqldump or innobackupex
mysql_backup(){
if [ -f "$LOCK_FILE" ];then
shell_log "${SHELL_NAME} is running"
echo "${SHELL_NAME}" is running && exit
fi
shell_log "mysql backup start"
shell_lock
sleep 10
shell_log "mysql backup stop"
shell_unlock
}

# Main Function
main(){
case $1 in
backup)
mysql_backup
;;
*)
shell_usage;
esac
}

#Exec
main $1
我为脚本增加了两个函数shell_lock和shell_unlock非常简单,就是创建一个锁文件。然后再执行的时候先判断锁文件是否存在,如果存在说明有其它用户在执行,就退出。如果没有自己创建锁文件,开始执行,执行完毕删除锁文件。
 
好的,现在你可以赶紧再开一个窗口试试能不能执行这个脚本,或者到/tmp目录下看看是否创建了锁文件。请注意:如果已知的异常退出,一定也要删除这个锁文件。
 


做好事必须留名


对于一个功能脚本来说,貌似还少了点什么。对,就是注释!我们要说明白这个脚本是干啥的。或者以后你离职后,别人看到这个脚本之后,我擦,这么牛掰的脚本是谁写的呢?不要怕,写上你的大名。
#######################################################
# $Name: shell_template.sh
# $Version: v1.0
# $Function: Backup MySQL Databases Template Script
# $Author: Jason Zhao
# $organization: https://www.unixhot.com/
# $Create Date: 2016-08-27
# $Description: You know what i mean,hehe
#######################################################
当然还有很多编写脚本的技巧,没法一一描述,不过如果能掌握上面的三种技巧,立马感觉编写的脚本有点高大上,有木有?


文章作者:赵班长
分享原文http://dwz.cn/4JDIFv 


云主机IO性能测试报告

大数据/云计算Nock 发表了文章 • 0 个评论 • 32 次浏览 • 1 天前 • 来自相关话题

不同厂商的云主机在性能、设计、操作方面都存在很大的差异化。
 

吐槽云商

1、阿里云 -- 地主黑势力
阿里的包月包年捆绑式销售,创建完成后你不能及时删除释放主机,只能默默的等到期了,记得我第一次使用阿里云的时候,一口气开了10台云主机,后面我发现我不需要这么多,预算出错,但是阿里告诉我的是你人生中只有一次反悔的机会,我只能删掉一台主机。
 
其他的主机我只能等他默认到期了,如果实在没有多大作用我只能浪费我的银两,然后阿里坐收消费,我就当打赏王坚一个小红包了。
 
2、Ucloud -- 清廉百姓官
Ucloud的业务是我最喜欢的,尤其是喜欢他们的服务和UI设计。在国内做市场,我想你最应该的是调研国内技术人员的操作习惯,然后把云产品的使用达到极简、易使用,而不是黑灯找芝麻。在我的心理Ucloud是国内在云主机的操作和体验上给我的感受是最佳的。 还有就是他们的服务,他们可以一对一的帮你解决问题,耐心的解答,没有阿里那财大气粗的蛮横,不会绑架你。
 
3、Azure -- 没长齐毛的鸟
为什么我说Azure是没有长齐毛的鸟,因为他的产品设计还没有完善,操作困难,可能Azure还没有大力投入做中国市场吧,好多功能都依赖于PowerShell去完成操作,比如挂盘、弹性公网ip的绑定申请等,我想说的是我是个运维,脑子里面记了一大堆命令,我使用你们产品,挂个盘你还得让我去记一大堆命令和规则,我疯了。so.......
 
我使用过Ucloud、阿里云、Azure、Google云、AWS等诸多厂商的云产品服务,具体的其他功能我就不一一对比,下面我就介绍一下,我最近做的IO测试几家厂商的报告。
 

IO测试

测试命令如下:
fio -filename=/data/test.out1 -direct=1 -rw=read -bs=4k -size=10g -numjobs=4 -runtime=1200 -group_reporting -name=test1

fio -filename=/data/test.out2 -direct=1 -rw=write -bs=4k -size=10g -numjobs=4 -runtime=1200 -group_reporting -name=test2

fio -filename=/data/test.out3 -direct=1 -rw=randread -bs=4k -size=10g -numjobs=4 -runtime=1200 -group_reporting -name=test3

fio -filename=/data/test.out4 -direct=1 -rw=randwrite -bs=4k -size=10g -numjobs=4 -runtime=1200 -group_reporting -name=test4
测试结果如下:
















上面分别是Ucloud、阿里、Azure、谷歌云的IO测试结果。
 

速率测试

测试命令如下:
dd iflag=direct </data/test.out3 >/dev/null bs=16k count=102400
dd oflag=direct </dev/zero >/data/test2 bs=16k count=102400
测试结果如下:




 

总结

废话不多说,以上的测试结果仅供大家参考,新时代的云运维者,必须要有语言基础了,没有语言基础,就算Ucloud的操作再怎么人性化,你也不能自动化,所以从云时代的趋势来看作为运维者掌握一门语言还是很有必要的了。云平台有很多坑,在没有充分了解厂商的情况下,你会发现云时代的运维更难。 查看全部
不同厂商的云主机在性能、设计、操作方面都存在很大的差异化。
 


吐槽云商


1、阿里云 -- 地主黑势力
阿里的包月包年捆绑式销售,创建完成后你不能及时删除释放主机,只能默默的等到期了,记得我第一次使用阿里云的时候,一口气开了10台云主机,后面我发现我不需要这么多,预算出错,但是阿里告诉我的是你人生中只有一次反悔的机会,我只能删掉一台主机。
 
其他的主机我只能等他默认到期了,如果实在没有多大作用我只能浪费我的银两,然后阿里坐收消费,我就当打赏王坚一个小红包了。
 
2、Ucloud -- 清廉百姓官
Ucloud的业务是我最喜欢的,尤其是喜欢他们的服务和UI设计。在国内做市场,我想你最应该的是调研国内技术人员的操作习惯,然后把云产品的使用达到极简、易使用,而不是黑灯找芝麻。在我的心理Ucloud是国内在云主机的操作和体验上给我的感受是最佳的。 还有就是他们的服务,他们可以一对一的帮你解决问题,耐心的解答,没有阿里那财大气粗的蛮横,不会绑架你。
 
3、Azure -- 没长齐毛的鸟
为什么我说Azure是没有长齐毛的鸟,因为他的产品设计还没有完善,操作困难,可能Azure还没有大力投入做中国市场吧,好多功能都依赖于PowerShell去完成操作,比如挂盘、弹性公网ip的绑定申请等,我想说的是我是个运维,脑子里面记了一大堆命令,我使用你们产品,挂个盘你还得让我去记一大堆命令和规则,我疯了。so.......
 
我使用过Ucloud、阿里云、Azure、Google云、AWS等诸多厂商的云产品服务,具体的其他功能我就不一一对比,下面我就介绍一下,我最近做的IO测试几家厂商的报告。
 


IO测试


测试命令如下:
fio -filename=/data/test.out1 -direct=1 -rw=read -bs=4k -size=10g -numjobs=4 -runtime=1200 -group_reporting -name=test1

fio -filename=/data/test.out2 -direct=1 -rw=write -bs=4k -size=10g -numjobs=4 -runtime=1200 -group_reporting -name=test2

fio -filename=/data/test.out3 -direct=1 -rw=randread -bs=4k -size=10g -numjobs=4 -runtime=1200 -group_reporting -name=test3

fio -filename=/data/test.out4 -direct=1 -rw=randwrite -bs=4k -size=10g -numjobs=4 -runtime=1200 -group_reporting -name=test4

测试结果如下:
Ucloud.png

ali.png

Azure.png

GoogleCloud.png

上面分别是Ucloud、阿里、Azure、谷歌云的IO测试结果。
 


速率测试


测试命令如下:
dd iflag=direct </data/test.out3 >/dev/null bs=16k count=102400
dd oflag=direct </dev/zero >/data/test2 bs=16k count=102400

测试结果如下:
mancloud.png

 


总结


废话不多说,以上的测试结果仅供大家参考,新时代的云运维者,必须要有语言基础了,没有语言基础,就算Ucloud的操作再怎么人性化,你也不能自动化,所以从云时代的趋势来看作为运维者掌握一门语言还是很有必要的了。云平台有很多坑,在没有充分了解厂商的情况下,你会发现云时代的运维更难。

分享个基于sendclound的邮件群发软件 大家提点意见

回复

开源技术Nappywu 发起了问题 • 1 人关注 • 0 个回复 • 74 次浏览 • 2016-11-25 15:51 • 来自相关话题

Nginx适配PC和手机后如何做rewrite重定向?

开源技术mark 回复了问题 • 2 人关注 • 2 个回复 • 89 次浏览 • 2016-11-24 09:56 • 来自相关话题

Centos7下使用Harpoxy负载均衡Apache

开源技术koyo 发表了文章 • 0 个评论 • 105 次浏览 • 2016-11-21 18:41 • 来自相关话题

 

什么是HAProxy

HAProxy是一个免费的,快速和可靠的解决方案提供高可用性、负载均衡,并为TCP代理和基于http的应用程序。特别适合高流量网站和高并发网站。
 

环境说明

操作系统:Centos 7
主机分布:1 haproxy server, 3 client 
IP & Hostname :
192.168.0.50 server.rootworld.in
192.168.0.51 web1.rootworld.in
192.168.0.52 web2.rootworld.in
192.168.0.53 web3.rootworld.in
1、在客户端机器上安装web服务器
 
WEB1
[root@web1 ~]# yum install httpd -y
[root@web1 ~]# systemctl enable httpd.service
[root@web1 ~]# systemctl start httpd.service
WEB2
[root@web2 ~]# yum install httpd -y
[root@web2 ~]# systemctl enable httpd.service
[root@web2 ~]# systemctl start httpd.service
WEB3
[root@web3 ~]# yum install httpd -y
[root@web3 ~]# systemctl enable httpd.service
[root@web3 ~]# systemctl start httpd.service
2、检查您的web服务器工作正常。
 
3、安装HAProxy Server.
[root@server ~]# yum install haproxy openssl-devel -y
 4、配置HAPorxy的主配置文件/etc/haproxy/haproxy.cfg,修改log日志位置
[root@server ~]# vim /etc/haproxy/haproxy.cfg



 
5、配置启动UDP syslog reception 在/etc/rsyslog.conf配置文件中,并且把Haproxy日志单独放到/var/log目录下。
[root@server ~]# vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514



 
6、在/etc/rsyslog.d/目录下配置haproxy.conf文件配置单独的log文件
[root@server ~]# vim /etc/rsyslog.d/haproxy.conf
local2.* /var/log/haproxy.log



 
7、重启syslog服务,更新配置
[root@server ~]# service rsyslog restart
8、按照需求配置/etc/haproxy/haproxy.cfg文件
[root@server ~]# vim /etc/haproxy/haproxy.cfg
9、为均衡器在/etc/haproxy/haproxy.cfg配置前端和后端
# Configuration for HTTP site

listen server 192.168.0.50:80
bind *:80
default_backend LBbackend


backend LBbackend
mode http
server web1 192.168.0.51:80 check
server web1 192.168.0.52:80 check
server web1 192.168.0.53:80 check
stats enable
stats hide-version
stats uri /stats
stats realm Haproxy\ Statistics
stats auth admin:redhat
balance roundrobin
option httpchk
option httpclose
option forwardfor
cookie LB insert



 
10、重启HAProxy服务并启用
[root@server ~]# systemctl enable haproxy.service
[root@server ~]# systemctl restart haproxy.service
[root@server ~]# systemctl status haproxy.service



 
11、验证HAProxy负载均衡器
http://192.168.0.50/











 
12、打开HAProxy监控服务面板
http://192.168.0.50/stats 查看全部
ha-proxy_load-balancing.png

 


什么是HAProxy


HAProxy是一个免费的,快速和可靠的解决方案提供高可用性、负载均衡,并为TCP代理和基于http的应用程序。特别适合高流量网站和高并发网站。
 


环境说明


操作系统:Centos 7
主机分布:1 haproxy server, 3 client 
IP & Hostname
192.168.0.50    server.rootworld.in 
192.168.0.51 web1.rootworld.in
192.168.0.52 web2.rootworld.in
192.168.0.53 web3.rootworld.in

1、在客户端机器上安装web服务器
 
WEB1
[root@web1 ~]# yum install httpd -y
[root@web1 ~]# systemctl enable httpd.service
[root@web1 ~]# systemctl start httpd.service

WEB2
[root@web2 ~]# yum install httpd -y
[root@web2 ~]# systemctl enable httpd.service
[root@web2 ~]# systemctl start httpd.service

WEB3
[root@web3 ~]# yum install httpd -y
[root@web3 ~]# systemctl enable httpd.service
[root@web3 ~]# systemctl start httpd.service

2、检查您的web服务器工作正常。
 
3、安装HAProxy Server.
[root@server ~]# yum install haproxy openssl-devel -y 

 4、配置HAPorxy的主配置文件/etc/haproxy/haproxy.cfg,修改log日志位置
[root@server ~]# vim /etc/haproxy/haproxy.cfg 
logconf.PNG

 
5、配置启动UDP syslog reception 在/etc/rsyslog.conf配置文件中,并且把Haproxy日志单独放到/var/log目录下。
[root@server ~]# vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
rsyslogconf.PNG

 
6、在/etc/rsyslog.d/目录下配置haproxy.conf文件配置单独的log文件
[root@server ~]# vim /etc/rsyslog.d/haproxy.conf
local2.* /var/log/haproxy.log
logro.PNG

 
7、重启syslog服务,更新配置
[root@server ~]# service rsyslog restart

8、按照需求配置/etc/haproxy/haproxy.cfg文件
[root@server ~]# vim /etc/haproxy/haproxy.cfg

9、为均衡器在/etc/haproxy/haproxy.cfg配置前端和后端
# Configuration for HTTP site

listen server 192.168.0.50:80
bind *:80
default_backend LBbackend


backend LBbackend
mode http
server web1 192.168.0.51:80 check
server web1 192.168.0.52:80 check
server web1 192.168.0.53:80 check
stats enable
stats hide-version
stats uri /stats
stats realm Haproxy\ Statistics
stats auth admin:redhat
balance roundrobin
option httpchk
option httpclose
option forwardfor
cookie LB insert
haconfig.PNG

 
10、重启HAProxy服务并启用
[root@server ~]# systemctl enable haproxy.service
[root@server ~]# systemctl restart haproxy.service
[root@server ~]# systemctl status haproxy.service
harestart.PNG

 
11、验证HAProxy负载均衡器
http://192.168.0.50/
web1.PNG

web2.PNG

web3.PNG

 
12、打开HAProxy监控服务面板
 http://192.168.0.50/stats
hagui.PNG

关于Elasticsearch性能优化几个点

大数据/云计算小白菜 发表了文章 • 0 个评论 • 175 次浏览 • 2016-11-13 12:07 • 来自相关话题

Elasticsearch简述

ElasticSearch是现在技术前沿的大数据引擎,常见的组合有ES+Logstash+Kibana作为一套成熟的日志系统,其中Logstash是ETL工具,Kibana是数据分析展示平台。Elasticsearch让人惊艳的是他强大的搜索相关能力和灾备策略,Elastcisearch开放了一些接口供开发者研发自己的插件,Elasticsearch结合中文分词的插件会给Elasticsearch的搜索和分析起到很大的推动作用。ElasticSearch是使用开源全文检索库Apache Lucene进行索引和搜索的,所以Elasticsearch底层是依赖的Lucene。
 
关于Lucene:
Apache Lucene将写入索引的所有信息组织成一种倒排索引(Inverted Index)的结构之中,该结构是种将词项映射到文档的数据结构。其工作方式与传统的关系数据库不同,大致来说倒排索引是面向词项而不是面向文档的。且Lucene索引之中还存储了很多其他的信息,如词向量等等,每个Lucene都是由多个段构成的,每个段只会被创建一次但会被查询多次,段一旦创建就不会再被修改。多个段会在段合并的阶段合并在一起,何时合并由Lucene的内在机制决定,段合并后数量会变少,但是相应的段本身会变大。段合并的过程是非常消耗I/O的,且与之同时会有些不再使用的信息被清理掉。在Lucene中,将数据转化为倒排索引,将完整串转化为可用于搜索的词项的过程叫做分析。文本分析由分析器(Analyzer)来执行,分析其由分词器(Tokenizer),过滤器(Filter)和字符映射器(Character Mapper)组成,其各个功能显而易见。除此之外,Lucene有自己的一套完整的查询语言来帮助我们进行搜索和读写。
 
*注:Elasticsearch中的索引指的是查询/寻址时URI中的一个字段如:[host]:[port(9200)]/[index]/[type]/[ID]?[option],而Lucene中的索引更多地和ES中的分片的概念相对应。
 
Elasticsearch架构设计理念特性如下:
合理的默认配置:只需修改节点中的Yaml配置文件,就可以快速配置。这和Spring4中对配置的简化有相似的地方。分布式工作模式:Elasticsearch强大的Zen发现机制不仅支持组广播也支持点单播,且有“知一点即知天下”之妙。对等架构:节点之间自动备份分片,且使分片本身和样本之间尽量”远离“,可以避免单点故障。且Master节点和Data节点几乎完全等价。易于向集群扩充新节点:大大简化研发或运维将新节点加入集群所需的工作。不对索引中的数据结构增加任何限制:ES支持在一个索引之中存在多种数据类型。准实时:搜索和版本同步,由于ES是分布式应用,一个重大的挑战就是一致性问题,无论索引还是文档数据,然而事实证明ES表现优秀。
 

分片策略

选择合适的分片数和副本数:
ES的分片分为两种,主分片(Primary Shard)和副本(Replicas)。默认情况下,ES会为每个索引创建5个分片,即使是在单机环境下,这种冗余被称作过度分配(Over Allocation),目前看来这么做完全没有必要,仅在散布文档到分片和处理查询的过程中就增加了更多的复杂性,好在ES的优秀性能掩盖了这一点。假设一个索引由一个分片构成,那么当索引的大小超过单个节点的容量的时候,ES不能将索引分割成多份,因此必须在创建索引的时候就指定好需要的分片数量。此时我们所能做的就是创建一个新的索引,并在初始设定之中指定这个索引拥有更多的分片。反之如果过度分配,就增大了Lucene在合并分片查询结果时的复杂度,从而增大了耗时,所以我们得到了以下结论: 我们应该使用最少的分片!
 
主分片,副本和节点最大数之间数量存在以下关系:
节点数 <= 主分片数 *(副本数+1) NodeNum <= PNum * ( Rnum + 1 )这个关系,其实就是保持最好一个数据节点,最好保存一个索引的一个分片(不管主副)。
 
控制分片分配行为:
以上是在创建每个索引的时候需要考虑的优化方法,然而在索引已创建好的前提下,是否就是没有办法从分片的角度提高了性能了呢?当然不是,首先能做的是调整分片分配器的类型,具体是在elasticsearch.yml中设置cluster.routing.allocation.type属性,共有两种分片器even_shard,balanced(默认)。even_shard是尽量保证每个节点都具有相同数量的分片,balanced是基于可控制的权重进行分配,相对于前一个分配器,它更暴漏了一些参数而引入调整分配过程的能力。
 
每次ES的分片调整都是在ES上的数据分布发生了变化的时候进行的,最有代表性的就是有新的数据节点加入了集群的时候。当然调整分片的时机并不是由某个阈值触发的,ES内置十一个裁决者来决定是否触发分片调整,这里暂不赘述。另外,这些分配部署策略都是可以在运行时更新的,更多配置分片的属性也请大家自行Google。
 

路由优化

ES中所谓的路由和IP网络不同,是一个类似于Tag的东西。在创建文档的时候,可以通过字段为文档增加一个路由属性的Tag。ES内在机制决定了拥有相同路由属性的文档,一定会被分配到同一个分片上,无论是主分片还是副本。那么,在查询的过程中,一旦指定了感兴趣的路由属性,ES就可以直接到相应的分片所在的机器上进行搜索,而避免了复杂的分布式协同的一些工作,从而提升了ES的性能。于此同时,假设机器1上存有路由属性A的文档,机器2上存有路由属性为B的文档,那么我在查询的时候一旦指定目标路由属性为A,即使机器2故障瘫痪,对机器1构不成很大影响,所以这么做对灾况下的查询也提出了解决方案。所谓的路由,本质上是一个分桶(Bucketing)操作。当然,查询中也可以指定多个路由属性,机制大同小异。
 

Elasticsearch GC调优

ElasticSearch本质上是个Java程序,所以配置JVM垃圾回收器本身也是一个很有意义的工作。我们使用JVM的Xms和Xmx参数来提供指定内存大小,本质上提供的是JVM的堆空间大小,当JVM的堆空间不足的时候就会触发致命的OutOfMemoryException。这意味着要么内存不足,要么出现了内存泄露。处理GC问题,首先要确定问题的源头,一般有三种方案:
开启ElasticSearch上的GC日志 使用jstat命令生成内存Dump
第一条,在ES的配置文件elasticsearch.yml中有相关的属性可以配置,关于每个属性的用途这里当然说不完。
第二条,jstat命令可以帮助我们查看JVM堆中各个区的使用情况和GC的耗时情况。
第三条,最后的办法就是将JVM的堆空间转储到文件中去,实质上是对JVM堆空间的一个快照。

想了解更多关于JVM本身GC调优方法请参考:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html 

另外,通过修改ES节点的启动参数,也可以调整GC的方式,但是实质上和上述方法是等同的。
 

避免内存交换

这一点很简单,由于操作系统的虚拟内存页交换机制,会给性能带来障碍,如数据写满内存会写入Linux中的Swap分区。

可以通过在elasticsearch.yml文件中的bootstrap.mlockall设置为true来实现,但是需要管理员权限,需要修改操作系统的相关配置文件。
 

控制索引合并

上文提到过,ES中的分片和副本本质上都是Lucene索引,而Lucene索引又基于多个索引段构建(至少一个),索引文件中的绝大多数都是只被写一次,读多次,在Lucene内在机制控制下,当满足某种条件的时候多个索引段会被合并到一个更大的索引段,而那些旧的索引段会被抛弃并移除磁盘,这个操作叫做段合并。 

Lucene要执行段合并的理由很简单充分:索引段粒度越小,查询性能越低且耗费的内存越多。频繁的文档更改操作会导致大量的小索引段,从而导致文件句柄打开过多的问题,如修改系统配置,增大系统允许的最大文件打开数。总的来讲,当索引段由多一个合并为一个的时候,会减少索引段的数量从而提高ES性能。对于研发者来讲,我们所能做的就是选择合适的合并策略,尽管段合并完全是Lucene的任务,但随着Lucene开放更多配置借口,新版本的ES还是提供了三种合并的策略tiered,log_byte_size,log_doc。另外,ES也提供了两种Lucene索引段合并的调度器:concurrent和serial。其中各者具体区别,这里暂不赘述,只是抛砖引玉。

分享阅读原文:http://www.cnblogs.com/guguli/p/5218297.html 查看全部


Elasticsearch简述


ElasticSearch是现在技术前沿的大数据引擎,常见的组合有ES+Logstash+Kibana作为一套成熟的日志系统,其中Logstash是ETL工具,Kibana是数据分析展示平台。Elasticsearch让人惊艳的是他强大的搜索相关能力和灾备策略,Elastcisearch开放了一些接口供开发者研发自己的插件,Elasticsearch结合中文分词的插件会给Elasticsearch的搜索和分析起到很大的推动作用。ElasticSearch是使用开源全文检索库Apache Lucene进行索引和搜索的,所以Elasticsearch底层是依赖的Lucene。
 
关于Lucene:
Apache Lucene将写入索引的所有信息组织成一种倒排索引(Inverted Index)的结构之中,该结构是种将词项映射到文档的数据结构。其工作方式与传统的关系数据库不同,大致来说倒排索引是面向词项而不是面向文档的。且Lucene索引之中还存储了很多其他的信息,如词向量等等,每个Lucene都是由多个段构成的,每个段只会被创建一次但会被查询多次,段一旦创建就不会再被修改。多个段会在段合并的阶段合并在一起,何时合并由Lucene的内在机制决定,段合并后数量会变少,但是相应的段本身会变大。段合并的过程是非常消耗I/O的,且与之同时会有些不再使用的信息被清理掉。在Lucene中,将数据转化为倒排索引,将完整串转化为可用于搜索的词项的过程叫做分析。文本分析由分析器(Analyzer)来执行,分析其由分词器(Tokenizer),过滤器(Filter)和字符映射器(Character Mapper)组成,其各个功能显而易见。除此之外,Lucene有自己的一套完整的查询语言来帮助我们进行搜索和读写。
 
*注:Elasticsearch中的索引指的是查询/寻址时URI中的一个字段如:[host]:[port(9200)]/[index]/[type]/[ID]?[option],而Lucene中的索引更多地和ES中的分片的概念相对应。
 
Elasticsearch架构设计理念特性如下:
  1. 合理的默认配置:只需修改节点中的Yaml配置文件,就可以快速配置。这和Spring4中对配置的简化有相似的地方。
  2. 分布式工作模式:Elasticsearch强大的Zen发现机制不仅支持组广播也支持点单播,且有“知一点即知天下”之妙。
  3. 对等架构:节点之间自动备份分片,且使分片本身和样本之间尽量”远离“,可以避免单点故障。且Master节点和Data节点几乎完全等价。
  4. 易于向集群扩充新节点:大大简化研发或运维将新节点加入集群所需的工作。
  5. 不对索引中的数据结构增加任何限制:ES支持在一个索引之中存在多种数据类型。
  6. 准实时:搜索和版本同步,由于ES是分布式应用,一个重大的挑战就是一致性问题,无论索引还是文档数据,然而事实证明ES表现优秀。

 


分片策略


选择合适的分片数和副本数:
ES的分片分为两种,主分片(Primary Shard)和副本(Replicas)。默认情况下,ES会为每个索引创建5个分片,即使是在单机环境下,这种冗余被称作过度分配(Over Allocation),目前看来这么做完全没有必要,仅在散布文档到分片和处理查询的过程中就增加了更多的复杂性,好在ES的优秀性能掩盖了这一点。假设一个索引由一个分片构成,那么当索引的大小超过单个节点的容量的时候,ES不能将索引分割成多份,因此必须在创建索引的时候就指定好需要的分片数量。此时我们所能做的就是创建一个新的索引,并在初始设定之中指定这个索引拥有更多的分片。反之如果过度分配,就增大了Lucene在合并分片查询结果时的复杂度,从而增大了耗时,所以我们得到了以下结论: 我们应该使用最少的分片!
 
主分片,副本和节点最大数之间数量存在以下关系:
节点数 <= 主分片数 *(副本数+1)    NodeNum <= PNum * ( Rnum + 1 )
这个关系,其实就是保持最好一个数据节点,最好保存一个索引的一个分片(不管主副)。
 
控制分片分配行为:
以上是在创建每个索引的时候需要考虑的优化方法,然而在索引已创建好的前提下,是否就是没有办法从分片的角度提高了性能了呢?当然不是,首先能做的是调整分片分配器的类型,具体是在elasticsearch.yml中设置cluster.routing.allocation.type属性,共有两种分片器even_shard,balanced(默认)。even_shard是尽量保证每个节点都具有相同数量的分片,balanced是基于可控制的权重进行分配,相对于前一个分配器,它更暴漏了一些参数而引入调整分配过程的能力。
 
每次ES的分片调整都是在ES上的数据分布发生了变化的时候进行的,最有代表性的就是有新的数据节点加入了集群的时候。当然调整分片的时机并不是由某个阈值触发的,ES内置十一个裁决者来决定是否触发分片调整,这里暂不赘述。另外,这些分配部署策略都是可以在运行时更新的,更多配置分片的属性也请大家自行Google。
 


路由优化


ES中所谓的路由和IP网络不同,是一个类似于Tag的东西。在创建文档的时候,可以通过字段为文档增加一个路由属性的Tag。ES内在机制决定了拥有相同路由属性的文档,一定会被分配到同一个分片上,无论是主分片还是副本。那么,在查询的过程中,一旦指定了感兴趣的路由属性,ES就可以直接到相应的分片所在的机器上进行搜索,而避免了复杂的分布式协同的一些工作,从而提升了ES的性能。于此同时,假设机器1上存有路由属性A的文档,机器2上存有路由属性为B的文档,那么我在查询的时候一旦指定目标路由属性为A,即使机器2故障瘫痪,对机器1构不成很大影响,所以这么做对灾况下的查询也提出了解决方案。所谓的路由,本质上是一个分桶(Bucketing)操作。当然,查询中也可以指定多个路由属性,机制大同小异。
 


Elasticsearch GC调优


ElasticSearch本质上是个Java程序,所以配置JVM垃圾回收器本身也是一个很有意义的工作。我们使用JVM的Xms和Xmx参数来提供指定内存大小,本质上提供的是JVM的堆空间大小,当JVM的堆空间不足的时候就会触发致命的OutOfMemoryException。这意味着要么内存不足,要么出现了内存泄露。处理GC问题,首先要确定问题的源头,一般有三种方案:
  1. 开启ElasticSearch上的GC日志
  2.  使用jstat命令
  3. 生成内存Dump

第一条,在ES的配置文件elasticsearch.yml中有相关的属性可以配置,关于每个属性的用途这里当然说不完。
第二条,jstat命令可以帮助我们查看JVM堆中各个区的使用情况和GC的耗时情况。
第三条,最后的办法就是将JVM的堆空间转储到文件中去,实质上是对JVM堆空间的一个快照。

想了解更多关于JVM本身GC调优方法请参考:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html 

另外,通过修改ES节点的启动参数,也可以调整GC的方式,但是实质上和上述方法是等同的。
 


避免内存交换


这一点很简单,由于操作系统的虚拟内存页交换机制,会给性能带来障碍,如数据写满内存会写入Linux中的Swap分区。

可以通过在elasticsearch.yml文件中的bootstrap.mlockall设置为true来实现,但是需要管理员权限,需要修改操作系统的相关配置文件。
 


控制索引合并


上文提到过,ES中的分片和副本本质上都是Lucene索引,而Lucene索引又基于多个索引段构建(至少一个),索引文件中的绝大多数都是只被写一次,读多次,在Lucene内在机制控制下,当满足某种条件的时候多个索引段会被合并到一个更大的索引段,而那些旧的索引段会被抛弃并移除磁盘,这个操作叫做段合并。 

Lucene要执行段合并的理由很简单充分:索引段粒度越小,查询性能越低且耗费的内存越多。频繁的文档更改操作会导致大量的小索引段,从而导致文件句柄打开过多的问题,如修改系统配置,增大系统允许的最大文件打开数。总的来讲,当索引段由多一个合并为一个的时候,会减少索引段的数量从而提高ES性能。对于研发者来讲,我们所能做的就是选择合适的合并策略,尽管段合并完全是Lucene的任务,但随着Lucene开放更多配置借口,新版本的ES还是提供了三种合并的策略tiered,log_byte_size,log_doc。另外,ES也提供了两种Lucene索引段合并的调度器:concurrent和serial。其中各者具体区别,这里暂不赘述,只是抛砖引玉。


分享阅读原文:http://www.cnblogs.com/guguli/p/5218297.html


如何清理掉iptables的NAT的POSTROUTING规则

开源技术采菊篱下 回复了问题 • 2 人关注 • 1 个回复 • 123 次浏览 • 2016-11-11 18:20 • 来自相关话题

老男孩Python开发2016最新14期前10周视频【限免】

编程语言your well 回复了问题 • 3 人关注 • 2 个回复 • 678 次浏览 • 2016-11-10 09:05 • 来自相关话题

Apche和Nginx 状态页面开启设置

开源技术Ansible 发表了文章 • 0 个评论 • 169 次浏览 • 2016-11-09 22:30 • 来自相关话题

Apache Server Status​设置

1、确认apache已经加载了status_module 模块
一般yum安装的apache已经在主配置文件/etc/httpd/conf/httpd.conf 里面已经加载了
LoadModule status_module modules/mod_status.so检验如下:
[root@web1 httpd]# apachectl -M |grep -i 'status'
status_module (shared)
Syntax OK如果是编译安装的apache,那你就可能没有安装了,编译安装的,动态添加如下:
# 进入到apache的源码mod_status.c目录
cd /usr/local/httpd-2.2.3/modules/generators
# 执行编译加载程序
/usr/local/apache/bin/apxs -i -a -c mod_status.c
# 重启httpd服务
service httpd restart最后在用httpd -M检查模块是否已经加载,确认模块已经加载没有问题后,在httpd.conf文件增加相应的配置路径 ,引入mod_status.so的配置段:
ExtendedStatus On
<Location /Server-status>
SetHandler Server-status
Order deny,allow
Deny from all
Allow from 192.168.1.100
</Location>
说明:
Deny from表示禁止的访问地址;Allow from表示允许的地址访问;ExtendedStatus On表示的是待会访问的时候能看到详细的请求信息,另外该设置仅能用于全局设置,不能在特定的虚拟主机中打开或关闭。启用扩展状态信息将会导致服务器运行效率降低。
 状态页的配置到这里就结束了,下面我们来访问一下,看看具体状态页有哪些可以利用的价值数据。
输入网址http://IP:PORT/server-status就可以看到apache状态页了。
Apache Server Status for localhost
Server Version: Apache/2.2.3 (Centos)
Server Built: Nov 9 2016 15:18:56

Current Time: Sunday, 11-Nov-2016 17:44:21 Öйú±ê׼ʱ¼ä
Restart Time: Sunday, 11-Nov-2016 17:36:28 Öйú±ê׼ʱ¼ä
Parent Server Generation: 1
Server uptime: 7 minutes 52 seconds
Total accesses: 0 - Total Traffic: 0 kB
0 requests/sec - 0 B/second -
1 requests currently being processed, 63 idle workers
______________________________________________________________W_
................................................................

Scoreboard Key:"_" Waiting for Connection, "S" Starting up, "R" Reading Request,"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,"C" Closing connection, "L" Logging, "G" Gracefully finishing,"I" Idle cleanup of worker, "." Open slot with no current process
Srv PID Acc M SS Req Conn Child Slot Client VHost Request
0-1 4140 0/0/0 W 0 287636364 0.0 0.00 0.00 127.0.0.1 192.168.0.100 GET /c-server-status HTTP/1.1

Srv Child Server number - generation
PID OS process ID
Acc Number of accesses this connection / this child / this slot
M Mode of operation
SS Seconds since beginning of most recent request
Req Milliseconds required to process most recent request
Conn Kilobytes transferred this connection
Child Megabytes transferred this child
Slot Total megabytes transferred this slot参数分析:
字段 说明
Server Version Apache 服务器的版本。
Server Built Apache 服务器编译安装的时间。
Current Time 目前的系统时间。
Restart Time Apache 重新启动的时间。
Parent Server Generation Apache 父程序 (parent process) 的世代编号,就是 httpd 接收到 SIGHUP 而重新启动的次数。
Server uptime Apache 启动后到现在经过的时间。
Total accesses 到目前为此 Apache 接收的联机数量及传输的数据量。
CPU Usage 目前 CPU 的使用情形。
_SWSS.... 所有 Apache process 目前的状态。每一个字符表示一个程序,最多可以显示 256 个程序的状态。
Scoreboard Key 上述状态的说明。以下为每一个字符符号所表示的意义:
* _:等待连结中。
* S:启动中。
* R:正在读取要求。
* W:正在送出回应。
* K:处于保持联机的状态。
* D:正在查找DNS。
* C:正在关闭连结。
* L:正在写入记录文件。
* G:进入正常结束程序中。
* I:处理闲置。
* .:尚无此程序。
Srv 本程序与其父程序的世代编号。
PID 本程序的process id。
Acc 分别表示本次联机、本程序所处理的存取次数。
M 该程序目前的状态。
CPU 该程序所耗用的CPU资源。
SS 距离上次处理要求的时间。
Req 最后一次处理要求所耗费的时间,以千分之一秒为单位。
Conn 本次联机所传送的数据量。
Child 由该子程序所传送的数据量。
Slot 由该 Slot 所传送的数据量。
Client 客户端的地址。
VHost 属于哪一个虚拟主机或本主机的IP。
Request 联机所提出的要求信息。

Nginx 状态页配置

如果你的nginx看到了--with-http_sub_module 这个模块,就代表可以启用status,使用nginx -V 就可以看到你的编译参数,如果没有的话,自行重新编译加上--with-http_sub_module 就好。
 
1、添加nginx status配置
在默认主机里面加上location或者你希望能访问到的主机里面
location /nginx_status {
stub_status on;
access_log off;
allow 10.0.1.xx;
allow 139.59.253.28;
deny all;
}

2、重启nginx
# service nginx restart3、查看status页面
# curl http://127.0.0.1/nginx_status
Active connections: 10132
server accepts handled requests
 11302 11302 11409
Reading: 0 Writing: 7 Waiting: 142第1列:
当前与http建立的连接数,包括等待的客户端连接:10132

第2列:
接受的客户端连接总数目:11302
处理的客户端连接总数目:11302
客户端总的请求数目:11409
总共处理了11302个连接 , 成功创建11302次握手, 总共处理了11409个请求

第3列:
reading — 读取客户端的连接数.
writing — 响应数据到客户端的数量
waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.
 
nginx plus (企业用户)官网(http://demo.nginx.com/status.html#)图示如下: 查看全部
ApachNginxStatus.png


Apache Server Status​设置


1、确认apache已经加载了status_module 模块
一般yum安装的apache已经在主配置文件/etc/httpd/conf/httpd.conf 里面已经加载了
LoadModule status_module modules/mod_status.so
检验如下:
[root@web1 httpd]# apachectl -M |grep -i 'status'
status_module (shared)
Syntax OK
如果是编译安装的apache,那你就可能没有安装了,编译安装的,动态添加如下:
# 进入到apache的源码mod_status.c目录
cd /usr/local/httpd-2.2.3/modules/generators
# 执行编译加载程序
/usr/local/apache/bin/apxs -i -a -c mod_status.c
# 重启httpd服务
service httpd restart
最后在用httpd -M检查模块是否已经加载,确认模块已经加载没有问题后,在httpd.conf文件增加相应的配置路径 ,引入mod_status.so的配置段:
ExtendedStatus On
<Location /Server-status>
SetHandler Server-status
Order deny,allow
Deny from all
Allow from 192.168.1.100
</Location>

说明:
  1. Deny from表示禁止的访问地址;
  2. Allow from表示允许的地址访问;
  3. ExtendedStatus On表示的是待会访问的时候能看到详细的请求信息,另外该设置仅能用于全局设置,不能在特定的虚拟主机中打开或关闭。启用扩展状态信息将会导致服务器运行效率降低。

 状态页的配置到这里就结束了,下面我们来访问一下,看看具体状态页有哪些可以利用的价值数据。
输入网址http://IP:PORT/server-status就可以看到apache状态页了。
Apache Server Status for localhost
Server Version: Apache/2.2.3 (Centos)
Server Built: Nov 9 2016 15:18:56

Current Time: Sunday, 11-Nov-2016 17:44:21 Öйú±ê׼ʱ¼ä
Restart Time: Sunday, 11-Nov-2016 17:36:28 Öйú±ê׼ʱ¼ä
Parent Server Generation: 1
Server uptime: 7 minutes 52 seconds
Total accesses: 0 - Total Traffic: 0 kB
0 requests/sec - 0 B/second -
1 requests currently being processed, 63 idle workers
______________________________________________________________W_
................................................................

Scoreboard Key:"_" Waiting for Connection, "S" Starting up, "R" Reading Request,"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,"C" Closing connection, "L" Logging, "G" Gracefully finishing,"I" Idle cleanup of worker, "." Open slot with no current process
Srv PID Acc M SS Req Conn Child Slot Client VHost Request
0-1 4140 0/0/0 W 0 287636364 0.0 0.00 0.00 127.0.0.1 192.168.0.100 GET /c-server-status HTTP/1.1

Srv Child Server number - generation
PID OS process ID
Acc Number of accesses this connection / this child / this slot
M Mode of operation
SS Seconds since beginning of most recent request
Req Milliseconds required to process most recent request
Conn Kilobytes transferred this connection
Child Megabytes transferred this child
Slot Total megabytes transferred this slot
参数分析:
字段 说明
Server Version Apache 服务器的版本。
Server Built Apache 服务器编译安装的时间。
Current Time 目前的系统时间。
Restart Time Apache 重新启动的时间。
Parent Server Generation Apache 父程序 (parent process) 的世代编号,就是 httpd 接收到 SIGHUP 而重新启动的次数。
Server uptime Apache 启动后到现在经过的时间。
Total accesses 到目前为此 Apache 接收的联机数量及传输的数据量。
CPU Usage 目前 CPU 的使用情形。
_SWSS.... 所有 Apache process 目前的状态。每一个字符表示一个程序,最多可以显示 256 个程序的状态。
Scoreboard Key 上述状态的说明。以下为每一个字符符号所表示的意义:
* _:等待连结中。
* S:启动中。
* R:正在读取要求。
* W:正在送出回应。
* K:处于保持联机的状态。
* D:正在查找DNS。
* C:正在关闭连结。
* L:正在写入记录文件。
* G:进入正常结束程序中。
* I:处理闲置。
* .:尚无此程序。
Srv 本程序与其父程序的世代编号。
PID 本程序的process id。
Acc 分别表示本次联机、本程序所处理的存取次数。
M 该程序目前的状态。
CPU 该程序所耗用的CPU资源。
SS 距离上次处理要求的时间。
Req 最后一次处理要求所耗费的时间,以千分之一秒为单位。
Conn 本次联机所传送的数据量。
Child 由该子程序所传送的数据量。
Slot 由该 Slot 所传送的数据量。
Client 客户端的地址。
VHost 属于哪一个虚拟主机或本主机的IP。
Request 联机所提出的要求信息。


Nginx 状态页配置


如果你的nginx看到了--with-http_sub_module 这个模块,就代表可以启用status,使用nginx -V 就可以看到你的编译参数,如果没有的话,自行重新编译加上--with-http_sub_module 就好。
 
1、添加nginx status配置
在默认主机里面加上location或者你希望能访问到的主机里面
 location /nginx_status {
stub_status on;
access_log off;
allow 10.0.1.xx;
allow 139.59.253.28;
deny all;
}

2、重启nginx
# service nginx restart
3、查看status页面
# curl http://127.0.0.1/nginx_status
Active connections: 10132
server accepts handled requests
 11302 11302 11409
Reading: 0 Writing: 7 Waiting: 142
第1列:
当前与http建立的连接数,包括等待的客户端连接:10132

第2列:
接受的客户端连接总数目:11302
处理的客户端连接总数目:11302
客户端总的请求数目:11409
总共处理了11302个连接 , 成功创建11302次握手, 总共处理了11409个请求

第3列:
reading — 读取客户端的连接数.
writing — 响应数据到客户端的数量
waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.
 
nginx plus (企业用户)官网(http://demo.nginx.com/status.html#)图示如下:
NginxStatus.png

Nginx负载均衡MYSQL数据库

开源技术being 发表了文章 • 0 个评论 • 146 次浏览 • 2016-11-09 14:16 • 来自相关话题

默认Nginx只支持http的反向代理,要想nginx支持tcp的反向代理,还需要在编译时增加tcp代理模块支持,即nginx_tcp_proxy_module,具体实现如下。
 

一、编译安装

添加nginx支持tcp_proxy模块,如需其他功能自动编译其他模块,例如:prce、gzip、ssl等功能。
cd /usr/local/src/
wget "https://github.com/yaoweibin/nginx_tcp_proxy_module/archive/master.zip"
mkdir -pv /data/ModulePlugin && unzip master.zip -d /data/ModulePlugin/
wget 'http://nginx.org/download/nginx-1.2.1.tar.gz'
tar -xzvf nginx-1.2.1.tar.gz
cd nginx-1.2.1/
patch -p1 < /data/ModulePlugin/nginx_tcp_proxy_module-master/tcp.patch
./configure --prefix=/usr/local/nginx --add-module=/data/ModulePlugin/nginx_tcp_proxy_module-master/ --with-http_stub_status_module --with-http_gzip_static_module
make
make install

 
 

二、添加配置

1、在主配置文件nginx.conf 中include 加载目录
user nobody;
worker_processes 4;

error_log logs/error.log info;

pid logs/nginx.pid;


events {
worker_connections 2048;
}

include /usr/local/nginx/conf/vhost/*.conf;

http {
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;
#gzip on;

server {
listen 3306;
server_name udb.com;

#charset utf-8;

location / {
root html;
index index.html index.htm;
}

location /nginx_status {
stub_status on;
access_log logs/nginx_status.log;
allow 10.0.1.136;
deny all;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}

}/usr/local/nginx/conf/vhost/proxy_mysql.conf 内容如下:
tcp {
upstream mysqldb {
server 10.0.1.138:3306;
server 10.0.1.139:3306;

check interval=3000 rise=2 fall=5 timeout=1000;
#check interval=3000 rise=2 fall=5 timeout=1000
#check interval=3000 rise=2 fall=5 timeout=1000
#check_http_send "GET /HTTP/1.0\r\n\r\n";
#check_http_expect_alive http_2xxhttp_3xx;
}

server {
listen 3307;
proxy_pass mysqldb;
}
}参数说明:
check interval 健康检查,单位是毫秒
rise 检查几次正常后,将reslserver加入以负载列表中
fall 检查几次失败后,摘除realserver
timeout 检查超时时间,单位许毫秒
具体可查看nginx_tcp_proxy_module-master/README,也可以查看:https://github.com/yaoweibin/nginx_tcp_proxy_module 。 查看全部
Nginx_Proxy_Mysql.png

默认Nginx只支持http的反向代理,要想nginx支持tcp的反向代理,还需要在编译时增加tcp代理模块支持,即nginx_tcp_proxy_module,具体实现如下。
 


一、编译安装


添加nginx支持tcp_proxy模块,如需其他功能自动编译其他模块,例如:prce、gzip、ssl等功能。
cd /usr/local/src/
wget "https://github.com/yaoweibin/nginx_tcp_proxy_module/archive/master.zip"
mkdir -pv /data/ModulePlugin && unzip master.zip -d /data/ModulePlugin/
wget 'http://nginx.org/download/nginx-1.2.1.tar.gz'
tar -xzvf nginx-1.2.1.tar.gz
cd nginx-1.2.1/
patch -p1 < /data/ModulePlugin/nginx_tcp_proxy_module-master/tcp.patch
./configure --prefix=/usr/local/nginx --add-module=/data/ModulePlugin/nginx_tcp_proxy_module-master/ --with-http_stub_status_module --with-http_gzip_static_module
make
make install

 
 


二、添加配置


1、在主配置文件nginx.conf 中include 加载目录
user  nobody;
worker_processes 4;

error_log logs/error.log info;

pid logs/nginx.pid;


events {
worker_connections 2048;
}

include /usr/local/nginx/conf/vhost/*.conf;

http {
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;
#gzip on;

server {
listen 3306;
server_name udb.com;

#charset utf-8;

location / {
root html;
index index.html index.htm;
}

location /nginx_status {
stub_status on;
access_log logs/nginx_status.log;
allow 10.0.1.136;
deny all;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

}

}
/usr/local/nginx/conf/vhost/proxy_mysql.conf 内容如下:
tcp {
upstream mysqldb {
server 10.0.1.138:3306;
server 10.0.1.139:3306;

check interval=3000 rise=2 fall=5 timeout=1000;
#check interval=3000 rise=2 fall=5 timeout=1000
#check interval=3000 rise=2 fall=5 timeout=1000
#check_http_send "GET /HTTP/1.0\r\n\r\n";
#check_http_expect_alive http_2xxhttp_3xx;
}

server {
listen 3307;
proxy_pass mysqldb;
}
}
参数说明:
check interval 健康检查,单位是毫秒
rise 检查几次正常后,将reslserver加入以负载列表中
fall 检查几次失败后,摘除realserver
timeout 检查超时时间,单位许毫秒
具体可查看nginx_tcp_proxy_module-master/README,也可以查看:https://github.com/yaoweibin/nginx_tcp_proxy_module