標籤:Proxy 伺服器 squid
Squid是一款類Unix系統下非常流行的伺服器軟體,其最重要的功能就是在用戶端和服務端之間建立緩衝。因而Squid可以用作反向 Proxy,部署多級緩衝或者搭建CDN等,無論名稱是什麼,本質上都是一樣的。目前Windows下也有Squid的移植版本,可以應對使用Windows環境的情境。這裡是和文檔,如果需要瞭解Squid技術細節可以看看《Squid: The Definitive Guide》這本書的翻譯版本。
一、安裝Squid
如果下載Binaries版本,直接解壓到c:\squid。這是軟體的預設安裝路徑,如果需要安裝到其他路徑下,則需要修改更多設定檔中關於路徑的配置項,另外安裝路徑不能有空格,官方建議設定檔中對於路徑的配置採用斜杠“/”代替“\”(由於類Unix系統使用“/”),即設定檔中對於路徑c:\squid應該寫成c:/squid。
接下來找到c:\squid\etc目錄,將cachemgr.conf.default,mime.conf.default,squid.conf.default三個檔案複製改為cachemgr.conf,mime.conf,squid.conf。這些是Squid設定檔,其中squid.conf則是基礎,後面的工作更多的是修改這個檔案。
在cmd中使用命令c:\squid\sbin\squid -i -n ServerName(當然可以將c:\squid\sbin加入系統的環境變數,以免輸入那麼長的命令路徑)。其中“ServerName”可以自訂,如果名稱中包含空格,請用使用雙引號。例如:c:\squid\sbin\squid -i -n "Server Name"。在cmd中隨時可以使用c:\squid\sbin\squid -h 查看關於命令參數的協助。
650) this.width=650;" style="background-image: none; border-right- 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M00/6B/E5/wKiom1U5jLeyF_CzAAGZZ1S2ewM966.jpg" width="671" height="201" />
對於預設的設定檔,我們先命令net start SquidProxy啟動Squid看看(SquidProxy是在安裝Squid服務時起的名字,在services.msc中可以查看),但是會出現一些問題,服務無法啟動,這是可以通過c:\squid\sbin\squid.exe.log和c:\squid\var\cache.log日誌查看出現的問題。
一般情況下是c:\squid\var\cache目錄沒有建立,可以手工在目錄下建立;或者swap directories沒有建立,可以使用命令c:\squid\sbin\squid -z建立。這時服務可以正常啟動了。
650) this.width=650;" style="background-image: none; border-right- 0px; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://s3.51cto.com/wyfs02/M01/6B/E5/wKiom1U5jLjww8SaAACoUDW1d1s560.jpg" width="669" height="100" />
二、配置Squid
接下裡主要配置c:\squid\etc\squid.conf這個檔案。強烈建議使用Notepad++等文本工具進行編輯(可以輕鬆高亮相同詞彙),以便減輕尋找的配置項的難度。
配置之前需要明確需求並搭建滿足該需求的網路環境,下面以配置Web反向 Proxy伺服器為例討論Squid的配置:該反向 Proxy伺服器將作為Web伺服器的代理和緩衝層,這裡假設外網地址為222.0.0.0/24(用戶端訪問),內網地址為172.16.0.0/24(用於Squid服務與Web網站之間或者Squid服務之間通訊,這裡用Squid服務和Web網站的提法,而不是Squid伺服器和Web伺服器,原因是一台伺服器上可能有多個Squid服務或Web網站,我們假設一台伺服器上只有一個Squid服務或Web網站)。
考慮有以下幾種情境:
情境1:單網站代理,Squid服務A(222.0.0.10, 172.16.0.10)為Web網站A(172.16.0.20)提供反向 Proxy服務,這是最簡單的情境,squid.conf配置關鍵項可以簡單如下:
#建立一個名稱為(all),用戶端地址(src)為任意(all)的存取控制清單(acl)。
acl all src all
#允許(allow)名稱為(all)的控制列表訪問Squid服務http_access allow all#設定80連接埠為Squid服務監聽用戶端訪問的連接埠
http_port 80
#建立一個名稱為(abc)的緩衝點,其上級(parent)為Web網站A(172.16.0.20:80),該Web網站是原始伺服器(originserver)cache_peer 172.16.0.20 parent 80 0 no-query originserver name=abc
情境2:多網站代理,Squid服務A(222.0.0.10, 172.16.0.10)為Web網站A(172.16.0.20)和Web網站B(172.16.0.30)同時提供反向 Proxy服務,假設Web網站A網域名稱www.a.com和Web網站B網域名稱www.b.com都指向222.0.0.10,squid.conf配置關鍵項如下:
#建立一個名稱為(aclweba),服務端網域名稱(dstdomain)為(www.a.com)的存取控制清單(acl)
acl aclweba dstdomain www.a.comacl aclwebb dstdomain www.b.com
#允許(allow)名稱為(aclweba)的存取控制清單訪問http_access allow aclweba http_access allow aclwebb
#設定80連接埠為Squid服務監聽用戶端訪問的連接埠,加速模式(vhost),將轉寄主機頭至後端伺服器http_port 80 vhost#建立一個名稱為(weba)的緩衝點,其上級(parent)為Web網站A(172.16.0.20:80),該Web網站是據伺服器(originserver)
cache_peer 172.16.0.20 parent 80 0 no-query originserver name=webacache_peer 172.16.0.30 parent 80 0 no-query originserver name=webb#將緩衝點(weba)限制為網域名稱(www.a.com)訪問,即使用www.a.com才能訪問Web網站A,有點IIS中主機頭名的意思
cache_peer_domain weba www.a.comcache_peer_domain webb www.b.com#允許(allow)名稱為(aclweba)的存取控制清單訪問緩衝點(weba)
cache_peer_access weba allow aclweba cache_peer_access webb allow aclwebb #設定緩衝使用記憶體大小cache_mem 1024 MB#設定儲存路徑,儲存格式(ufs),總緩衝大小(10240MB),一級緩衝(16MB),二級緩衝(253MB)
cache_dir ufs c:/squid/var/cache 10240 16 256
情境3:實現Web網站負載平衡,Squid服務A(222.0.0.10, 172.16.0.10)為部署在不同伺服器上的多個Web網站A:Web網站A1(172.16.0.20)和Web網站A2(172.16.0.30)提供反向 Proxy服務,實現負載平衡,假設Web網站A網域名稱www.a.com指向222.0.0.10,squid.conf配置關鍵項如下:
#建立一個名稱為(aclweba),服務端網域名稱(dstdomain)為(www.a.com)的存取控制清單(acl)
acl aclweba dstdomain www.a.com#也可以建立允許所有人訪問的存取控制清單(acl),可以建立針對諸如來源IP(src)、目的IP(dst)、目的網域名稱(dstdomain)等的存取控制清單。
#acl aclweba src all
#允許(allow)名稱為(aclweba)的存取控制清單訪問http_access allow aclweba
#設定80連接埠為Squid服務監聽用戶端訪問的連接埠,加速模式(vhost),將轉寄主機頭至後端伺服器http_port 80 vhost#建立名稱分別為(weba1、weba2)的緩衝點,通過輪詢(round-robin)訪問其上級(parent)Web網站A1(172.16.0.20:80)或Web網站A2(172.16.0.20:80),這些Web網站是原始伺服器(originserver)
cache_peer 172.16.0.20 parent 80 0 no-query originserver round-robin name=weba1cache_peer 172.16.0.30 parent 80 0 no-query originserver round-robin name=weba2#設定緩衝使用記憶體大小cache_mem 1024 MB#設定儲存路徑,儲存格式(ufs),總緩衝大小(10240MB),一級緩衝(16MB),二級緩衝(253MB)
cache_dir ufs c:/squid/var/cache 10240 16 256
情境4:在情境3的基礎上增加Squid服務A2(222.0.0.11, 172.16.0.11),與Squid服務A實現負載平衡(簡單的可以通過DNS輪詢機制),兩個Squid服務配置基本一致,還需在配置中各增加Squid服務A和Squid服務A2互為鄰居,並開放相關連接埠。
#建立一個名稱為(aclweba),服務端網域名稱(dstdomain)為(www.a.com)的存取控制清單(acl)
acl aclweba dstdomain www.a.com#也可以建立允許所有人訪問的存取控制清單(acl),可以建立針對諸如來源IP(src)、目的IP(dst)、目的網域名稱(dstdomain)等的存取控制清單。
#acl aclweba src all
#建立一個名稱為(localnet),來源IP為(172.16.0.0/24)的存取控制清單(acl),供內部通訊
acl localnet src 172.16.0.0/24
#允許(allow)名稱為(aclweba)的存取控制清單http訪問http_access allow aclweba
#允許(allow)名稱為(localnet)的存取控制清單icp訪問
icp_access allow localnet
#設定80連接埠為Squid服務監聽用戶端訪問的連接埠,加速模式(vhost),將轉寄主機頭至後端伺服器http_port 80 vhost
#設定3130為Squid伺服器將的通訊連接埠
icp_port 3130
#Squid服務互為鄰居,通過ICP查詢其他Squid服務中自己沒有的緩衝
cache_peer 172.16.0.10 sibling 80 3130
cache_peer 172.16.0.11 sibling 80 3130
#建立名稱分別為(weba1、weba2)的緩衝點,通過輪詢(round-robin)訪問其上級(parent)Web網站A1(172.16.0.20:80)或Web網站A2(172.16.0.20:80),這些Web網站是原始伺服器(originserver)
cache_peer 172.16.0.20 parent 80 0 no-query originserver round-robin name=weba1
cache_peer 172.16.0.30 parent 80 0 no-query originserver round-robin name=weba2
#設定緩衝使用記憶體大小
cache_mem 1024 MB
#設定儲存路徑,儲存格式(ufs),總緩衝大小(10240MB),一級緩衝(16MB),二級緩衝(253MB)
cache_dir ufs c:/squid/var/cache 10240 16 256
每次修改完配置無需重啟服務,使用命令 c:\squid\sbin\squid -k reconfigure -n SquidProxy使服務生效。
要強行卸載服務可以net stop SquidProxy停止服務後sc delete SquidProxy卸載。
Windows下配置Squid反向 Proxy伺服器