一.Nginx負載均衡實作原理
1.1反向代理原理

1.2反向代理的概念
- 反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網路上的服務器,并將從服務器上得到的結果回傳給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器,
- 反向代理是為服務端服務的,反向代理可以幫助服務器接收來自客戶端的請求,幫助服務器做請求轉發,負載均衡等,
- 反向代理對服務端是透明的,對我們是非透明的,即我們并不知道自己訪問的是代理服務器,而服務器知道反向代理在為他服務,
1.3反向代理的優勢
反向代理的優勢:
- 隱藏真實服務器;
- 負載均衡便于橫向擴充后端動態服務;
- 動靜分離,提升系統健壯性;
1.4Nginx四層反向代理和七層反向代理
- 四層反向代理:是基于IP+PORT(TCP/UDP埠)轉發
- 七層反向代理:基于http,https,mail代理轉發
二、Nginx動靜分離實作原理
2.1動靜分離的概念
動靜分離是指在 web 服務器架構中,將靜態頁面與動態頁面或者靜態內容介面和動態內容介面分開不同系統訪問的架構設計方法,進而提示整個服務的訪問性和可維護性,
2.2動靜分離的原理
服務端接收來自客戶端的請求中,既有靜態資源也有動態資源,靜態資源由Nginx提供服務,動態資源Nginx轉發至后端,
2.3Nginx 靜態處理優勢
- Nginx處理靜態頁面的效率遠高于Tomcat的處理能力
- 若Tomcat的請求量為1000次,則Nginx的請求量為6000次
- Tomcat每秒的吞吐量為0.6M,Nginx的每秒吞吐量為3.6M
- Nginx處理靜態資源的能力是Tomcat處理的6倍
三、Nginx負載均衡調度演算法(6種)
3.1輪詢(默認)
每個請求按時間順序逐一分配到不同的后端服務器,如果超過了最大失敗次數后(max_fails,默認1),在失效時間內(fail_timeout,默認10秒),該節點失效權重變為0,超過失效時間后,則恢復正常,或者全部節點都為down后, 那么將所有節點都恢復為有效繼續探測,一般來說rr可以根據權重來進行均勻分配,
3.2加權輪訓
weight的值越大分配到的權限概率越高,主要用于后端每臺服務器性能不均勻情況,或者僅僅為在主從情況下設定不同的權重值,達到合理利用主機資源
3.3least_conn最少連接
優先將客 戶端請求調度到當前連接最少的服務器,
3.4ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器, 可以解決session(會話狀態)的問題,但是ip_hash會造成負載不均,有的服務請求接受多,有的服務請求接受少,所以不建議采用ip_hash模式
補充: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服務器集群等場景都需要用到、多子服務,
3.5fair(第三方)
按后端服務器的回應時間來分配請求,回應時間短的優先分配,
3.6url_hash(第三方)
和ip hash演算法類似,是對每個請求按url的hash結果分配,使每個URL定向到同一個后端服務器, 但是也會造成分配不均的問題, 這種模式后端服務器為快取時比較好,
四、Nginx+Tomcat負載均衡、動靜分離的操作步驟
4.1準備三臺服務器,Nginx作為負載均衡器,Tomcat作為應用服務器
Nginx 服務器:192.168.10.30:80
Tomcat服務器1:192.168.10.20:80
Tomcat服務器2:192.168.10.10:8080 192.168.10.10:8081
4.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
4.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/java/jdk1.8.0_201-amd64 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar 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.4動靜分離配置
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> </head> <body> <% out.println("動態頁面 1,Tomcat1");%> </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
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> </head> <body> <% out.println("動態頁面 2,Tomcat2中的實體1");%> </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> </head> <body> <% out.println("動態頁面 3,Tomcat2中的實體2");%> </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
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.116.70:8080 weight=1; server 192.168.116.120:8080 weight=1; server 192.168.116.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; } ...... } ...... }
4.5測驗效果
測驗靜態頁面效果
瀏覽器訪問 http://192.168.10.30/
瀏覽器訪問 http://192.168.10.30/pic.jpg
測驗負載均衡效果,不斷重繪瀏覽器測驗
瀏覽器訪問 http://192.168.10.30/index.jsp
五、實體操作:Nginx+Tomcat負載均衡、動靜分離
5.1準備好Nginx服務器(192.168.2.66)




![]()



5.2準備好tomcat服務器1(192.168.2.105:8080)
![]()


![]()



5.3準備好Tomcat服務器2(兩個實體):192.168.2.200:8080 192.168.2.200:8081——參照此篇文章參考上一篇Tomcat多實體部署


5.4動靜分離Tomcat1 server 配置
(1)配置Tomcat1的動態網頁顯示內容

(2)添加新的host內容
![]()

(3)重啟服務

5.5Tomcat2 server 配置(實體1)
(1)創建Tomcat實體1的網頁測驗目錄test和測驗網頁檔案

(2)Tomcat實體1主配置洗掉前面的 HOST 配置,添加新的HOST配置

(3)重啟服務


5.6Tomcat2 server 配置(實體2)
(1)創建Tomcat實體2的網頁測驗目錄test和測驗網頁檔案

(2)Tomcat實體2主配置洗掉前面的 HOST 配置,添加新的HOST配置

(3)重啟服務

5.7Nginx server 配置(192.168.10.10)
(1)準備網頁顯示相關內容

(2)修改主組態檔——七層轉發配置
![]()

(3)重啟服務

5.8使用win10客戶端在瀏覽器中進行測驗,動態頁面測驗進行不斷重繪即可
測驗靜態頁面效果
瀏覽器訪問 http://192.168.10.10/
瀏覽器訪問 http://192.168.10.10/1.jpeg
測驗負載均衡效果,不斷重繪瀏覽器測驗
瀏覽器訪問 http://192.168.10.10/index.jsp
(1)測驗靜態頁面效果


(2)測驗負載均衡效果,不斷重繪瀏覽器測驗
測驗未完,,,,待補充
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/536042.html
標籤:其他
上一篇:Tomcat多實體部署
下一篇:針對某客服系統的組合攻擊
