Squid 操作實踐


  • 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. 大內存(最重要,影響最大);快速大硬盤(第二要素,更多緩存,看網站實際數據量了,要快速的,最好是1萬轉以上的,如sas10K或西部數據的猛禽系列);CPU(較為次要,影響不大,特別是多核處理器基本沒用)。

  2. 建議匹配配置:每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。

  3. 關於硬盤說明: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這個響應。在短時間內對這些
資源的重復請求,導致了否命中。negative_ttl指令控制這些錯誤被cache的時間數量。請注意這些錯誤只在內存cache,不會寫往磁盤。下列HTTP狀態碼可能導致否定cache(也遵循於其他約束):204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。

內存命中

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地址,或主機名
--假如禁止了log_ip_on_direct。



查詢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   

智能推薦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM