原理
nginx 服务是一个支持高并发,反向代理,并且提供负载均衡的一种轻量级web应用服务器。
在nginx tomcat(java,jvm)架构中
nginx只做请求的转发,不参与代码的计算
nginx手工安装
1.将tengine-1.5.tar.gz包上传到linux新建的tengine文件夹使用tar -zxvf tengine-1.5.tar.gz 进行解压后 使用rm -rf tengine-1.5.tar.gz 删除压缩包
2.使用./configure --prefix=/usr/local/tengine/指定安装路径
3.使用make && make install 进行编译安装
启动nginx
使用安装路径+/sbin/nginx
例如: /usr/local/tengine/sbin/nginx
重启:/usr/local/tengine/sbin/nginx/ -s reload
关闭:/usr/local/tengine/sbin/nginx/ -s stop
验证是否启动成功
1.查看端口80 lsof -i:80 netstat -ntlp|grep 80
2.本地浏览器访问nginx服务 IP:port
nginx负载均衡配置
在/usr/local/tengine/nginx.conf文件中进行配置
配置内容如下
1.设置拦截规则
location ^~/youcepre(项目名){
映射url
}
upstream 和映射url一致{
tomcat列表 可加权重与轮询设置规则(当权重为1:1就是轮询)
}
2.设置巡测规则(由用户触发的规则,自巡测规则)
max_fails=3 fail_timeout=20s;
//如果20s内出现三次错误,则在接下来的20s之内则不会向挂掉的tomcat机器发送请求
check interval=3000 rise=2 fall=5 timeout=1000 type=tcp;
//每3s自巡测一次,如果在巡测时,连续发送两次tcp请求都正常则将tomcat挂掉的机器置为up,如果连续发送五次都为fall则将tomcat机器置为down,发送一次tcp连接的超时时间,每超时一次记录一次直到5次
nginx自动化shell代码安装
nginx_status.sh文件代码如下
!/bin/bash
HOST="192.168.10.146"
PORT="80"
#检查nginx进程是否存在
function ping {
//使用下边命令可获取nginx进程id
/sbin/pidof nginx | wc -l
}
#采集nginx数据
function active {
/usr/bin/curl "http://$HOST:$PORT/status/nginx_conn_status" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function reading {
/usr/bin/curl "http://$HOST:$PORT/status/nginx_conn_status" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing {
/usr/bin/curl "http://$HOST:$PORT/status/nginx_conn_status" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting {
/usr/bin/curl "http://$HOST:$PORT/status/nginx_conn_status" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
function accepts {
/usr/bin/curl "http://$HOST:$PORT/status/nginc_conf+status" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
function handled {
/usr/bin/curl "http://$HOST:$PORT/status/nginx_conf_status" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
function requests {
/usr/bin/curl "http://$HOST:$PORT/status/nginx_conf_status" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
# 执行function
$1
#NR - Number of Record 当前处理的行是第几行
#NF - Number of Record 当前处理的列是最后一列
#/usr/bin/curl "url" 相当于访问此url
nginx.conf配置文件如下
UserParameter=nginx.status[*],/etc/zabbix/zabbix_agentd.d/nginx_status.sh $1
手工监控具体实现步骤
1.首先将nginx.conf 和nginx_status.sh 复制到/etc/zabbix/zabbixd.d/目录下
2.重启zabbix-agented
3.在zabbix-server使用如下命令进行测试
zabbix_get -s 客户端ip -p 10050 -k 'nginx_status[accept]'
4.配置模板,监控nginx服务主机
监控原理
zabbix_agent中的配置文件主动上报ip 为zabbix_server的ip
当服务端想要去通过模板传参获取客户端nginx监控项信息的时候,实质上是将模板中的参数,通过客户端的传参机制传递给了nginx.conf文件中的nginx.conf[*],紧接着这个文件中的客户端nginx_status.sh脚本接受这个参数,通过调用自己脚本中的函数去获取监控项信息
其中nginx的监控项包括 ping active reading writing waiting handled accepts requests(即进程监控,连接数监控)
reading 指的是nginx接收的请求数,writing指的是处理的请求数 waiting 指的是nginx等待的请求数 重点关注waiting如果waiting不为0,则可能是接收的请求数达到了nginx的上线即nginx的cpu*worker_process
nginx问题定位 通过增加日志upstream_response_time 和request_time
upstream_response_time指的是负载均衡响应时间 , 即tomcat把请求交给代码,代码处理完请求再将请求转发给tomcat的一个时间
request_time 指的是jmeter将请求发给nginx,nginx将请求转发给tomcat,tomcat将请求转发给代码,代码处理完请求在返回给tomcat,tomcat返回给nginx,nginx在返回给jmeter.
监控nginx并发请求数
1.通过awk命令 两种常用 awk '{ print $1 }' | sort -n(按值排序,升序) | uniq -c | sort -nr(-r是翻转) | head -10(显示多少行) //访问ip最多
awk '{ print $4}' | sort -r | unip -c | head -10 //并发数
awk '{print $9}'| sort -n| uniq -c| sort -nr | head -10 //状态码
awk -F "分隔符" print '{ print $2 }' | sort -r | uniq -c | head -10
2.通过jmeter工具聚合报告倒数第三列throughput查看每秒并发请求数
nginx瓶颈定位分析
A
1.通过查看throughput和99%rt可以分析出问题
2.如果throughput即每秒请求数小于nginx能够接收的上限,rt时间还比较小,证明nginx没问题
B
1.如果rt时间较小,报错率不断上升,经验证tomcat挂了,则继续往后排查,可能是tomcat或代码的问题
C
1.如果rt时间较大,报错率不断上升,则可能是tomcat或者代码的问题,因为只有程序处理请求,如果程序有瓶颈则代码线程就不会释放请求,tomcat就会启动新的线程去处理请求,如果200个线程都占满,则没有请求去接受请求,则只能将请求放到队列中等候,当达到排队请求的上限则会将tomcat托挂掉,jmeter会报连接拒绝的错误,当然也会有连接超时的错误,代码处理请求线程不释放,由于tomcat默认请求连接时间是20s,如果处理请求线程20s都没返回结果,会报连接超时,同样队列中的也会报连接超时
2.如果rt时间较大,报错率不断上升,如果不是tomcat与代码问题,则可能是nginx问题,由于nginx接收请求数达到上限,则剩余请求需要排队等待,如果达到规定时间没有返回,则会报连接超时的错误,增大nginx配置,即增大nginx的cpu个数
查询进程并杀掉进程命令
1.ps -ef | grep 进程名
2.lsof -i:10050(zabbix客户端进程) lsof -i:10051(服务端进程)
3.kill -9 进程pid(单独杀进程)
4.pkill -9 进程名 (批量杀进程)
5.pkill -9 zabbix_ag(杀掉zabbix客户端进程)
6.pkill -9 zabbix_se(杀掉zabbix服务端进程)
查看防火墙以及关闭防火墙
service iptables status(状态)
service iptables stop(停止)
service iptables start(开始)
重启zabbix-agentd服务
service zabbix-agent restart
service zabbix-agent start
服务端测试
zabbix_get -s zabix客户端ip -p 10050 -k nginx.status[accept]
shell自动化创建nginx在zabbix平台的监控(代替手工操作的九步,在一分钟之内完成,甚至少于一分钟)
1.监控Nginx的机器上安装了nginx
2.执行远程同步,即执行create_remote_sync_and_zabbix_agent.sh脚本,脚本执行需要传参,本地路径和远程路径
第一个存放的文件为nginx_status.sh(此脚本用于监控Nginx服务所在机器的情况包括8个函数分别为ping,reading,writing,waiting,handler,accepts,requests,time)第二个存放的文件为nginx.conf(此配置文件中,写了入参的情况和调用的脚本,UserParameter=nginx.conf[*],/etc/zabbix/zabbix_agentd.d/nginx_status.sh $1)
第三个存放的文件为zabbix_agent安装包,包括32位和64位,当执行远程配置时,需要自动化远程主机安装zabbix客户端,前提集群之间免密登录
第四个文件为zabbix_agentd.conf 此文件为zabbix客户端配置文件,将原机器上的zabbix客户端文件删除,使用自己修改的配置文件
3.执行远程自动配置
本地配置的脚本需要获取本地机器的ip,替换hostname,上报服务端的ip.替换Server,ServerActive,还需指定客户端使用的配置文件为、/etc/zabbix/zabbix_agentd.d/*.conf即为nginx.conf传参,还需指定UnsafeUseParameters=1即允许客户端使用参数
自动化执行脚本调用关系
需要两个脚本
第一个脚本nginx_create_remote_sync_and_zabbix_agent.sh调用nginx_remote_create_aync_and_zabbix_agent_auto_config.sh
nginx__create_remote_sync_and_zabbix_agent.sh脚本内容如下
vim ngixn_create_remote_sync_and_zabbix_agent.sh
#!/bin/bash
#init param
sourcePath=$1
remoteTargetPath=$2
zabbix_server_ip=$3
ip=192.168.10.150
shellFileName = nginx_create_remote_sync_and_zabbix_agent_auto_config.sh
shellPath=/root/tool/shell/nginx/remote/create_remote_sync_and_zabbix_agent_config/$shellFileName
#创建远程目标路径
ssh root@ip $remoteTargetPath
#将本地文件同步到远程目标路径
scp -r $sourcePath root@ip $remoteTargetPath
#将本地自动配置脚本同步到远程目录
scp $shellPath root@ip $remoteTargetPath
#给同步到远程路径下的shell赋执行权限
ssh root@ip "chmod 755 $remoteTargetPath/$shellFileName"
#远程执行配置shell
ssh root@ip "sh $remoteTargetPath/$shellFileName $remoteTargetPath $zabbix_server_ip"
第二个脚本nginx_create_remote_sync_and_zabbix_auto_config.sh
vim nginx_create_remote_sync_and_zabbix_auto_config.sh
#!/bin/bash
localPath=$1
zabbix_server_ip=$2
#得到远程主机的本地ip
localIp=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|awk -F ":" '{print $2}')
#使用getconf命令获取系统位数LONG_BIT
bit = 'getconf LONG_BIT'(不是双引号,是执行符号)
# 进入本地目录
cd $localPath
#判断系统位数,安装匹配的zabbix_agent
if [ $bit=32 ];then
rpm zabbix-agent-3.4.2-1.e16.i686.rpm
else
rpm zabbix-agent-3.4.2-1.e16.x86_64.rpm
fi
#安装zabbix-agent客户端的依赖包
yum -y install zabbix-agent
#拷贝nginx_status.sh和nginx.conf到/etc/zabbix/zabbix_agentd.d/目录下
cp $localPath/nginx_status.sh nginx.conf /ect/zabbix/zabbix_agentd.d/
#将zabbix原配置文件路径下的zabbix_agentd.conf删除
rm -rf /etc/zabbix/zabbix_agentd.conf
#将新的zabbix_agentd.conf文件拷贝到zabbix配置文件所在路径
cp $localPath/zabbix_agentd.conf /etc/zabbix/
#对zabbix_agentd.conf做修改
sed -i 's/Server=127.0.0.1/Server='$zabbix_server_ip'/g' /etc/zabbix/zabbix_agentd.conf
sed -i 's/ServerActive=127.0.0.1/ServerActive='zabbix-server-ip'/g' /etc/zabbix/zabbix_agentd.conf
sed -i 's/Hostname=Zabbix server/'$localIp'/g' /etc/zabbix/zabbix_zabbixd.conf
sed -i 's/# UnsafeUserParameter=0/UnsafeUserParameter=1/g' /etc/zabbix/zabbix_agentd.d
sed -i '/^# Include/a Include=/etc/zabbix/zabbix_agentd.d/*.conf' /etc/zabbix/zabbix_agentd.conf
#server stop
pkill -9 zabbix*
#server zabbix-agent start
server zabbix-agent start
#创建监控模板
#创建监控主机和群组