負載均衡:通過反向代理來實現
?正向代理的配置方法。
正向代理:
工作原理:用戶端直接訪問不了,需要通過代理服務器來訪問web服務器,用戶端先訪問代理服務器,再訪問web服務器。web服務器響應給代理服務器,代理服務器再響應給用戶端。web服務器看到的請求地址是代理服務i去的ip地址。代理服務器的例子:加速器、科學上網。
proxy_pass 配置代理服務器訪問的地址。只能寫在location模塊當中。
nginx的七層代理和四層代理
七層是最常用的反向代理方式,只能配置在nginx配置文件的http模塊中。
而且,配置方法名稱:upstream模塊,只能配置在http模塊中,但是不能寫在server中,也不能在location中。在http模塊當中是獨立的一個配置。
七層代理:七層代理的就是http請求和響應。
工作原理:
客戶端---->http請求----->七層代理(代理服務器上)------>代理服務器轉發http請求到內部的一組服務器(web集群)
---------->客戶端不知道請求的代理服務器還是內部服務器,而且通過代理服務器隱藏了內部服務器的ip
實際上訪問的是代理服務器,請求到代理服務器,代理服務器轉發給web服務器。web服務器響應。
配置方法:upstream模塊,只能配置在http模塊中,但是不能寫在server中,也不能在location中。在http模塊當中是獨立的一個配置。
四層代理:四層代理是基于tcp/ip協議層的代理轉發方式,可以實現基于ip地址和端口進行負載均衡轉發。
四層代理無法獲取http請求當中的URL信息,只能對tcp/udp數據包進行轉發。是一個流量轉發。
配置方法:stream模塊,是不能寫在http模塊中,配置在全局當中,是屬于一個獨立的模塊,不屬于其他任何模塊。
四層代理和七層代理之間的區別:
1、七層走的都是http請求,四層走的tcp/udp的數據包,轉發的是流量
七層代理,http請求,可以對請求進行深入的解析和處理,流量控制,內容的過濾
四層代理不能進行流量控制,也沒辦法對內容進行過濾。
四層代理通常適用于:需要處理大量連接請求的場景。
七層:對請求進行精確處理和控制的場景。
在實際工作中,四層和七層可以配合使用
2、四層和七層,誰的速度快
四層代理速度比七層代理速度快。
1、四層只是流量轉發,不能對請求進行解析和控制,所以速度快
2、四層代理走的是內核,內核轉發的流量,所以速度快。
1、七層慢,他對請求進行處理和解析,速度比較慢
2、七層走的是用戶態,訪問控制,流量處理,所以速度比較慢。
所以七層代理可以提供更高級的服務和更高的用戶體驗
正向代理實驗:指定61作為代理服務器,訪問62
主機1
進入nginx配置文件
添加proxy_pass http://192.168.233.62
?
主機2
進入nginx配置文件中,
配置index.html
this is ky 30
瀏覽器訪問192.168.233.61
反向代理:客戶端訪問代理服務器,代理服務器轉發請求或者流量到后端服務器,后端的web服務器會有多臺,用戶并不知道最終訪問的是哪一臺服務器。
特點:負載均衡,高可用,可擴展,可維護性
如何做反向代理/負載均衡?
upstream 和 stream
upstream:基于https實現負載均衡,反向代理。
小場景:并發量很小,默認算法就可以滿足使用條件。
如果后端web服務器的處理能力有差異:加權輪詢,和最小連接數配合使用
大型并發:ip_hash,或者url_hash。第一次請求之后,會有本地的緩存,而且因為hash算法的原因,請求的后臺web服務器不會發生變化,可以提高訪問速度,訪問的是緩存,減輕了后臺服務器的請求壓力。
反向代理就是負載均衡,如何做負載均衡需要看你的場景并發量,訪問人數有多少。根據這個指標,可以確定負載均衡的算法。
并發量小,選擇默認輪詢或者加權輪詢,配合最小連接數使用即可。
高并發:ip_hash或者url_hash來實現,訪問一次之后,就不會再切換后端web服務器,下一次訪問就是緩存,速度快,后臺web服務器,請求的壓力,也會變小。
反向代理的特點
1、http請求的負載均衡方式
2、沒有緩存
3、負載均衡算法:
(1)默認算法:輪詢 rr 請求輪流分配給后端服務器,輪詢算法使用與web服務器處理能力相近的情況,默認算法,可以不加。
upstream ky30 {
server 192.168.233.62;
server 192.168.233.63;
#指定通過代理服務器61,會把http的請求轉到62或者63上
}
(2)加權輪詢算法:建立在輪詢算法的基礎之上,通過給不同的web服務器權重,讓處理能力更強的服務器可以分配到更多的請求。雖然配置了權重值,但是輪詢的結果未必準確。
upstream ky30 {
server 192.168.233.62 weight=2;
server 192.168.233.63 weight=3;
#通過代理服務器61,轉發http請求時,會往權重高的服務器上,轉發的次數多,權重低,轉發的就少
#指定通過代理服務器61,會把http的請求轉到62或者63上
}
(3)ip-hash:根據ip地址計算出一個hash值,使用ip hash算法,同一個客戶端的請求會被分配到同一個后端服務器。保證會話的穩定性。如果后端服務器的數量發生變化,hash會被重新計算,請求的服務器也會發生變化。
vim nginx.conf
upstream ky30 {
ip_hash;
server 192.168.233.62;
server 192.168.233.63;
#指定通過代理服務器61,會把http的請求轉到62或者63上
}
(4)最少連接數:least_conn;輪詢,它會將請求發送到當前連接數最少的后端web服務器。適用于后端服務器處理任務耗時不同的情況,避免了所有請求集中在處理能力更強的后端服務器上。它會和加權輪詢配合使用。
vim nginx.conf
upstream ky30 {
least_conn;
server 192.168.233.62;
server 192.168.233.63;
#指定通過代理服務器61,會把http的請求轉到62或者63上
}
(5)url_hash:根據uri地址計算hash值,使用url_hash會把相同請求的uri會分配到同一個后端web服務器。
vim nginx.conf
upstream ky30 {
hash $request_uri consistent;
server 192.168.233.62;
server 192.168.233.63;
#指定通過代理服務器61,會把http的請求轉到62或者63上
}
主機1
upstream ky30 {
server www.kgc.com;
server www.benet.com;
#指定通過代理服務器61,會把http的請求轉到62或者63上
}
server的server_name www.test.com;
location后加上proxy_pass http://ky30
echo "192.168.233.61 www.test.com" >> /etc/hosts
主機2
server的server_name www.kgc.com;
echo "192.168.233.62 www.kgc.com" >> /etc/hosts
主機3
server的server_name www.benet.com
echo "192.168.233.63 www.benet.com" >> /etc/hosts
test1
echo "192.168.233.61 www.test.com" >> /etc/hosts
代理服務器1中
location模塊中
upstream ky30 {
server 192.168.233.62;
server 192.168.233.63;
#指定通過代理服務器61,會把http的請求轉到62或者63上
}
location中添加
proxy_pass http://ky30;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
虛擬機test1
四層轉發:
upstream就不要了
兩臺客戶機保持不變
stream全局模塊
stream{
upstream test {
server 192.168.233.62:80;
server 192.168.233.63:80;
}
server{
listen 8080; 和上面的server的端口不能一樣
proxy_pass test;
}
}
stream算法:
hash ip_hash rr 加權輪詢 最少連接數