Squid簡介
Squid可以做什么
性能要素
Squid安裝
Squid快速體驗
Squid配置
Squid簡介
Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidth and improves response times by caching and reusing frequently-requested web pages. Squid has extensive access controls and makes a great server accelerator. It runs on most available operating systems, including Windows and is licensed under the GNU GPL
翻譯過來大致意思:
Squid是一個支持HTTP,HTTPS,FTP等眾多協議的緩存代理。可以降低帶寬 和 提高響應時間
squid是硬盤緩存,其使用內存作緩存內容的索引
(一個索引在32位系統中大小是75bytes,在64位系統中是112bytes)。
可以把squid想象成數據庫,硬盤上是數據,內存中是索引:查詢內存索引,發現內存位置,發出去
性能要素
大內存(最重要,影響最大);快速大硬盤(第二要素,更多緩存,看網站實際數據量了,要快速的,最好是1萬轉以上的,如sas10K或西部數據的猛禽系列);CPU(較為次要,影響不大,特別是多核處理器基本沒用)。
建議匹配配置:每G磁盤空間需要32M內存。這樣,512M內存的系統,能支持16G的磁盤緩存。你的情況當然會不同。
內存需求依賴於如下事實:緩存目標大小,CPU體系(32位或64位),同時在線的用戶數量,和你使用的特殊功能。估算:建立一個有足夠磁盤空間,可存儲 3-7天web流量數據的系統。如帶寬1M,則需要約3600*1M的數據緩存(3.5G),如果一天提供8小時有效訪問,則需要緩存10-28G(看重復情況了)。但Squid官方網站說法:squid使用內存表索引硬盤緩存內容,硬盤內容/內存索引=177,但要同時考慮到squid程序內存,cache_mem,硬盤緩沖cache等占用的內存。因此,我的估算:2G內存的系統,使用1.5G內存作squid索引,對應硬盤150G。關於硬盤說明:requests per second = 1000/seek time/硬盤數,一塊硬盤是比較准確的,多塊硬盤就不好說了。一定要用random-seek time小的盤,而隨機尋道時間短意味着轉速要快,越快其隨機尋道時間越短!
Squid可以做什么
squid可以做代理,也可以做防火牆,也可以提高是網站加速器,節省服務器帶寬資源(為公司省錢)
Squid安裝
本人操作系統Ubuntu12.04(使用vagrant創建的虛擬機)
$ sudo apt-get install squid3 $ sudo service squid3 stop/restart
Squid快速體驗
先備份默認配置文件
$ sudo cp /etc/squid3/squid.conf /etc/squid3/squid.default.conf
配置接受請求(默認不接受任何請求)
$ http_access deny all 修改成 http_access allow all
給代理起個名字(搜索visible_hostname )
$ visible_hostname testProxy $ cache_mgr admin@54php.cn
設置dns服務地址 : 打造私有的DNS 服務
$ vim /etc/squid3/squid.conf #search dns_nameservers dns_nameservers 192.168.22.24 192.168.22.25
重啟服務
$ sudo service squid3 restart
然后找個瀏覽器設置HTTP代理地址 和 端口(默認3128)
Squid配置
文件和日志相關配置
#指定cache在硬盤上存放的路徑,最大存儲40G,16個一級目錄,256個二級目錄 #修改完cache_dir路徑重啟之前要squid3 -z cache_dir ufs /data/logs/squid3/cache 40960 16 256 #squid啟動和調試等信息 cache_log /data/logs/squid3/cache.log #squid請求日志 access_log /data/logs/squid3/access.log squid #記錄進入和離開緩存的每個目標的記錄 cache_store_log /data/logs/squid3/store.log
cache_mem 2048 MB #squid使用共享內存大小,一般設置為內存1/3左右 cache_swap_low 85 #配合cache_mem使用,當達到百分之85后,就把舊的內容替換直到降到百分之85 cache_swap_high 95
#日志保留最近30個文件,每天輪詢三次,即保留最近十天的內容.
logfile_rotate 30
訪問控制(重點)關鍵字 acl http_access
acl 語法,每一行的訪問控制都必須有 名字 和 類型,如下
acl aclname acltype param
常見acltype列表
類型 | 描述 |
例子 |
src | 客戶端ip | acl aclname src 192.168.22.21 192.168.22.0/24 |
dst | 目標ip,既訪問URL的ip | acl aclname dst 220.181.57.217 220.181.57.0/24 |
arp | mac地址 | acl aclname arp 08:00:27:dd:97:09 |
srcdomain | 沒想到應用場景 | |
dstdomain | 目標服務器域名 | acl aclname dstdomain .foo.com |
srcdom_regex | 正則表達式 | 沒想到應用場景 |
dstdom_regex | 正則表達式 | acl aclname dstdom_regex [-i] \.foo\.com |
url_regex | 訪問url正則 | acl aclname url_regex [-i] ^http:// ... |
urlpath_regex | 訪問path正則 | acl aclname urlpath_regex [-i] \.gif$ |
port | 目前端口 |
acl aclname port 80 70 21 0-1024 |
proto | 協議 | acl aclname proto HTTP FTP ... |
http_status | http 狀態 | acl aclname http_status 200 301 500- 400-403 ... |
method | acl aclname method GET POST ... | |
browser | user-agent匹配 | acl aclname browser [-i] regexp ... |
referer_regex | referer匹配 | acl aclname referer_regex [-i] regexp ... |
req_mime_type | 請求mine類型 | acl aclname req_mime_type -i ^multipart/form-data$ acl aclname rep_mime_type -i ^application/x-javascript$ |
http_access 語法格式
http_access allow|deny [!]aclname
結合acl 和 http_access 舉例
acl white_ip_list src 192.168.22.0/24 acl deny_domain dstdomain .qq.com .taobao.com http_access deny deny_domain #等價於http_access allow !deny_domain http_access allow white_ip_list
refresh_pattern的作用
主要用於一個頁面進入cache后,它在cache中停留的時間。refresh_pattern規則僅僅應用到沒有明確過時期限的響應。原始服務器能使用Expires頭部,或者Cache-Control:max-age指令來指定過時期限
#語法 refresh_pattern [-i] regexp min percent max [options]
min參數就是分鍾數,它是過時響應的最低時間限制,如果某個響應駐留在cache里的時間沒有超過這個最低限制,那么它不會過期
max參數也是分鍾數,它是過時響應的最高時間限制,如果某個響應駐留在cache里的時間高於這個最高限制,那么它必須被刷新
在最低和最高時間限制之間的響應,會面對squid的最后修改系數LM-factor算法LM-factor=(response age)/(resource age)
options可能值如下
override-expire 該選項導致squid在檢查Expires頭部之前,先檢查min值。這樣,一個非零的min時間讓squid返回一個未確認的cache命中,即使該響應准備過期 override-lastmod 改選項導致squid在檢查LM-factor百分比之前先檢查min值 reload-into-ims 該選項讓squid在確認請求里,以no-cache指令傳送一個請求。換句話說,squid在轉發請求之前,對該請求增加一個If-Modified- Since頭部。注意這點僅僅在目標有Last-Modified時間戳時才能工作。外面進來的請求保留no-cache指令,以便它到達原始服務器。 一般情況可以使用 reload-into-ims。它其實是強行控制對象的超時時間,這違反了http協議的精神,但是在帶寬較窄的場合,可以提高明顯系統相應時間 ignore-reload 該選項導致squid忽略請求里的任何no-cache指令。 所以。如果希望內容一進入cache就不刪除,直到被主動purge掉為止,可以加上ignore-reload選項,這個我們常用在mp3,wma,wmv,gif之類
reload-into-ims例子如下:
refresh_pattern -i .html 1440 50% 10080 reload-into-ims
refresh_pattern -i .htm 1440 50% 10080 reload-into-ims
refresh_pattern -i .shtml 1440 50% 10080 reload-into-ims
refresh_pattern -i .png 4320 50% 20160 reload-into-ims
refresh_pattern -i .gif 4320 50% 20160 reload-into-ims
refresh_pattern -i .bmp 4320 50% 20160 reload-into-ims
refresh_pattern -i .jpg 4320 50% 20160 reload-into-ims
refresh_pattern -i .js 4320 50% 20160 reload-into-ims
refresh_pattern -i .css 4320 50% 20160 reload-into-ims
refresh_pattern -i .swf 4320 50% 20160 reload-into-ims
ignore-reload例子如下:
refresh_pattern -i \.mp3$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.wmv$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.rm$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.swf$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.mpeg$ 1440 50% 2880 ignore-reload
refresh_pattern -i \.wma$ 1440 50% 2880 ignore-reload
LM-factor
LM-factor=(response age)/(resource age)
舉個例子,這里只考慮percent, 不考慮min 和max
例如:refresh_pattern 20%
假設源服務器上www.aaa.com/index.htm -----lastmodified 是 2007-04-10 02:00:00
squid上 proxy.aaa.com/index.htm index.htm進入cache的時間 2007-04-10 03:00:00
1)如果當前時間 2007-04-10 03:00:00
resource age =3點-2點=60分鍾
response age =0分鍾
index.htm還可以在cache停留的時間(resource age)*20%=12分鍾
也就是說,index.htm進入cache后,可以停留12分鍾,才被重新確認。
2)如果當前時間 2007-04-10 03:05:00
resource age =3點-2點=60分鍾
response age =5分鍾
index.htm還可以在cache停留的時間(resource age)*20%=12分鍾-5=7
LM-factor=5/60=8.3%<20%
一直到2007-04-10 03:12:00 LM-factor=12/60=20% 之后,cache中的頁面index.htm終於stale。
如果這時沒有index.htm的請求,index.htm會一直在緩存中,如果有index.htm請求,squid收到該請求后,由於已經過期, squid會向源服務器發一個index.htm是否有改變的請求,源服務器收到后,如果index.htm沒有更新,squid就不用更新緩存,直接把緩存的內容放回給客戶端,同時,重置對象進入cache的時間為與源服務器確認的時間,比如2007-04-10 03:13:00,如果正好在這個后重新確認了頁面。重置后,resource age變長,相應在cache中存活的時間也變長。
如果有改變則把最新的index.htm返回給squid,squid收到會更新緩存,然后把新的index.htm返回給客戶端,同時根據新頁面中的Last_Modified和取頁面的時間,重新計算resource age,進一步計算出存活時間。
實際上,一個頁面進入cache后,他的存活時間就確定了,即 (resource age) * 百分比,一直到被重新確認
cache_peer
cache_peer 語法格式
cache_peer hostname type http-port icp-port [options]
名稱 | 值 | 描述 |
type | parent,sibling,multicast | |
proxy-port | 此處應該填寫可以接受http請求的服務端口,squid服務常用端口是3128,web服務常用端口是80 | |
icp-port | 用於查詢鄰居cache服務中的對象,不支持icp或者HTCP的就設置為0 | |
options | no-query | 關閉icp查詢,不做查詢操作,直接獲取數據 |
originserver | 原始服務器(web服務器) | |
no-digest | 關閉cache digests請求,代理服務器之間不做摘要表查詢,直接用ICP協議溝通(同級代理) | |
proxy_only |
直接獲取對方緩沖,轉交給代理服務器的客戶端,而不存入本地 | |
round-robin | 如果設置數部上層服務器,那么輪流查詢父級服務器,此時weight參數才會起作用 | |
sourcehash | 已客戶端ip做負載均衡 | |
直接轉發到web服務器
從客戶端過來的請求,如果是 blog.dr.local.com,則Squid向 Server 192.168.22.21 的端口80發送請求
從客戶端過來的請求,如果是 admin.dr.local.com static.dr.local.com ,則Squid向 Server 192.168.22.24 的端口80發送請求
cache_peer 192.168.22.21 parent 80 0 no-query originserver weight=10 name=a cache_peer 192.168.22.24 parent 80 0 no-query originserver weight=1 name=b cache_peer_domain a blog.dr.local.com cache_peer_domain b admin.dr.local.com static.dr.local.com
負載均衡配置
表明對blog.dr.local.com的請求,squid向192.168.22.21的80端口和192.168.22.24的80端口發出請求
cache_peer 192.168.22.21 parent 80 0 no-query no-digest originserver weight=10 name=a sourcehash cache_peer 192.168.22.24 parent 80 0 no-query no-digest originserver weight=1 name=b sourcehash cache_peer_domain a blog.dr.local.com cache_peer_domain b blog.dr.local.com
日志
新緩存命中 |
TCP_HIT |
Squid發現請求資源的貌似新鮮的拷貝,並將其立即發送到客戶端。 |
未命中 |
TCP_MISS |
Squid沒有請求資源的cache拷貝。 |
確認后命中 |
TCP_REFERSH_HIT |
Squid發現請求資源的貌似陳舊的拷貝,並發送確認請求到原始服務器。原始服務器返回304(未修改)響應,指示squid的拷貝仍舊是新鮮的。 |
無命中返回現有緩存 |
TCP_REF_FAIL_HIT |
Squid發現請求資源的貌似陳舊的拷貝,並發送確認請求到原始服務器。然而,原始服務器響應失敗,或者返回的響應Squid不能理解。在此情形下,squid發送現有cache拷貝(很可能是陳舊的)到客戶端。 |
刷新命中 |
TCP_REFRESH_MISS |
Squid發現請求資源的貌似陳舊的拷貝,並發送確認請求到原始服務器。原始服務器響應新的內容,指示這個cache拷貝確實是陳舊的。 |
定義強制不緩存 |
TCP_CLIENT_REFRESH_MISS |
Squid發現了請求資源的拷貝,但客戶端的請求包含了Cache-Control: no-cache指令。Squid轉發客戶端的請求到原始服務器,強迫cache確認。 |
命中 |
TCP_IMS_HIT |
客戶端發送確認請求,Squid發現更近來的、貌似新鮮的請求資源的拷貝。Squid發送更新的內容到客戶端,而不聯系原始服務器。 |
緩存丟失直接訪問源 |
TCP_SWAPFAIL_MISS |
Squid發現請求資源的有效拷貝,但從磁盤裝載它失敗。這時squid發送請求到原始服務器,就如同這是個cache丟失一樣。 |
誤命中 |
TCP_NEGATIVE_HIT |
對原始服務器的請求導致HTTP錯誤時,Squid也會cache這個響應。在短時間內對這些 |
內存命中 |
TCP_MEM_HIT |
Squid在內存cache里發現請求資源的有效拷貝,並將其立即發送到客戶端。注意這點並非精確的呈現了所有從內存服務的響應。例如,某些cache在內存里,但要求確認的響應,會以TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式記錄。 |
access拒絕 |
TCP_DENIED |
因為http_access或http_reply_access規則,客戶端的請求被拒絕了。注意被http_access拒絕的請求在第9域的值是NONE/-,然而被http_reply_access拒絕的請求,在相應地方有一個有效值。 |
異步刷新 |
TCP_OFFLINE_HIT |
當offline_mode激活時,Squid對任何cache響應返回cache命中,而不用考慮它的新鮮程度 |
重定向 |
TCP_REDIRECT |
重定向程序告訴Squid產生一個HTTP重定向到新的URI。正常的,Squid不會記錄這些重定向。假如要這樣做,必須在編譯squid前,手工定義LOG_TCP_REDIRECTS |
NONE |
這指明Squid對本次請求,不會與任何其他服務器(鄰居或原始服務器)通信。它通常與cache命中、拒絕請求、cache管理請求、錯誤、和所有的ICP查詢這些類型聯合出現。 |
|
DIRECT |
Squid直接轉發請求到原始服務器。該域的第2半部分顯示原始服務器的IP地址,或主機名 |
查詢squid情況
$ sudo apt-get install squidclient $ squidclient -p 3128 mgr:info
參考文章:http://www.squid-cache.org/
原文地址: Squid 操作實踐
標簽: squid dns cache_peer refresh_pattern proxy reverse