前言:
本系列文章的目的,在於記錄下來本人本次實現Nginx+Tomcat+Redis實現負載均衡,tomcat集羣並同時解決Session共享整個流程的攻堅細節。在這個過程中也在網上搜索了許多資料,但是發現許多資料都不完全,有許多遺漏,學習使用起來會碰到許多錯誤卻沒有解決辦法。秉着一個交流學習的原則,這次我將從Java的JDK安裝起到整個集羣的實現,將每一個細節點都記錄下來。使學習者通俗易懂,大家都能跟着步驟一步步搭建併成功運行。
PS:本次搭建是在Win環境下實現,後續本人將在Linux環境下搭建運行,並仍會寫成博客記錄下來。
一、環境配置
測試環境是基於WinServer 2012 R2,tomcat、nginx的配置如下
二、Tomcat7配置
1、tomcat7下載(本次搭建我使用的版本如上表格所示,是7.0.81)
2、修改tomcat的server.xml
修改 tomcat解壓路徑\conf\server.xml配置文件下的三個參數(防止端口衝突,tomcat啓動失敗)
<!-- 8081tomcat的端口配置 -->
<Server shutdown="SHUTDOWN" port="8005">
<Connector port="8081" redirectPort="8443" connectionTimeout="20000" protocol="HTTP/1.1"/>
<Connector port="8009" redirectPort="8443" protocol="AJP/1.3"/>
<!-- 8082tomcat的端口配置 -->
<Server shutdown="SHUTDOWN" port="8006">
<Connector port="8082" redirectPort="8443" connectionTimeout="20000" protocol="HTTP/1.1"/>
<Connector port="8010" redirectPort="8443" protocol="AJP/1.3"/>
3、啓動兩個tomcat
三、Nginx的安裝與啓動
1、Nginx下載(本次搭建我使用的版本如上表格所示,是1.12.1)
登陸Nginx官網下載一個Nginx 地址:http://nginx.org/en/download.html
2、解壓下載下來的nginx-1.12.1.zip文件
3、開啓Nginx,此處有兩種方式
1)進入文件目錄 ...\nginx\nginx-1.12.1,雙擊 nginx.exe 文件
2)使用命令模式
4、進行第三步驟後,可發現有個窗口一閃而過。而查看進程卻沒有nginx.exe存在,說明nginx啓動失敗。失敗原因查詢可見如下博文
ngnix啓動失敗:http://blog.csdn.net/xie_xiansheng/article/details/78028051
Nginx啓動成功後,可以在任務管理器裏看到如下兩個進程
四、Nginx負載均衡配置
1、nginx.config配置文件簡介
我們進入解壓後的nginx文件,我的路徑如下:E:\tomcat7+jdk7+nginx\nginx\nginx-1.12.1\conf ,我們可以打開nginx.config文件,可以看到這樣一段配置
我們仔細分析一下:
1)listen:表示當前的代理服務器監聽的端口,默認監聽80端口。注意,如果我們配置了多個server,這個listen配置需要不同。
2)server_name:表示監聽到之後我們需要轉到哪個站點,默認是直接轉發到本地localhost
3)location:表示匹配的路徑,默認配置"/"表示所有的請求都被攔截匹配到這裏。location這裏可以使用正則表達式來過濾請求,使得動靜分離(靜態文件交由nginx處理,tomcat只處理動態文件如jsp)
4)root:配置了root時表示當匹配到這個location請求的路徑時,將會在這個文件夾內尋找相應的文件
5)index:當沒有指定主頁時,默認會選擇這個指定的文件,它可以有多個,並且按照配置的順序來加載。如果前一個不存在,則繼續向下尋找。
6)error_page:代表錯誤頁面
2、實現Nginx負載均衡的配置
1)在nginx.config文件的http內server外添加一個upstream,然後在server裏location內添加proxy_pass,使用http://+upstream的方式。
upstream myServer {
server 10.2.1.248:8081 weight=1 max_fails=1 fail_timeout=10s;
server 10.2.1.248:8082 weight=1 max_fails=1 fail_timeout=10s;
}
server {
listen 8080; #測試機80端口已經被佔用,所以監聽8080
server_name localhost;
location / {
proxy_pass http://myServer; #將upstream的myServer填寫下來
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
2)upstream配置詳解
從上面實例不難看出upstream中server指令語法如下:
server address [parameters]
server:必填。
address:也必選,可以是主機名、域名、ip或unix socket,也可以指定端口號。
parameters是可選參數,可以是如下參數:
down:表示當前server已停用
backup:表示當前server是備用服務器,只有其它非backup後端服務器都掛掉了或者很忙纔會分配到請求。
weight:表示當前server負載權重,權重越大被請求機率越大。默認是1.
max_fails和fail_timeout一般會關聯使用,如果某臺server在fail_timeout時間內出現了max_fails次連接失敗,那麼Nginx會認爲其已經掛掉了,從而在fail_timeout時間內不再去請求它,fail_timeout默認是10s,max_fails默認是1,即默認情況是隻要發生錯誤就認爲服務器掛掉了,如果將max_fails設置爲0,則表示取消這項檢查。
3、重啓nginx
使用命令模式,reload一下nginx的配置文件,重新啓動nginx。
五、負載均衡測試
1、編寫測試jsp頁面,覆蓋 E:\tomcat7+jdk7\tomcat7\apache-tomcat-7.0.81\webapps\ROOT 路徑下的index.jsp
2、或者直接複製代碼覆蓋index.jsp文件,測試代碼如下
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
sessionID:<%=session.getId()%>
<br>
SessionIP:<%=request.getServerName()%>
<br>
SessionPort:<%=request.getServerPort()%>
<%
//爲了區分,第二個可以是2222
out.println("This is Tomcat Server 1111");
%>
3、瀏覽器訪問localhost:8080,觀察到如下結果,說明負載均衡配置完成!
第一次訪問,訪問到的是tomcat_1,即端口號爲:8081的tomcat
第二次訪問,訪問到的是tomcat_2,即端口號爲:8082的tomcat