squid緩存動態
access.log 文件包含了對squid 發起的每個客戶請求的單一行。每行平均約150 個位元組。
2. 如何清空squid指定頁面的緩存
Linux系統中清除squid的緩存的方法 在運行Squid的linux或者Unix上清除代理緩存,這里用的是很粗略的方法,還有用squidclient,好的方法就是腳本,尤其當網站很多,url參數有復雜的情況下。 第一步:確定squid代理緩存的位置 復制代碼 代碼如下: ...
3. 如何清空squid中指定頁面的緩存
Linux系統中清除squid的緩存的方法
在運行Squid的linux或者Unix上清除代理緩存,這里用的是很粗略的方法,還有用squidclient,好的方法就是腳本,尤其當網站很多,url參數有復雜的情況下。
第一步:確定squid代理緩存的位置
復制代碼
代碼如下:
#grep cache_dir /etc/squid/squid.conf //直接抓取squid的配置文件中緩存的目錄的路徑
輸出如下,根據自己編譯安裝指定的目錄不同,結果可能不同
復制代碼
代碼如下:
#cache_dir ufs /var/spool/squid 100 16 256
第二步:清空squid代理緩存
復制代碼
代碼如下:
# squid -k shutdown //關閉squid服務</p>< p># rm -rf /var/spool/squid/ //刪除緩存目錄
重建緩存目錄
復制代碼
代碼如下:
# squid -z
輸出如下:
復制代碼
代碼如下:
2013/08/24 04:24:19| Making directories in /var/spool/squid/00</p>< p>2013/08/24 04:24:19| Making directories in /var/spool/squid/01</p>< p>2013/08/24 04:24:19| Making directories in /var/spool/squid/02</p>< p>2013/08/24 04:24:20| Making directories in /var/spool/squid/03</p>< p>2013/08/24 04:24:20| Making directories in /var/spool/squid/04</p>< p>2013/08/24 04:24:20| Making directories in /var/spool/squid/05</p>< p>2013/08/24 04:24:20| Making directories in /var/spool/squid/06</p>< p>
重啟Squid:
復制代碼
代碼如下:
#squid 或者 #service squid start
運行後輸出:
復制代碼
代碼如下:
Starting squid: [ OK ]
第三步:確認Squid在運行
復制代碼
代碼如下:
# netstat -tulpn | grep :3128 // 查看squid使用的3128埠是否在使用
你也可以查看squid的access.log或者cache.log來檢查squid的運行是否正常,命令如下:
復制代碼
代碼如下:
# tail -f /var/log/squid/access.log</p>< p># tail -f /var/log/squid/cache.log
4. squid 緩存時間設置的疑問
根據你的描述
建議你修改為
refresh_pattern -i \.jpg$ 0 0% 1800
上述設置的目的是
不設最小緩存時間,發現圖片被修改之後緩存立刻失效.
ignore-reload是指忽略客戶端的刷新請求.
5. squid 如何緩存 視頻文件
以下這些參數告訴Squid緩存的文件系統、位置和緩存策略: cache_dir ufs /var下面就一步一步來了解Squid是如何進行控制管理的。 通過IP地址來識別用戶很,
6. squid 反向代理緩存
squid是緩存在硬碟上的,當然也有很少一部分是緩存在內存里的,這個是根據你的參數設置來的,畢竟你就那麼多內存,數據大頭肯定還是要緩存到硬碟的。
7. 我在windows上使用squid代理的,不能訪問動態頁面 ,請教
代理提供兩個方面的服務:一是讓不能直接訪問Internet的用戶訪問Internet,因為允許一台許可權較大的計算機直接連接網路更安全也更易於管理;二是讓那些已經能夠訪問Internet的用戶可以更快或更廣泛地訪問,因為代理伺服器可以將訪問較為頻繁的網頁緩存到本地,當有人再次訪問同一頁面時,代理可以直接發送本地頁面而無需浪費網路帶寬。當然也可以二者兼而有之。
我們以應用最廣泛的Squid為例,討論Linux下的代理伺服器。這里所指的僅僅是伺服器端應用,不包括客戶端配置。Squid的優點是功能強大、配置簡單、文檔豐富;缺點是目前支持的協議尚不夠廣泛,對超大型應用略感吃力,不過這些不足都在慢慢完善之中。對於初學者和普通的應用而言,Squid仍是最佳選擇。
在此,我們要配置一個只對內部網路提供代理服務的Proxy Server。它將用戶分為高級用戶和普通用戶兩種,對高級用戶採用網卡物理地址識別的方法,普通用戶則需要輸入用戶名和口令才能正常使用。高級用戶沒有訪問時間和文件類型的限制,而普通用戶只在上班時可以訪問以及一些其它的限制。
安裝
可以從Squid站點www.squid-cache.org獲取該軟體的源代碼安裝包,包括gz和bz2兩種壓縮方式。也可以使用Linux的發行版,如Red
Hat提供的RPM包。
RPM方式安裝很簡單,命令如下:
$ rpm -ivh Squid-2.x.STALBx.i386.rpm
不過筆者認為,即便是系統中已經默認安裝了Squid,也應當先刪掉然後安裝最新的源代碼包。因為開源軟體會不斷修正問題、提供更新的功能,使用最新版本可以保證最高的性能及安全,而且源代碼方式可以完全定製系統。不過STABLE穩定版、DEVEL版通常是提供給開發人員測試程序的,假定下載了最新的穩定版squid-2.5.STABLE2.tar.gz,用以下命令解開壓縮包:
$ tar xvfz squid-2.5.STABLE.tar.gz
用bz2方式壓縮的包可能體積更小,相應的命令是:
$ tar xvfj squid-2.5.STABLE.tar.bz2
然後,進入相應目錄對源代碼進行配置和編譯,命令如下:
$ cd squid-2.5.STABLE2
配置命令configure有很多選項,如果不清楚可先用「-help」查看。通常情況下,用到的選項有以下幾個:
--prefix=/web/squid #指定Squid的安裝位置,如果只指定這一選項,那麼該目錄下會有bin、sbin、man、conf等目錄,而主要的配置文件此時在conf子目錄中。為便於管理,最好用參數--sysconfdir=/etc把這個文件位置配置為/etc。
--enable-storeio=ufs,null #使用的文件系統通常是默認的ufs,不過如果想要做一個不緩存任何文件的代理伺服器,就需要加上null文件系統。
--enable-arp-acl #這樣可以在規則設置中直接通過客戶端的MAC地址進行管理,防止客戶使用IP欺騙。
--enable-err-languages="Simplify_Chinese" --enable-default-err-languages="Simplify_Chinese" #上面兩個選項告訴Squid編入並使用簡體中文錯誤信息。
--enable-linux-netfilter #允許使用Linux的透明代理功能。
--enable-underscore #允許解析的URL中出現下劃線,因為默認情況下Squid會認為帶下劃線的URL是非法的,並拒絕訪問該地址。
整個配置編譯過程如下:
./configure --prefix=/var/squid --sysconfdir=/etc --enable-arp-acl --enable-linux-netfilter --enable-pthreads --enable-err-language="Simplify_Chinese" --enable-storeio=ufs,null --enable-default-err-language="Simplify_Chinese" --enable-auth="basic" --enable-sc-auth-helpers="NCSA" --enable-underscore
其中一些選項有特殊作用,將在下面介紹它們。
最後執行make和make install兩條命令,將源代碼編譯為可執行文件,並拷貝到指定位置。
基本配置
安裝完成後,接下來要對Squid的運行進行配置(不是前面安裝時的配置)。所有項目都在squid.conf中完成。Squid自帶的squid.conf
包括非常詳盡的說明,相當於一篇用戶手冊,對配置有任何疑問都可以參照解決。
在這個例子中,代理伺服器同時也是網關,內部網路介面eth0的IP地址為192.168.0.1,外部網路介面eth1的IP地址為202.103.x.x。
下面是一個基本的代理所需要配置選項: http_port 192.168.0.1:3128
默認埠是3128,當然也可以是任何其它埠,只要不與其它服務發生沖突即可。為了安全起見,在前面加上IP地址,Squid就不會監聽外部的網路介面。
下面的配置選項是伺服器管理者的電子郵件,當錯誤發生時,該地址會顯示在錯誤頁面上,便於用戶聯系:
cache_mgr [email protected]
以下這些參數告訴Squid緩存的文件系統、位置和緩存策略:
cache_dir ufs /var/squid cache_mem 32MB cache_swap_low 90 cache_swap_high 95
在這里,Squid會將/var/squid目錄作為保存緩存數據的目錄,每次處理的緩存大小是32兆位元組,當緩存空間使用達到95%時,新的內容將取代舊的而不直接添加到目錄中,直到空間又下降到90%才停止這一活動。如果不想Squid緩存任何文件,如某些存儲空間有限的專有系統,可以使用null文件系統(這樣不需要那些緩存策略): cache_dir null /tmp
下面的幾個關於緩存的策略配置中,較主要的是第一行,即用戶的訪問記錄,可以通過分析它來了解所有用戶訪問的詳盡地址:
cache_access_log /var/squid/access.log cache_log /var/squid/cache.log cache_store_log /var/squid/store.log
下面這行配置是在較新版本中出現的參數,告訴Squid在錯誤頁面中顯示的伺服器名稱:
visible_hostname No1.proxy
以下配置告訴Squid如何處理用戶,對每個請求的IP地址作為單獨地址處理: client_mask 255.255.255.255
如果是普通代理伺服器,以上的配置已經足夠。但是很多Squid都被用來做透明代理。所謂透明代理,就是客戶端不知道有代理伺服器的存在,當然也不需要進行任何與代理有關的設置,從而大大方便了系統管理員。相關的選項有以下幾個:
httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_user_host_header on
在Linux上,可以用iptables/ipchains直接將對Web埠80的請求直接轉發到Squid埠3128,由Squid接手,而用戶瀏覽器仍然認為它訪問的是對方的80埠。例如以下這條命令:
iptables -t nat -A PREROUTING -s 192.168.0.200/32 -p tcp --dport 80 -j REDIRECT 3128
就是將192.168.0.200的所有針對80埠的訪問重定向到3128埠。
所有設置完成後,關鍵且重要的任務是訪問控制。Squid支持的管理方式很多,使用起來也非常簡單(這也是有人寧願使用不做任何緩存的Squid,也不願意單獨使用iptables的原因)。Squid可以通過IP地址、主機名、MAC地址、用戶/密碼認證等識別用戶,也可以通過域名、域後綴、文件類型、IP地址、埠、URL匹配等控制用戶的訪問,還可以使用時間區間對用戶進行管理,所以訪問控制是Squid配置中的重點。Squid用ACL(Access Control List,訪問控制列表)對訪問類型進行劃分,用http_access deny 或allow進行控制。根據需求首先定義兩組用戶advance和normal,還有代表所有未指明的用戶組all及不允許上網的baser,配置代碼如下:
acl advance 192.168.0.2-192.168.0.10/32 acl normal src 192.168.0.11-192.168.0.200/32 acl baser src 192.168.0.100/32 acl
baddst dst www.somebadsite.com acl all src 0.0.0.0/0 http_access deny baser http_access allow advance http_access allow normal
可以看出,ACL的基本格式如下: acl 列表名稱 控制方式 控制目標
比如acl all src 0.0.0.0/0,其名稱是all,控制方式是src源IP地址,控制目標是0.0.0.0/0的IP地址,即所有未定義的用戶。出於安全考慮,總是在最後禁止這個列表。
下面這個列表代表高級用戶,包括IP地址從192.168.0.2到192.168.0.10的所有計算機:
acl advance 192.168.0.2-192.168.0.20/32
下面這個baser列表只包含一台計算機,其IP地址是192.168.0.100: acl baser 192.168.0.100/32
ACL寫完後,接下來要對它們分別進行管理,代碼如下: http_access deny baser http_access allow advance http_access allow normal
上面幾行代碼告訴Squid不允許baser組訪問Internet,但advance、normal組允許(此時還沒有指定詳細的許可權)。由於Squid是按照順序讀取規則,會首先禁止baser,然後允許normal。如果將兩條規則順序顛倒,由於baser在normal范圍中,Squid先允許了所有的normal,那麼再禁止baser就不會起作用。
特別要注意的是,Squid將使用allow-deny-allow-deny……這樣的順序套用規則。例如,當一個用戶訪問代理伺服器時,Squid會順序測試Squid中定義的所有規則列表,當所有規則都不匹配時,Squid會使用與最後一條相反的規則。就像上面這個例子,假設有一個用戶的IP地址是192.168.0.201,他試圖通過這台代理伺服器訪問Internet,會發生什麼情況呢?我們會發現,他能夠正常訪問,因為Squid找遍所有訪問列表也沒有和192.168.0.201有關的定義,便開始應用規則,而最後一條是deny,那麼Squid默認的下一條處理規則是allow,所以192.168.0.201反而能夠訪問Internet了,這顯然不是我們希望的。所以在所有squid.conf中,最後一條規則永遠是http_access deny all,而all就是前面定義的「src 0.0.0.0」。
按照這個配置應該沒有問題
8. squid指定只緩存至內存或者硬碟
cache_mem 這個設置用多大的內存存儲緩存
cache_dir 這個設置緩存存儲在硬碟上
經常被訪問的緩存會放在內存中
9. Servlet/JSP怎麼控制頁面緩存於squid中
近段時間在研究如何將Servlet/JSP中的偽動態頁面緩存到Squid中來加速Web訪問,在google上搜索"JSP在squid中的緩存"的信息,出來的信息比較少,後來差PHP,ASP的緩存相關資料及"深入體驗java Web開發內幕——核心基礎.pdf"和"Squid中文權威指南"中的相關章節,總算實現了這個目的(有需要這兩本書的兄弟可以mail我 )。基於自己的一些理解和試驗成果,記下來供以後參考。 HTML的HTTP協議頭信息中控制著頁面在幾個地方的緩存信息,包括瀏覽器端,中間緩存伺服器端(如:squid等),Web伺服器端。本文討論頭信息中帶緩存控制信息的HTML頁面(JSP/Servlet生成好出來的也是HTML頁面)在中間緩存伺服器中的緩存情況。
HTTP協議中關於緩存的信息頭關鍵字包括Cache-Control(HTTP1.1),Pragma(HTTP1.0),last-Modified,Expires等。
HTTP1.0中通過Pragma 控制頁面緩存,可以設置:Pragma或no-cache。網上有非常多的文章說明如何控制不讓瀏覽器或中間緩存伺服器緩存頁面,通常設置的值為no-cache,不過這個值不這么保險,通常還加上Expires置為0來達到目的。但是如我們刻意需要瀏覽器或緩存伺服器緩存住我們的頁面這個值則要設置為Pragma。
HTTP1.1中啟用Cache-Control 來控制頁面的緩存與否,這里介紹幾個常用的參數:
no-cache,瀏覽器和緩存伺服器都不應該緩存頁面信息;
public,瀏覽器和緩存伺服器都可以緩存頁面信息;
no-store,請求和響應的信息都不應該被存儲在對方的磁碟系統中;
must-revalidate,對於客戶機的每次請求,代理伺服器必須想伺服器驗證緩存是否過時;
max-age=xxx,s-max-age=xxx,替代Expires,表示應該在xxx秒後認為頁面過時,後者指示代理伺服器中緩存(通常稱為共享緩存)的頁面過期時間。(不過我試了好多次,這個選項一直沒法實現,希望有人能補充!)
通常我們不需要緩存頁面時設置該值為"no-cache,no-store,must-revalidate"(分三行代碼設置);需要緩存頁面信息時則設置該值為"public,max-age,s-max-age"。
Last-Modified只頁面的最後生成時間,GMT格式;
Expires過時期限值,GMT格式,指瀏覽器或緩存伺服器在該時間點後必須從真正的伺服器中獲取新的頁面信息;
上面兩個值在JSP中設置值為字元型的GMT格式,無法生效,設置long類型才生效;
最後來看一下JSP或Servlet中如何設置緩存控制信息的代碼:
Java代碼
//本頁面允許在瀏覽器端或緩存伺服器中緩存,時限為10秒。
java.util.Date date = new java.util.Date();
response.setDateHeader("Last-Modified",date.getTime());
response.setDateHeader("Expires",date.getTime()+10000);
response.setHeader("Cache-Control", "public");
response.setHeader("Pragma", "Pragma");
Java代碼
//不允許瀏覽器端或緩存伺服器緩存當前頁面信息。
response.setHeader( "Pragma", "no-cache" );
response.setDateHeader("Expires", 0);
response.addHeader( "Cache-Control", "no-cache" );
response.addHeader( "Cache-Control", "no-store" );
response.addHeader( "Cache-Control", "must-revalidate" );
如果HTML頁面信息中包括了Expires頭信息,則其相關的緩存機制不再處理該頁面,而是安裝頁面的緩存控制要求來處理。所以做了上述工作後,Squid無需做任何配置上的修改(指Squid的refresh_pattern指令不處理這些頁面 )。
下面說一下Squid緩存一些靜態資源的一些原理,Squid通過refresh_pattern指令來控制用戶請求是否命中。 "Squid中文權威指南"文章中描述Squid的refresh_pattern指令一段文章讀起來非常的拗口,就是LM_factor比率的演算法,這個演算法的概念翻譯的比較模糊,網路上傳來傳去的,感覺都是搞不清楚,後來參考"OReilly - Squid The Definitive Guide.chm"英文原文,總算明白過來 。
英文原文應用代碼
Responses that fall between the minimum and maximum are subject to Squid's
last-modified factor (LM-factor) algorithm. For such responses, Squid calculates
the response age and the LM-factor and compares it to the percent value. The
response age is simply the amount of time passed since the origin server
generated, or last validated, the response. The resource age is the difference
between the Last-Modified and Date headers. The LM-factor is the ratio of the
response age to the resource age.
LM-factor的定義是(response age)/(the resource age).
其中response age是指HTTP頭信息中的age信息。
resource age是指HTTP頭信息中的Date值減去Last-Modified的值轉化為秒的值。
各位可以通過curl命令(Linux下自帶命令)來參看一個資源返回回來的HTTP頭詳細信息,如下面這樣:
curl -I
經過試驗,這個演算法是正確的,同時這里要提醒一下,特別是對一些HTML類型的資源,max值不要設置的太大,如果設置的太大的話,有可能修改的文檔信息需要非常長的時間才能得到更新,因為LM-factor參數值是變化的,越來越大,分母變大的結果就是比率越來越小,總是小於我們設定的比率,導致需要max來控制頁面刷新。