Centos下实现Nginx+Tomcat实现负载均衡及监控
在性能测试过程中,我们可能会关注很多指标,比如CPU、IO、网络、磁盘等,通过这些指标大致可以判断哪个环节遇到了性能瓶颈,但是当这些指标无法判断出性能瓶颈时,我们可能就需要对一些中间件进行监控,比如Nginx,Tomcat等,当然可能还有很多其他中间件,我们本章主要探讨Nginx+Tomcat的部署及监控,以及使用Jmeter对我们的服务器进行压测,在压测过程中,可能也会遇到Jmeter的一些瓶颈,话不多说,先搞起来。
关于Nginx实现负载均衡
Nginx作为反向代理服务器,实现负载均衡。首先浏览器发起请求,到达Nginx,由Nginx将请求地址转发给相应的tomcat服务器,再由tomcat服务器将结果返回给Nginx,Nginx将结果再转发给浏览器。大致流程如下:
Nginx实现负载均衡.png
环境准备
- Centos6.3
- JDK1.8
- Tomcat8
客户端
- Vmware
- Xshell
- Xftp
Xsehll配置
我们安装Centos6.3后,使用Xshell进行连接,Xshell安装比较简单,基本都是下一步下一步。建议使用root用户进行登录,密码为虚拟机创建用户时密码,Xshell主要作用是方便我们敲Linux命令。如下图所示:
xshell.png
Xftp配置
我们安装Centos6.3后,使用Xftp进行连接,Xftp安装比较简单,基本都是下一步下一步。建议使用root用户进行登录,密码为虚拟机创建用户时密码。协议选择SFTP,Xftp主要作用是上传和下载文件。如下图所示:
xftp.png
JDK环境配置
我们使用xftp把jdk放到/usr/local
下,然后输入vi /etc/profile
,在文件末尾加入如下内容:
export JAVA_HOME=/usr/local/jdk1.8.0_65
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
然后输入source /etc/profile
,在命令行输入java -version
,出现如下内容下图,说明JDK环境配置成功
root@ubuntu:/usr/local# java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
安装Nginx
下载Nginx
切换到usr/local
,然后命令行输入wget http://nginx.org/download/nginx-1.11.6.tar.gz
解压nginx的gz包
tar -zxvf nginx-1.11.6.tar.gz
安装依赖
cd /usr/local/nginx-1.11.6切换到nginx安装目录
yum -y install pcre-devel
yum install -y zlib-devel
./configure --with-http_stub_status_module
编译
make install
启动nginx
cd /usr/local/nginx/sbin
./nginx
验证Nginx是否启动成功
curl http://localhost
出现下面信息说明安装成功
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Nginx常用命令
cd /usr/local/nginx/sbin
-
./nginx
启动 -
./nginx -s stop
关闭 -
./nginx -s reopen
重启 -
./nginx -v
查看版本 -
./nginx -h
可以看到命令的帮助信息
Tomcat部署
- 把2个Tomcat包放在
/usr/local
,为了避免端口冲突,我们需要修改tomcat/conf/server.xml
三处地方,
tomcat1如下:
<Server port="8006" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
tomcat2如下:
<Server port="8007" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Connector port="8082" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8011" protocol="AJP/1.3" redirectPort="8443" />
修改完成之后,tomcat1的端口位8081,tomcat2的端口为8082
- 修改完tomcat端口号之后,为了区分tomcat1和tomcat2,修改
tomcat/webapps/ROOT/index.jsp
,tomcat1修改为如下内容
<html>
<head>
<title>第一个 JSP 程序</title>
</head>
<body>
<%
out.println("111111111");
%>
</body>
</html>
tomcat2修改为如下内容
<html>
<head>
<title>第一个 JSP 程序</title>
</head>
<body>
<%
out.println("22222222");
%>
</body>
</html>
- 进入
/usr/local/
,输入chmod 777 -R tomcat1 tomcat2
给2个tomcat赋予权限(如果权限不够,把bin也赋予权限),然后进入/usr/local/tomcat/bin
,输入service iptables stop
先关闭防火墙,然后./startup.sh
启动tomcat1和tomcat2,启动成功截图如下:
tomcat1.png
tomcat2.png
修改nginx.conf
首先我们使用find / -name nginx.conf
找到nginx.conf的位置,我们使用/usr/local/nginx/conf/nginx.conf
这个路径的nginx.conf文件,使用vim nginx.conf
打开,找到http,在#gzip on;
下面作如下修改:
upstream tomcat {
server 127.0.0.1:8081 weight=1;
server 127.0.0.1:8082 weight=1;
}
server {
listen 80 default_server;
server_name localhost;
location / {
root html;
proxy_pass http://tomcat; #配置集群指向
index index.html index.htm;
}
location /status {
stub_status on;
access_log off;
}
}
做了如上配置后,在/usr/local/nginx/sbin
下重启nginx./nginx -s reopen
,启动成功,当我们访问localhost时,会发现不是Nginx的首页了,而是出现/usr/local/tomcat1/webapps/ROOT/index.jsp
或者是/usr/local/tomcat2/webapps/ROOT/index.jsp
的页面。当我们来回刷新,会发现在下面的2个页面来回跳转,这就实现了负载均衡技术。
tomcat2.png
查看Nginx的一些状态信息
访问虚拟机ip/status,出现如下内容,说明stub_status模块部署成功
nginx状态.png
各数据项说明:
- Active connections: 当前nginx正在处理的活动连接数.
- Server accepts handled requests : nginx总共处理了414 个连接,成功创建414 握手(证明中间没有失败的),总共处理了491个请求
- Reading: nginx读取到客户端的Header信息数
- Writing: nginx返回给客户端的Header信息数
- Waiting: 开启keep-alive的情况下,这个值等于 active – (reading + writing),意思就是nginx已经处理完成,正在等候下一次请求指令的驻留连接。
所以,在访问效率高,请求很快被处理完毕的情况下,Waiting数比较多是正常的.如果reading +writing数较多,则说明并发访问量非常大,正在处理过程中。
为什么是访问ip/status
为什么是访问ip/status?还记得我们在编译的时候使用./configure --with-http_stub_status_module
吗?编译的时候安装了stub_status模块,然后我们对nginx.conf进行了一些配置,除了加负载集群,还新增了一个路径 location /status 。
ngxtop
centos6 暂时没有解决ngxtop启动失败问题,大家可以访问我的阿里云,命令行输入ngxtop
,对照官方文档进行操作,ngxtop地址
Tomcat监控Probe
- 首先把probe.war放入tomcat下面的webapps文件夹
- 修改CATALINA_HOME/conf/tomcat-users.xml,新增以下内容
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="poweruser"/>
<role rolename="probeuser"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="sss" password="sss" roles="manager-gui"/>
<user username="fbysss" password="sss" roles="manager-script,manager-jmx,manager-status,poweruser,probeuser"/>
-
修改CATALINA_HOME/bin/catalina.sh,新增
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
,开启jvm远程监控 -
重启tomcat,访问ip:端口号/probe,出现如下截图说明搭建成功
probe.png
欢迎关注微信公众号:软件测试汪。软件测试交流群:809111560