使用Nginx和Tomcat来做负载均衡与集群(垂直集群)

参考博客:

http://www.cnblogs.com/whtydn/p/4950524.html

http://blog.csdn.net/sxdtzhaoxinguo/article/details/49182063

Nginx官方网站:http://nginx.org/http://nginx.org/

Tomcat集群配置官方文档:http://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html

环境:

JDK 1.7.0_80

Tomcat 8.0.35(准备2个,分别拷贝在不同目录下即可)

Nginx 1.12.1

windows10

下载安装Nginx服务器

JDK和Tomcat的安装就不说了。

在官网上下载Nginx:http://nginx.org/en/download.html

解压到任意目录即可。

然后在安装目录下打开cmd,输入命令start nginx,即可开启Nginx服务器。

打开浏览器输入访问localhost,出现如下界面证明Nginx开启成功。

Nginx服务器默认使用80端口,若您的80端口被占用,可修改至其它未占用端口。

在如下地方修改,打开Niginx根目录->conf->nginx.conf配置文件。

关于nginx更多命令,参考官方文档:http://nginx.org/en/docs/windows.html

配置负载均衡

由于我们是在同一台机器上搭建负载均衡(垂直集群),故启动两台Tomcat服务器实例为了防止端口号冲突,则需要修改Tomcat的Server.xml的端口号。

我们修改其中一个tomcat的端口号,需要修改的地方如下(一共三个):

然后是配置 Niginx根目录->conf->nginx.conf配置文件,

在http模块内加入如下代码:

upstream  localhost{  
	   server localhost:8080 weight=1;
	   server localhost:9090 weight=1;
	}

上图服务器端口号对应于以下tomcat server.xml中配置的端口号:

然后在以下块中加入两行。

记得在两个tomcat中部署测试用的项目。

我用来测试的jsp文件内容为(这个测试jsp文件是从网上Copy来的哟,不过挺好用):

<%@ page language = "java" import = "java.util.*" pageEncoding = "UTF-8" %>
<%@taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%
    String path = request.getContextPath();
    String basePath =
            request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html>
<html lang = "en">
<head>
    <base href = "<%=basePath %>" />
    <meta charset = "UTF-8">
    <title></title>
</head>
<body>
    Server Info:
    <%
        out.println(request.getLocalAddr() + " : " + request.getLocalPort() + "<br>");%>
    <%
        out.println("<br> ID " + session.getId() + "<br>");
        // 如果有新的 Session 属性设置
        String dataName = request.getParameter("dataName");
        if (dataName != null && dataName.length() > 0) {
            String dataValue = request.getParameter("dataValue");
            session.setAttribute(dataName, dataValue);
        }
        out.println("<b>Session 列表</b><br>");
        System.out.println("============================");
        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 = "testCluster.jsp" method = "POST">
        名称:<input type = text size = 20 name = "dataName">
        <br>
        值:<input type = text size = 20 name = "dataValue">
        <br>
        <input type = submit>
    </form>
</body>
</html>

然后,

重启Nginx服务器和两个tomcat服务器。

现在测试负载均衡的效果,

我们先单独通过Tomcat服务器访问,

8080端口服务器正常访问:

9090端口服务器正常访问:

以上证明我们的Tomcat服务器启动正常。

现在通过Nginx访问四次:

从以上四次访问中我们可以看到已经实现了Nginx的负载均衡。

配置Tomcat的集群(Session的复制)

tomcat的集群配置非常简单,我们来看看官网的文档描述的配置步骤,

我们需要在tomcat的server.xml中的Engine标签下加入Cluster节点内容:

        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="auto"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

以上这些都是tomcat的默认配置,根据官方描述,若全部使用默认配置的话我们只需要取出以下注释即可,不需要再加入上面那一大段配置:

这里我们需要注意的是,两个tomcat中都需要配置这个,但是Cluster中Receiver节点中的port属性值不能一样,防止端口冲突。

我们将其中一个tomcat的此属性设置为4001:

然后在部署在2个tomcat的测试项目中的web.xml文件中加入<distributable />节点:

其实这些配置在上面给的的官网截图中已有描述了。

配置完毕。

重启两个tomcat服务器。

现在来测试。

打开页面如下:

现在输入名称和值,点击提交,页面如下:

现在我们把端口号为9090的Tomcat服务器关闭,模拟服务器宕机的情况。

再输入名称和值(名称跟前一次不要一样),点击提交,页面如下:

我们发现在9090tomcat添加的值在8080中依然存在,证明在9090中创建的Session在8080中也复制了一份,所以出现这种情况。

故,至此,我们实现了Tomcat集群。

猜你喜欢

转载自my.oschina.net/u/2608182/blog/1542983
今日推荐