一、反向代理兩種模式
四層反向代理
基于四層的ip+tcp/upd端口的代理
他是http塊同一級,一般配置在http塊上面。
他是需要用到stream模塊的,一般四層里面沒有自帶,需要編譯安裝一下。并在stream模塊里面添加upstream +服務器名稱,添加ip地址及端口號。定義server模塊,里面添加listen 監聽端口號,server_name 網站主機名,proxy_pass 服務器組名稱。stream{? upstream fuwu服務器名稱{? server IP1:PORT;? server IP2:PORT;? server IP3:PORT;? ........? }? server{? listen 監聽端口;? server_name 網站主機名; ? proxy_pass 服務器組名稱;? }}
七層反向代理
基于七層的http/https/mail等應用協議的代理
他是在http模塊里面添加以upstream模塊,在upstream里面定義服務器組名稱,添加ip,端口號,權重(如果不添加的話,默認是1),可以在添加一個調度算法。并在http模塊里面添加server模塊,在里面用location來匹配URL路徑,定義proxy_pass http://服務器組名稱,用來將以。。。為結尾的請求轉發給tomcat服務器集群。并且后端服務器需要獲取真實的客戶端的ip地址。
http{? upstream 服務器組名稱{? server IP1:PORT [weight=1 ...];? server IP2:PORT;? ..........? 調度算法(rr輪詢/加權輪詢,least_conn最小連接,ip_hash,url_hash,faire);}? server {? location ~ ...{? #將以***為結尾的請求轉發給tomcat服務器集群? proxy_pass http://服務器組名稱; ? #用于后端服務器獲取真實的客戶端ip地址? proxy_set_header HOST $host;? proxy_set_header X-Real-IP $remote_addr;? proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;? }? }}
Nginx 負載均衡模式(調度算法)
●rr 輪詢 負載均衡模式:
每個請求按時間順序逐一分配到不同的后端服務器,如果超過了最大失敗次數后(max_fails,默認1),在失效時間內(fail_timeout,默認10秒),該節點失效權重變為0,超過失效時間后,則恢復正常,或者全部節點都為down后,那么將所有節點都恢復為有效繼續探測,一般來說rr可以根據權重來進行均勻分配。
?
●加權輪詢 WRR :
?
weight的值越大分配到的訪問概率越高,主要用于后端每臺服務器性能不均衡的情況下。或者僅僅為在主從的情況下設置不同的權值,達到合理有效的地利用主機資源。
?
●least_conn 最少連接:
優先將客戶端請求調度到當前連接最少的服務器。
?
●ip_hash 負載均衡模式:
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題,但是ip_hash會造成負載不均,有的服務請求接受多,有的服務請求接受少,所以不建議采用ip_hash模式,session 共享問題可用后端服務的 session 共享代替 nginx 的 ip_hash(使用后端服務器自身通過相關機制保持session同步)。
?
●fair(第三方)負載均衡模式:
按后端服務器的響應時間來分配請求,響應時間短的優先分配。
?
●url_hash(第三方)負載均衡模式:
基于用戶請求的uri做hash。和ip_hash算法類似,是對每個請求按url的hash結果分配,使每個URL定向到同一個后端服務器,但是也會造成分配不均的問題,這種模式后端服務器為緩存時比較好
nginx的會話保持
## 1.ip_hash,url_hash
基于ip緩存或者url路徑的緩存來進行的
ip_hash簡單易用,但有如下問題:
?
- 當后端服務器宕機后,session會丟失;
- 來自同一局域網的客戶端會被轉發到同一個后端服務器,可能導致負載失衡;
- 不適用于CDN網絡,不適用于前段還有代理的情況。
?
## 2.sticky_cookie_insert
基于客戶端的cookie緩存來進行
?
使用sticky_cookie_insert啟用會話親緣關系,這會導致來自同一客戶端的請求被傳遞到一組服務器在同一臺服務器。與ip_hash不同之處在于,它不是基于IP來判斷客戶端的,而是基于cookie來判斷。因此可以避免上述ip_hash中來自同一局域網的客戶端和前段代理導致負載失衡的情況。
?
說明:
?
- expires:設置瀏覽器中保持cookie的時間
- domain:定義cookie的域
- path:為cookie定義路徑
?
## 3.后端服務器做session共享,來實現會話保持
使用動靜分離的原因
nginx比較擅長處理靜態頁面,其效率是tomcat的6倍左右,但是nginx不善于處理動態頁面。 而tomcat 更擅長處理動態頁面。
靜態頁面內容相對穩定,容易被檢索,同時,由于用戶瀏覽是不需要經過程序的處理,所以瀏覽速度最快。但是,制作和維護工作量比較大。
當網站內容更新頻繁時訪問量非常大,內容變動頻繁時,就需要使用動態。但是動態頁面需要訪問數據庫,當訪問量非常大,對程序需要處理的數據量就非常大,容易造成網站不穩定甚至癱瘓
因此,我們需要使用動靜分離來管理網站。
為什么使用負載均衡
動態網站的頁面上的信息都必須從數據庫中讀取,每打開一個頁面就讀取數據庫一次,如果訪問網站的人數很多,這會對服務器增加很大的荷載,從而影響這個網站的運行速度。所以,我們可以利用負載均衡集群,降低服務器的負載。
正向代理和反向代理的區別
## 正向代理是一個`位于客戶端和目標服務器之間的服務器`,為了從目標服務器取得內容,客戶端向代理發送一個請求并指定目標服務器,然后代理向目標服務器轉交請求并將獲得的內容返回給客戶端。`代理服務器和客戶端處于同一個局域網內。比如說我要訪問谷歌,于是我就告訴它讓它幫我轉發。 ? ## 反向代理實際運行方式是代理服務器接受網絡上的連接請求。它將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給網絡上請求連接的客戶端 。代理服務器和目標服務器處于同一個局域網內。比如說我要訪問taobao,對我來說不知道圖片、json、css 是不是同一個服務器返回回來的,但是我不關心,是反向代理 處理的,我不知道目標服務器。
二、實例部署?(七層反向代理和四層反向代理結合)
實驗準備(準備五臺虛擬機)
提前安裝nginx和tomcat
192.168.50.52? ?tomcat (兩個)
192.168.50.53? ?tomcat
192.168.50.56? ?七層反向代理(nginx)
192.168.50.58? ?七層反向代理(nginx)
192.168.50.57? ?四層反向代理(nginx)
?解壓安裝包
192.168.50.52cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.16 /usr/local/tomcat/tomcat1
cp -a /usr/local/tomcat/tomcat1 /usr/local/tomcat/tomcat2
?配置 tomcat 環境變量
vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat/tomcat1
export CATALINA_BASE1=/usr/local/tomcat/tomcat1
export TOMCAT_HOME1=/usr/local/tomcat/tomcat1#tomcat2
export CATALINA_HOME2=/usr/local/tomcat/tomcat2
export CATALINA_BASE2=/usr/local/tomcat/tomcat2
export TOMCAT_HOME2=/usr/local/tomcat/tomcat2source /etc/profile.d/tomcat.sh
修改 tomcat2 中的 server.xml 文件,要求各 tomcat 實例配置不能有重復的端口號
vim /usr/local/tomcat/tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN"> #22行,修改Server prot,默認為8005 -> 修改為8006
<Connector port="8081" protocol="HTTP/1.1" #69行,修改Connector port,HTTP/1.1 默認為8080 -> 修改為8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />
#116行,修改Connector port AJP/1.3,默認為8009 -> 修改為8010
修改各 tomcat 實例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 環境變量
vim /usr/local/tomcat/tomcat1/bin/startup.sh
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下內容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1vim /usr/local/tomcat/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1vim /usr/local/tomcat/tomcat2/bin/startup.sh
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2vim /usr/local/tomcat/tomcat2/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
?啟動各 tomcat 中的 /bin/startup.sh?
/usr/local/tomcat/tomcat1/bin/startup.sh
/usr/local/tomcat/tomcat2/bin/startup.sh netstat -natp | grep java
部署192.168.50.52的tomcat server?
mkdir /usr/local/tomcat/tomcat1/webapps/qinvim /usr/local/tomcat/tomcat1/webapps/qin/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP feng page</title> #指定為 test2 頁面
</head>
<body>
<% out.println("動態頁面 1,mylove2);%>
</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/qin" path="" reloadable="true" />
</Host>
?
/usr/local/tomcat/tomcat1/bin/shutdown.sh?
/usr/local/tomcat/tomcat1/bin/startup.sh?
mkdir /usr/local/tomcat/tomcat2/webapps/fengvim /usr/local/tomcat/tomcat2/webapps/feng/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP feng page</title> #指定為 test2 頁面
</head>
<body>
<% out.println("動態頁面 2,mylove3);%>
</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/feng" path="" reloadable="true" />
</Host>
?
/usr/local/tomcat/tomcat2/bin/shutdown.sh?
/usr/local/tomcat/tomcat2/bin/startup.sh??
?部署192.168.50.53的tomcat server?
mkdir /usr/local/tomcat/webapps/qin1vim /usr/local/tomcat/webapps/qin1/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP feng page</title> #指定為 test2 頁面
</head>
<body>
<% out.println("動態頁面 1,mylove);%>
</body>
</html>
??vim /usr/local/tomcat/conf/server.xml
#刪除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
?? ?<Context docBase="/usr/local/tomcat/webapps/qin1" path="" reloadable="true" />
</Host>
?
/usr/local/tomcat/bin/shutdown.sh?
/usr/local/tomcat/bin/startup.sh??
?部署192.168.50.56? ?七層反向代理Nginx server
#準備靜態頁面和靜態圖片
cd /usr/local/nginx/html
vim love.html
<html> <body> <h1>this is nginx test web</h1><img src="love.jpg" /></body>
</html>
vim /usr/local/nginx/conf/nginx.conf
......
http {
......#gzip on;#配置負載均衡的服務器列表,weight參數表示權重,權重越高,被分配到的概率越大upstream tomcat_server {server 192.168.50.53:8080 weight=1;server 192.168.50.52:8080 weight=1;server 192.168.50.52:8081 weight=1;}server {listen 80;server_name localhost;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,來獲取源IPproxy_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 html;expires 10d;}location / {root html;index index.html index.htm;}
......}
......
}
?部署192.168.50.58? ?七層反向代理Nginx server
<html><body><h1>this is nginx test2 web</h1><img src="psc.jpg" /></body>
</html>
vim /usr/local/nginx/conf/nginx.confupstream tomcat_server {server 192.168.50.53:8080 weight=1;server 192.168.50.52:8080 weight=1;server 192.168.50.52:8081 weight=1;}server {listen 80;server_name localhost;charset utf-8;#charset koi8-r;#access_log logs/host.access.log main;location ~ .*\.jsp$ {proxy_pass http://tomcat_server;proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root html;expires 10d;}
??部署192.168.50.57? ?四層反向代理(nginx)
vim /usr/local/nginx/conf/nginx.confstream {upstream appserver {server 192.168.50.56:80;server 192.168.50.58:80;}server {listen 8080;proxy_pass appserver;}
}
瀏覽器訪問測試
http://192.168.50.52:8080
http://192.168.50.52:8081?
http://192.168.50.57:8080/love.html
?刷新頁面
?http://192.168.50.57:8080/index.jsp