1. 程式人生 > >Squid正向代理矩陣

Squid正向代理矩陣

簡介:
squid是很老的代理軟體,功能齊全可以做正向和反向代理。目前反向代理市場已經被nginx和varnish佔據了主導地位,不過依然是正向代理的霸主。本文介紹如何利用squid的子節點和父節點配置組成一個代理矩陣。代理矩陣在普通場景很少使用。應用的場景主要是需要大量快取的地方,如運營商為了減少網間結算費用設定了很多代理來快取使用者訪問的網頁靜態頁面、視訊、下載的檔案等。然而一臺伺服器從效能和儲存空間來看都無法支撐起那麼龐大的使用者訪問,所以就有了代理叢集的概念。本文將介紹如何配置一個代理矩陣的叢集和工作原理。
原理:
Squid正向代理矩陣
上圖分為三個組成部分。公網、第一層代理、第二層代理。
公網就是下面第一層代理可以直接訪問到公網的鏈路,第一層代理的伺服器每臺都有自己的公網鏈路訪問公網資源。第二層代理只能通過第一層代理才能訪問到公網資源。
第二層代理的下方就是正常的普通使用者群。
當用戶上網的時候會通過第二層代理獲取資源,比如訪問百度。使用者訪問的資料包將經過閘道器,閘道器會把80埠做重定向處理資料包將給到代理上去做響應。這個稱為透明代理配置,使用者無感知,使用者也不需要做任何的配置。代理二層伺服器接受到請求以後會檢索本機的快取內容:
1、發現快取內容,直接取出內容返回給使用者。
2、沒有快取內容,查詢兄弟節點同級代理。(這裡二級代理一般是區縣市的伺服器,所以基本是沒有內網互聯的,這種不會配置兄弟節點。二級代理中間的黑線一般不存在,squid2-1到squid2-4之間互相不知道對方的存在。圖畫出來只是告訴大家可以這麼配置)
3、沒有快取內容,查詢父節點上層代理。(這個地方一般是配置所有上級代理,查詢的方式是輪訓,也可以通過配置使用域名等方式指定訪問上級代理)
4、一級代理檢查本機快取,如果有內容直接返回給二級代理。二級代理根據策略決定是否快取結果,然後返回給使用者。
5、一級代理沒有快取內容,將查詢同級的子節點,如果有直接返回二級代理。
6、一級代理子節點沒有內容,伺服器會去公網獲取內容根據策略決定是否快取,然後返回給二級代理。
整個流程大概就是這樣,其中訪問的路徑和策略全部可以通過squid的配置進行設定。
配置案例:
這是一個整體解決方案,其中配置比較繁雜所以拆開來講比較容易一些。
透明代理配置:
如果是linux作為路由,其它所有的主機預設路由都指向了這個linux主機。squid代理在本機安裝,那麼可以通過iptables進行配置。iptables -t nat -A PREROUTING -p tcp -s 192.168.2.0/27 -d 0.0.0.0/0 --dport 80 -i ens192 -j REDIRECT --to-ports 3128。本機需要開啟資料包轉發功能。
eth0為連結使用者端的網絡卡 -s為本地使用者子網,REDIRECT squid的監聽埠。這樣使用者就能無感知的情況下使用代理了。
如果squid代理不是在本機,那麼無法使用REDIRECT。 iptables -A PREROUTING -t nat -s 192.168.4.11/32 -p tcp --dport 80 -j DNAT --to 192.168.4.10:3128
如果是其它閘道器,請根據資料包重定向的原理進行配置。
透明代理應用場景是靠近使用者端的網頁加速,可以起到提高網速訪問的目的。網頁開啟的速度會比平時快很多,因為大部分的靜態內容都快取到了離使用者最近的主機上,只有一些動態內容需要回源訪問。
代理矩陣配置:
代理與代理之間有兩種關係,1、兄弟代理,2、父代理。關鍵字對應sibling、parent。
兄弟代理的作用是和同級代理之間組成快取陣列來分攤請求和快取內容。根據策略就能把相關內容分配到不同的主機上儲存。
父代理的作用是為下級代理提供快速響應。
如上圖所示的結構,二級代理沒有直接出口公網的地址。它們只是複雜網路中更加靠近使用者的代理,比如通過一級代理來獲得網路資源。
父代理的配置例項:cache_peer 172.21.5.57 parent 3128 0 round-robin IP地址為上層代理的地址,parent為代理型別,3128上層代理埠 0 icp_port埠,如果沒有配置為0 round-robin相對於其他代理而言輪訓的型別。
兄弟代理的配置例項:cache_peer 172.21.5.57 sibling 3128 3129 round-robin 基本和parent節點一樣。
更多更加詳細的配置請參閱網站內容:

http://www.phpfans.net/manu/Squid/ squid中文權威指南
爬蟲代理例項:
首先在下面的節點安裝好squid代理。例項中沒有用到兄弟代理的相關配置,下面節點的squid只做了簡單的允許訪問的配置。
中心節點做為二級代理存在,訪問節點的父級代理,主要配置大概如下。
#cache_peer 172.21.5.241 parent 3128 0 round-robin
#cache_peer 172.21.5.29 parent 3128 0 round-robin
#cache_peer 172.21.5.65 parent 3128 0 round-robin
cache_peer 172.21.5.57 parent 3128 0 round-robin
#cache_peer 172.21.7.73 parent 3128 0 round-robin
cache_peer 172.21.5.21 parent 3128 0 round-robin
這裡配置了一批節點作為父級代理,通過這個代理訪問的請求都將按照squid內部策略把訪問轉發到某個父級代理上。
因為每個父級代理可能不是非常穩定,所以需要有一個檢測指令碼來負責對父級代理進行檢測。開啟和關閉父級代理配置。
#!/bin/bash
. /etc/profile
cd dirname $0

for ip in cat proxy_ip
do
curl -x $ip:3128 --max-time 20 www.baidu.com > /dev/null
if [ $? -gt 0 ];then
[ -f /etc/squid/squid.conf ] && sed "s/^cache_peer $ip parent 3128 0 round-robin/#&/" -i /etc/squid/squid.conf
else
[ -f /etc/squid/squid.conf ] && sed "s/^#(cache_peer $ip parent 3128 0 round-robin)/\1/" -i /etc/squid/squid.conf
fi
done
service squid reload
檔案proxy_ip內容
172.21.5.241
172.21.5.29
172.21.5.65
172.21.5.57
172.21.7.73
172.21.7.121
172.21.5.21
然後執行這個指令碼,新增到計劃任務以後就能通過指令碼定期檢測車站代理的可用性,是否能訪問到百度的網頁。如果無法訪問時將會自動剔除掉,當下次又能訪問時再次開啟。指令碼每次執行完都會過載配置檔案使其生效。
如果有新的節點加入,只需要在節點上安裝好squid,然後把相應的IP地址新增進去就行了。