參考博客: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服務器
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的集羣配置很是簡單,咱們來看看官網的文檔描述的配置步驟,
咱們須要在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集羣。