一、nginx+tomcat实现负载均衡
在上一篇博客中,我们已经实现了客户端访问动态页面,现在我们来实现负载均衡
实验环境
主机(版本:ip) | 功用 |
---|---|
虚拟机server1(rhel6.5:172.25.2.1) | lnmp环境主机+tomcat1服务器 |
虚拟机server2(rhel6.5:172.25.2.2) | tomcat2服务器 |
真机(rhel7.3:172.25.2.250) | 测试机 |
实验原理
nginx作为反向代理服务器,转发多个tomcat服务器,实现负载均衡。
1、重新开一台虚拟机,将server1
中的jdk和tomcat发送到2上
[root@server1 local]# scp -r apache-tomcat-7.0.37 jdk1.7.0_79 server2:/usr/local/
- 1
2、在server2上,创建软链接,并配置环境变量
[root@server2 ~]# cd /usr/local
[root@server2 local]# ln -s jdk1.7.0_79/ java
[root@server2 local]# ln -s apache-tomcat-7.0.37/ tomcat
[root@server2 local]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.7.0_79
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin
[root@server2 local]# source /etc/profile
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
3、在server1中,编辑openresty中配置文件,并重启nginx。
[root@server1 local]# cd /usr/local/openresty/nginx/conf/
[root@server1 conf]# vim nginx.conf
17 http {
18 upstream tomcat{
19 server 172.25.11.1:8080;
20 server 172.25.11.2:8080;
21 }
73 location ~ \.jsp$ {
74 proxy_pass http://tomcat; #使其访问tomcat
75 }
[root@server1 conf]# /usr/local/openresty/nginx/sbin/nginx -t
[root@server1 conf]# /usr/local/openresty/nginx/sbin/nginx -s reload
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 注意:这一块注释掉,是为了实验效果。
4、先删除原有测试页,再编辑新测试页test.jsp,并发送server2
[root@server1 conf]# cd /usr/local/tomcat/webapps/ROOT/
[root@server1 ROOT]# rm -fr test.jsp
[root@server1 ROOT]# vim test.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html>
[root@server1 ROOT]# scp test.jsp server2:/usr/local/tomcat/webapps/ROOT/
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
编辑完成后,发送给server2
在server2上
5、在server1和server2上都重启tomcat,并查看端口
- tomcat的重启只能先关闭先开启
[root@server1 bin]# cd /usr/local/tomcat/bin/
[root@server1 bin]# ./shutdown.sh
[root@server1 bin]# ./startup.sh
[root@server1 bin]# netstat -tnlp
- 1
- 2
- 3
- 4
6、在浏览器访问测试页http://172.25.2.1/test.jsp
- 注意:在企业里这两个页面是一样的,用户根本不知道访问的那个服务器,这里只是为了实验效果而区别开来,也可以使用以下代码做的测试页,可以更加明显:
在server1和server2上,编辑测试页面:
server1上:
server1 the time is:<%=new java.util.Date() %>
- 1
server2上:
server2 the time is:<%=new java.util.Date() %>
- 1
再次访问测试页http://172.25.2.1/test.jsp
我们还可以在配置文件添加权重weight
每次轮询server1
1次,server2
2次。
到此,我们实现了负载均衡,但是1上面的数据信息会存储到2上面,2上面的数据信息会存储到1上面,而且新的数据就会覆盖旧的数据内容,这样会造成数据的丢失。为了解决这个问题,我们需要使用sticky模块来实现负载均衡中的会话保持。
在下一篇博客中,我们解决此问题。