Linux中實現代理伺服器功能最常用的軟體為squid,下面是源代碼包安裝步驟:
1.從http://www.squid-cache.org下載squid-2.2.STABLE4-src.tar.gz
2.將該文件拷貝到/usr/local目錄
cpsquid-2.2.STABLE4-src.tar.gz/usr/local
3.解開該文件
tarxvzf
squid-2.2.STABLE4-src.tar.gz
#為了方便使用將目錄更名為squid
mvsquid-2.2.STABLE4squid
4.進入squid目錄
cdsquid
5.執行編譯
./configure
#系統默認安裝目錄為/usr/local/squid
/configure-prefix=/directory/you/want
#指定安裝目錄
6.執行
makeall
7.執行安裝
makeinstall
8.安裝結束後,Squid的可執行文件在安裝目錄的bin子目錄下,配置文件在etc子目錄下。
B. squid 怎麼查看編譯時用的參數
squid 2.5 中,編譯的時候加入如下參數
--enable-underscore
允許解析的URL中出現下劃線,因為默認squid會認為帶下劃線的URL地址是非法的,並拒絕訪問該地址。對於 2.6 版本,編譯時沒有這個參數,這個參數出現在 squid.conf 的配置文檔里,說明是這樣的:
TAG: allow_underscore
# Underscore characters is not strictly allowed in Internet hostnames
# but nevertheless used by many sites. Set this to off if you want
# Squid to be strict about the standard.
# This check is performed only when check_hostnames is set to on.
#
#Default:
# allow_underscore on
默認是 on 所以編譯時不用再加--enable-underscore
C. 有能安裝squid的路由器嗎
首先squid for openwrt是有的,就算沒有,開源的東西,自己編譯一下也不怎麼麻煩
(既然你可以折騰squid,那麼交叉編譯一下問題也不大)
但是有一個問題,你的cache怎麼解決?用usb的話肯定不行,usb長期這么頻繁讀寫肯定
會掛,除非你的路由器有sata介面。
D. linux squid怎樣修改3128埠
安裝完成後,可根據以下配置Proxy:
1.基本配置
安裝完成後,接下來要對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 start@soocol.com
以下這些參數告訴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
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」。
2.高級控制
前面說過,Squid的控制功能非常強大,只要理解Squid的行為方式,基本上就能夠滿足所有的控制要求。下面就一步一步來了解Squid是如何進行控制管理的。
通過IP地址來識別用戶很不可靠,比IP地址更好的是網卡的MAC物理地址。要在Squid中使用MAC地址識別,必須在編譯時加上「--enable-arp-acl」選項,然後可以通過以下的語句來識別用戶:
acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ...
它直接使用用戶的MAC地址,而MAC地址一般是不易修改的,即使有普通用戶將自己的IP地址改為高級用戶也無法通過,所以這種方式比IP地址可靠得多。
假如不想讓用戶訪問某個網站應該怎麼做呢?可以分為兩種情況:一種是不允許訪問某個站點的某個主機,比如ok的主機是ok.sina.com.cn,而其它的新浪資源卻是允許訪問的,那麼ACL可以這樣寫:
acl sinapage dstdomain ok.sina.com.cn
... ...
http_access deny ok
... ...
由此可以看到,除了ok,其它如、news.sina.com.cn都可以正常訪問。
另一種情況是整個網站都不許訪問,那麼只需要寫出這個網站共有的域名即可,配置如下:
acl qq dstdomain .tcccent.com.cn
注意tcccent前面的「.」,正是它指出以此域名結尾的所有主機都不可訪問,否則就只有tcccent.com.cn這一台主機不能訪問。
如果想禁止對某個IP地址的訪問,如202.118.2.182,可以用dst來控制,代碼如下:
acl badaddr dst 202.118.2.182
當然,這個dst也可以是域名,由Squid查詢DNS伺服器將其轉換為IP。
還有一種比較廣泛的控制是文件類型。如果不希望普通用戶通過代理伺服器下載MP3、AVI等文件,完全可以對他們進行限制,代碼如下:
acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$
http_access deny mmxfile
看到regex,很多讀者應該心領神會,因為這條語句使用了標準的規則表達式(又叫正則表達式)。它將匹配所有以.mp3、.avi等結尾的URL請求,還可以用-i參數忽略大小寫,例如以下代碼:
acl mmxfile urlpath_regex -i \.mp3$
這樣,無論是.mp3還是.MP3都會被拒絕。當然,-i參數適用於任何可能需要區分大小寫的地方,如前面的域名控制。
如果想讓普通用戶只在上班時間可以上網,而且是每周的工作日,用Squid應當如何處理呢?看看下面的ACL定義:
acl worktime time MTWHF 8:30-12:00 14:00-18:00
http_access deny !worktime
首先定義允許上網的時間是每周工作日(星期一至星期五)的上午和下午的固定時段,然後用http_access 定義所有不在這個時間段內的請求都是不允許的。
或者為了保證高級用戶的帶寬,希望每個用戶的並發連接不能太多,以免影響他人,也可以通過Squid控制,代碼如下:
acl conncount maxconn 3
http_access deny conncount normal
http_access allow normal
這樣,普通用戶在某個固定時刻只能同時發起三個連接,從第四個開始,連接將被拒絕。
總之,Squid的ACL配置非常靈活、強大,更多的控制方式可以參考squid.conf.default。
3.總結
下面把整個squid.conf總結一下:
# 伺服器配置
http_port 192.168.0.1:3128
cache_mgr start@soocol.com
cache_dir null /tmp
cache_access_log /var/squid/access.log
cache_log /var/squid/cache.log
cache_store_log /var/squid/store.log
visible_hostname No1.proxy
client_mask 255.255.255.255
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_user_host_header on
# 用戶分類
acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ...
acl normal proxy_auth REQUIED
acl all src 0.0.0.0
# 行為分類
acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$
acl conncount maxconn 3
acl worktime time MTWHF 8:30-12:00 14:00-18:00
acl sinapage dstdomain ok.sina.com.cn
acl qq dstdomain .tcccent.com.cn
# 處理
http_access allow advance
http_access deny conncount normal
http_access deny !worktime
http_access deny mmxfile
http_access deny sinapage
http_access deny qq
http_access allow normal
配置後的狀況是,advance組可以不受任何限制地訪問Internet,而normal組則只能在工作時間上網,而且不能下載多媒體文件,不能訪問某些特定的站點,而且發送請求不能超過3個。
通過本文的介紹,它可以了解Squid的基本能力。當然,它的能力遠不止此,可以建立強大的代理伺服器陣列,可以幫助本地的Web伺服器提高性能,可以提高本地網路的安全性等。要想發揮它的功效,還需要進一步控制。
參考資料:
如果對您有幫助,請記得採納為滿意答案,謝謝!祝您生活愉快!
vae la
E. redhat6 編譯squid3.3報錯的問題求高手指導
沒有裝Perl
必須把Perl裝上才行
yum install perl
F. 老兄啊 現在又有個問題 我squid編譯通過了 makefile 文件也創建成功了但是執行make命令提示找不到命令
把make裝上就行了
yum install make
G. 懂Squid的幫個忙,請問Squid支持HTTPs的正向代理嗎
1. SSL封裝的HTTP代理
2. 經過HTTP代理的HTTPS請求
3. 解開遠程網站的HTTPS並重新加密的中間人
這三者Squid均能做到,你配置https_port是實現第1種,這個特性需要編譯時候開啟。
而如果是第2種,不需要這么配置,瀏覽器會使用CONNECT方式通過HTTP經過代理。
如果想讓內網用戶無知覺地跑squid,可以Squid的http埠配置tproxy模式,iptables把80埠請求 tproxy給squid。這種情況https只能放直通。
如果讓內網用戶手動配置代理,那網關不需要打開IP轉發,直接打開squid,用戶配置代理上網,http/https都可以支持。
H. 如何清空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
I. 如何統計squid日誌ip url
在squid中access訪問日誌最為重要,位於/var/log/squid/access.log,Squid把關於HTTP響應的關鍵信息存放在access.log里。該文件是基於行的,也就是說每行對應一個客戶端請求。 squid記錄客戶端IP(或主機名)、請求URL、響應size、和其他信息。
常用的記錄格式如下(包含了10個域):
例如:
1
2
1206507660.803 84367 192.168.1.114 TCP_MISS/502 1486 GET
http://123.138.238.114/QQ2008SpringKB1.exe - DIRECT/123.138.238.114 text/html
下面來看看意思
1
logformat squid %ts.%03tu %6tr %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt
時間戳: 請求完成時間,以 Unix 時間來記錄的(UTC 1970-01-01 00:00:00 開始的時間)它是毫秒級的。 squid使用這種格式而不是人工可讀的時間格式,是為了簡化某些日誌處理程序的工作。
響應時間: 對HTTP響應來說,該域表明squid花了多少時間來處理請求。在squid接受到HTTP請求時開始計時,在響應完全送出後計時終止。響應時間是毫秒級的。盡管時間值是毫秒級的,但是精度可能是10毫秒。在squid負載繁重時,計時變得沒那麼精確。
客戶端地址: 該域包含客戶端的IP地址,或者是主機名.
結果/狀態碼: 該域包含2個 token,以斜杠分隔。第一個token叫結果碼,它把協議和響應結果(例如TCP_HIT或UDP_DENIED)進行歸類。這些是squid專有的編碼,以TCP_開頭的編碼指HTTP請求,以UDP_開頭的編碼指ICP查詢。第2個token是HTTP響應狀態碼(例如200,304,404等)。狀態碼通常來自原始伺服器。在某些情形下,squid可能有義務自己選擇狀態碼.
傳輸size: 該域指明傳給客戶端的位元組數。嚴格的講,它是squid告訴TCP/IP協議棧去發送給客戶端的位元組數。這就是說,它不包括TCP/IP頭部的overhead。也請注意,傳輸size正常來說大於響應的Content-Length。傳輸size包括了HTTP響應頭部,然而Content- Length不包括。
請求方式: 該域包含請求方式.
URI: 該域包含來自客戶端請求的URI。大多數記錄下來的URI實際是URL(例如,它們有主機名)。在記日誌時,squid刪掉了在第一個問號(?)之後的所有URI字元,除非禁用了strip_query_terms指令。
客戶端身份: 無
對端編碼/對端主機: 對端信息包含了2個token,以斜杠分隔。它僅僅與cache 不命中的請求有關。第一個token指示如何選擇下一跳,第二個token是下一跳的地址。當squid發送一個請求到鄰居cache時,對端主機地址是鄰居的主機名。假如請求是直接送到原始伺服器的,則squid會寫成原始伺服器的IP地址或主機名–假如禁用了log_ip_on_direct。 NONE/-這個值指明squid不轉發該請求到任何其他伺服器。
內容類型: 原始access.log的默認的最後一個域,是HTTP響應的內容類型。 squid從響應的Content-Type頭部獲取內容類型值。假如該頭部丟失了,squid使用一個橫杠(-)代替。
假如激活了 log_mime_hdrs 指令,squid在每行追加2個附加的域:
HTTP請求頭部: Squid 編碼HTTP請求頭部,並且在一對方括弧之間列印它們。方括弧是必須的,因為squid不編碼空格字元。編碼方案稍許奇怪。回車(ASCII 13)和換行(ASCII 10)分別列印成\r和\n。其他不可列印的字元以RFC 1738風格來編碼,例如Tab(ASCII 9)變成了%09。
HTTP響應頭部: Squid編碼HTTP響應頭部,並且在一對方括弧之間列印它們。注意這些是發往客戶端的頭部,可能不同於從原始伺服器接受到的頭部。
如果日誌需要給 awstats 分析和讓人可讀性更加好,可能需要修改日誌為 combined:
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log /var/log/squid/access.log combined
會顯示為
1
110.211.14.58 - - [04/Apr/2008:00:07:39 +0800] "GET http://www.php-oa.com/0.flv HTTP/1.1" 206 139732 "-" "Mozilla/4.0 (compatible; MSIE 6.0;)"TCP_HIT 13936
store.log
在 store.log 記錄上面不能從 access.log 中的一些信息,如 Squid 關於存儲或刪除 cache 目標的相關的一些操作和時間.對每個 Squid 中存儲的文件和不能 cache 的文件,以及每個被輪換策略刪除的文件,Squid 都會創建相應的日誌.
注意這個日誌文件記錄了所有的文件.
信息有如下的一些信息:
某個特定的 HTTP 請求是否被 cache.
cache 目標的文件號.可以通過應用的 UFS 存儲機制,來查到該文件號到路徑名,並且檢查 cache 文件的內容.
響應的內容長度: 包括 Content-Length 值和實際的 body 大小.
Date, Last-Modified, 和 Expires 等過期頭部的值.
響應的 cache 關鍵字(例如MD5 hash值).
例如:
1
1323468268.676 RELEASE -1 FFFFFFFF 200 1323467369 1322847727 1365003369 video/x-flv 521858017/96195 GET http://www.php-oa.com/0.flv
如上:每個日誌條目包含如下13個域:
時間戳: 事件何時發生,表現為Unix紀元以來的秒數,它是毫秒級的.
動作: cache目標發生的動作.該域有3個可能值:SWAPOUT,RELEASE,和SO_FAIL.
SWAPOUT在Squid成功的存儲目標到磁碟時發生.某些目標例如那些消極cache的,僅保存在內存而不是磁碟,Squid不會在store.log里記錄它們.
SO_FAIL表明Squid不能完整的存儲目標到磁碟.多半意味著存儲機制拒絕以寫方式打開新的磁碟文件.
RELEASE在Squid從cache里刪除目標,或首先就決定響應不可存儲時發生.
目錄號: 目錄號是十進制小數形式,它是個到cache目錄的7位索引.對沒有存儲到磁碟的目標,該域包含-1值.
文件號: 文件號是25位的標識符,內在的被squid使用.它被寫成8字元的十六進制號.對UFS基礎的存儲機制沒有存儲到磁碟的目標,沒有有效的文件號.對這些目標,該域的值是FFFFFFFF.僅僅在RELEASE和SO_FAIL情況下才會出現這個值.
cache關鍵字: Squid使用MD5哈希值作為主要的索引來定位目標.該關鍵字基於請求方式、URI、和其他可能的信息計算得來.可以從cache關鍵字來查找store.log條目.
狀態碼: 該域顯示響應的HTTP狀態碼,跟access.log一樣.表13.1是狀態碼列表.
日期: HTTP響應的Date頭部值,表現為Unix紀元以來的秒數.值-1表示Date頭部不可解析,-2意味著頭部完缺.
最後修改時間: HTTP響應的Last-Modified頭部值,表現為Unix紀元以來的秒數.值-1表示Last-Modified頭部不可解析,-2意味著頭部完缺.
過期時間: HTTP響應的Expires頭部值,表現為Unix紀元以來的秒數.值-1表示Expires頭部不可解析,-2意味著頭部完缺.
內容類型: HTTP響應的Content-Type頭部值,排除了任何media-type參數.假如Content-Type丟失了,Squid插入值unknown.
內容長度/大小: 該域包含2個數字,以斜杠分開.第一個是Content-Length頭部值. -1表明Content-Length頭部不存在.第二個是HTTP消息 body的實際大小.你可使用這2個數字來部分的驗證接受到的響應,並驗證原始伺服器是否不正確的計算了內容長度.大多數情形下,這2個數字相等.
方式: 請求目標的HTTP方式,跟access.log里的一樣.
URI: 最後一個域是請求URI,跟access.log里的一樣.該域也有前述章節提到的空格問題.然而,這里不必為此擔憂,因為你可安全的忽略任何多餘的域.
對許多RELEASE的條目,在最後8個域出現的是疑問號(?).這是因為這些域的大部分值來自squid稱為MemObject的結構.該結構僅在目標已被接受時,或目標被完整存儲在內存時,才會出現. Squid cache里的大部分目標沒有MemObject結構,因為它們僅存在於磁碟.對這些情況,Squid在相應域放置一個疑問號.
簡單分析
squid的日誌很重要.常常要了解的,其中最重要的就是命中率啦,不然反向代理做的用就不大.
#cat access.log|gawk '{print $4}'|sort|uniq -c|sort -nr
9568 TCP_IMS_HIT/304
6313 TCP_HIT/200
2133 TCP_MISS/200
1568 TCP_MISS/206
587 TCP_MEM_HIT/200
531 TCP_MISS/304
207 TCP_REFRESH_HIT/200
152 TCP_REFRESH_HIT/304
86 TCP_NEGATIVE_HIT/404
69 TCP_MISS/404
9 TCP_MISS/000
4 TCP_MISS/503
1 TCP_REFRESH_MISS/000
1 TCP_DENIED/400
可以使用上面的方法,大約的分析一下命令中比.什麼意思就看下面的詳解.
#cat /var/log/squid/access.log |grep TCP_MEM_HIT
如果看到很多的TCP_MEM_HIT ,這表明該文件是從內存緩存讀取的,squid已經起作用了!你再用瀏覽器打開該文件,應該是快如閃電了..呵呵,大功告成了!還有其他類型的HIT,如TCP_HIT等等,這些是從磁碟讀取的,我覺得加速的意義不大,只不過緩解了apache的壓力而已.
相應於HTTP請求,下列標簽可能出現在access.log文件的第四個域.
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等形式記錄.
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(見11.1節).正常的,Squid不會記錄這些重定向.假如要這樣做,必須在編譯squid前,手工定義LOG_TCP_REDIRECTS預處理指令.
NONE
無分類的結果用於特定錯誤,例如無效主機名.
相應於ICP查詢,下列標簽可能出現在access.log文件的第四域.
UDP_HIT
Squid在cache里發現請求資源的貌似新鮮的拷貝.
UDP_MISS
Squid沒有在cache里發現請求資源的貌似新鮮的拷貝.假如同一目標通過HTTP請求,就可能是個cache丟失.請對比UDP_MISS_NOFETCH.
UDP_MISS_NOFETCH
跟UDP_MISS類似,不同的是這里也指示了Squid不願去處理相應的HTTP請求.假如使用了-Y命令行選項,Squid在啟動並編譯其內存索引時,會返回這個標簽而不是UDP_MISS.
UDP_DENIED
因為icp_access規則,ICP查詢被拒絕.假如超過95%的到某客戶端的ICP響應是UDP_DENIED,並且客戶端資料庫激活了(見附錄A),Squid在1小時內,停止發送任何ICP響應到該客戶端.若這點發生,你也可在cache.log里見到一個警告.
UDP_INVALID
Squid接受到無效查詢(例如截斷的消息、無效協議版本、URI里的空格等).Squid發送UDP_INVALID響應到客戶端.
J. 我在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 netsnake@963.net
以下這些參數告訴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」。
按照這個配置應該沒有問題