Squid是一款類Unix系統下非常流行的服務器軟件,其最重要的功能就是在客戶端和服務端之間建立緩存。因而Squid可以用作反向代理,部署多級緩存或者搭建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 查看關於命令參數的幫助。
對於默認的配置文件,我們先命令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建立。這時服務可以正常啟動了。
二、配置Squid
接下裡主要配置c:\squid\etc\squid.conf這個文件。強烈建議使用Notepad++等文本工具進行編輯(可以輕松高亮相同詞匯),以便減輕查找的配置項的難度。
配置之前需要明確需求並搭建滿足該需求的網絡環境,下面以配置Web反向代理服務器為例討論Squid的配置:該反向代理服務器將作為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)提供反向代理服務,這是最簡單的場景,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)同時提供反向代理服務,假設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.com acl 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=weba cache_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.com cache_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)提供反向代理服務,實現負載均衡,假設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=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
場景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
#建立名稱分別為(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卸載。