使用Nginx和Tomcat來作負載均衡與集羣(垂直集羣)

參考博客:html

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

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

Nginx官方網站:http://nginx.org/http://nginx.org/web

Tomcat集羣配置官方文檔:http://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.htmlapache

環境:

JDK 1.7.0_80windows

Tomcat 8.0.35(準備2個,分別拷貝在不一樣目錄下便可)瀏覽器

Nginx 1.12.1tomcat

windows10服務器

下載安裝Nginx服務器

JDK和Tomcat的安裝就不說了。session

在官網上下載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集羣。

相關文章
相關標籤/搜索