1. 程式人生 > 其它 >Nginx+Tomcat負載均衡、動靜分離叢集

Nginx+Tomcat負載均衡、動靜分離叢集

Nginx負載均衡

Nginx負載均衡通過反向代理實現

可以這樣理解:

正向代理是代理客戶端,反向代理是代理伺服器

反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。

反向代理是為服務端服務的,反向代理可以幫助伺服器接收來自客戶端的請求,幫助伺服器做請求轉發,負載均衡等。

反向代理對服務端是透明的,對我們是非透明的,即我們並不知道自己訪問的是代理伺服器,而伺服器知道反向代理在為他服務。

Nginx動靜分離

動靜分離是指在web伺服器架構中,將靜態頁面與動態頁面或者靜態內容介面和動態內容介面分開不同系統訪問的架構設計方法,進而提示整個服務的訪問性和可維護性。

Nginx負載均衡模式:

  • rr負載均衡模式:
    • 每個請求按時間順序逐一分配到不同的後端伺服器,如果超過了最大失敗次數後(max_fails,預設1) ,在失效時間內(fail_timeout,預設10秒),該節點失效權重變為0,超過失效時間後,則恢復正常,或者全部節點都為down後,那麼將所有節點都恢復為有效繼續探測,一般來說rr可以根據權重來進行均勻分配。
  • least_conn最少連線:
    • 優先將客戶端請求排程到當前連線最少的伺服器。
  • ip_hash負載均衡模式:
    • 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題,但是iphash會造成負載不均,有的服務請求接受多,有的服務請求接受少,所以不建議採用ip_hash模式, session共享問題可用後端服務的session共享代替nginx的ip_hash
  • fair (第三方)負載均衡模式:
    • 按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
  • url_hash (第三方)負載均衡模式:
    • 和ip_hash演算法類似,是對每個請求按url的hash結果分配,使每個URL定向到同一個後端伺服器,但是也會造成分配不均的問題,這種模式後端伺服器為快取時比較好。

session的概念

session共享問題可用後端服務的session共享代替nginx的ip_hash。ip_hash無法作用於四層反向代理,配置需要將其他模式刪除例如weight刪掉然後直接在加上

Session又稱為會話狀態,是Web系統中最常用的狀態,用於維護和當前瀏覽器例項相關的一些資訊。我們控制使用者去許可權中經常用到Session來儲存使用者狀態

session其實分為客戶端Session和伺服器端Session。

當用戶首次與Web伺服器建立連線的時候,伺服器會給使用者分發一個 SessionID作為標識。SessionID是一個由24個字元組成的隨機字串。使用者每次提交頁面,瀏覽器都會把這個SessionID包含在 HTTP頭中提交給Web伺服器,這樣Web伺服器就能區分當前請求頁面的是哪一個客戶端。這個SessionID就是儲存在客戶端的,屬於客戶端Session。

其實客戶端Session預設是以cookie的形式來儲存的,所以當用戶禁用了cookie的話,伺服器端就得不到SessionID。這時我們可以使用url的方式來儲存客戶端Session。也就是將SessionID直接寫在了url中,當然這種方法不常用。

Session共享:指在一個瀏覽器對應多個Web服務時,服務端的Session資料需要共享。例如單點登入、Web伺服器叢集等場景都需要用到、多子服務。

--------Nginx+Tomcat負載均衡、動靜分離--------

1、準備三臺伺服器

Nginx 伺服器:192.168.73.18:80
Tomcat伺服器1:192.168.73.28:80
Tomcat伺服器2:192.168.73.38:8080 192.168.73.38:8081

2、部署Nginx 負載均衡器

systemctl stop firewalld
setenforce 0
 
yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
 
useradd -M -s /sbin/nologin nginx
 
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
 
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-file-aio \                                #啟用檔案修改支援
--with-http_stub_status_module \                              #啟用狀態統計
--with-http_gzip_static_module \                             #啟用 gzip靜態壓縮
--with-http_flv_module \                            #啟用 flv模組,提供對 flv 視訊的偽流支援
--with-http_ssl_module                              #啟用 SSL模組,提供SSL加密功能
----------------------------------------------------------------------------------------------------------
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module
 
 
make && make install
 
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
 
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
 
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

  

3、部署2臺Tomcat 應用伺服器

systemctl stop firewalld
setenforce 0
 
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
 
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
 
source /etc/profile.d/java.sh
 
tar zxvf apache-tomcat-8.5.16.tar.gz
 
mv /opt/apache-tomcat-8.5.16/ /usr/local/tomcat
 
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
 
netstat -ntap | grep 8080

  

4、動靜分離配置

(1)Tomcat1 server 配置

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   #指定為 test1 頁面
</head>
<body>
<% out.println("動態頁面 1,http://www.test1.com");%>
</body>
</html>

  

vim /usr/local/tomcat/conf/server.xml
#由於主機名 name 配置都為 localhost,需要刪除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
    </Context>
</Host>
 
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

  

(2)Tomcat2 server 配置

mkdir /usr/local/tomcat/tomcat1/webapps/test /usr/local/tomcat/tomcat2/webapps/test
 
vim /usr/local/tomcat/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>   #指定為 test2 頁面
</head>
<body>
<% out.println("動態頁面 2,http://www.test2.com");%>
</body>
</html>
 
vim /usr/local/tomcat/tomcat1/conf/server.xml
#刪除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>
 
/usr/local/tomcat/tomcat1/bin/shutdown.sh
/usr/local/tomcat/tomcat1/bin/startup.sh
 
vim /usr/local/tomcat/tomcat2/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title>   #指定為 test3 頁面
</head>
<body>
<% out.println("動態頁面 3,http://www.test3.com");%>
</body>
</html>
 
vim /usr/local/tomcat/tomcat2/conf/server.xml
#刪除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
</Host>
 
/usr/local/tomcat/tomcat2/bin/shutdown.sh
/usr/local/tomcat/tomcat2/bin/startup.sh

  

(3)Nginx server 配置

#準備靜態頁面和靜態圖片
echo '<html><body><h1>這是靜態頁面</h1></body></html>' > /usr/local/nginx/html/index.html
mkdir /usr/local/nginx/html/img
cp /root/game.jpg /usr/local/nginx/html/img
 
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
    #gzip on;
     
    #配置負載均衡的伺服器列表,weight引數表示權重,權重越高,被分配到的概率越大
    upstream tomcat_server {
        server 192.168.73.80:8080 weight=1;
        server 192.168.73.120:8080 weight=1;
        server 192.168.73.120:8081 weight=1;
    }
     
    server {
        listen 80;
        server_name www.kgc.com;
     
        charset utf-8;
     
        #access_log logs/host.access.log main;
         
        #配置Nginx處理動態頁面請求,將 .jsp檔案請求轉發到Tomcat 伺服器處理
        location ~ .*\.jsp$ {
            proxy_pass http://tomcat_server;
#設定後端的Web伺服器可以獲取遠端客戶端的真實IP
##設定後端的Web伺服器接收到的請求訪問的主機名(域名或IP、埠),預設HOST的值為proxy_pass指令設定的主機名。如果反向代理伺服器不重寫該請求頭的話,那麼後端真實伺服器在處理時會認為所有的請求都來在反向代理伺服器,如果後端有防攻擊策略的話,那麼機器就被封掉了。
            proxy_set_header HOST $host;
##把$remote_addr賦值給X-Real-IP,來獲取源IP
            proxy_set_header X-Real-IP $remote_addr;
##在nginx 作為代理伺服器時,設定的IP列表,會把經過的機器ip,代理機器ip都記錄下來
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
         
        #配置Nginx處理靜態圖片請求
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
            root /usr/local/nginx/html/img;
            expires 10d;
        }
         
        location / {
            root html;
            index index.html index.htm;
        }
......
    }
......
}

  

5、測試效果

測試靜態頁面效果
瀏覽器訪問 http://192.168.73.18/
瀏覽器訪問 http://192.168.73.18/meme.jpg

測試負載均衡效果,不斷重新整理瀏覽器測試
瀏覽器訪問 http://192.168.73.18/index.jsp