1. 程式人生 > 其它 >squid代理與快取實踐(一)

squid代理與快取實踐(一)

第1章 Squid介紹

1.1 快取伺服器介紹

  • 快取伺服器(英文意思cache server),即用來儲存(介質為記憶體及硬碟)使用者訪問的網頁,圖片,檔案等等資訊的專用伺服器。這種伺服器不僅可以使使用者可以最快的得到他們想要的資訊,而且可以大大減少服務端網路傳輸的資料量。快取伺服器往往也是代理伺服器。對於網站的使用者來說,快取伺服器和代理是不可見的,即在使用者看來所有的網站資訊都來自其正在訪問的網站,而實際上可能是快取伺服器在提供訪問資料。
  • 目前國內網際網路公司常用的快取伺服器有:squid,varnish(幾乎絕跡),nginx,ats。
  • squid作為快取和代理伺服器的歷史十分的悠久,本章我們主要講述squid服務,儘管不少人談及其他軟體的快取機制比squid如何優異,但我們還是要首先掌握這個老牌的開源cache軟體,因為它經歷的歷程實在是太悠久了,等大家掌握了squid服務後,其他的軟體就不在話下了。如果再有時間,可以測試下varnish,nginx,squid三者之間的效能對比,而不是輕易的聽信於他人的說法,別人說好,只能代表他個人的觀點,我們自己用事實證明,才是學習和工作的真諦。
  • 國內基本上90%以上的商業CDN公司,象國內的CDN基本都在用squid,象藍汛,網宿,帝聯,sina在用ats。
    Squid官方:http://www.squid-cache.org/

1.2 Web快取相關概念

1.2.1 cache命中

cache命中是在cache server 每次從它的快取裡滿足客戶端HTTP請求時發生。cache命中率,是所有客戶端HTTP請求中命中的比例。Web快取典型的cache命中率在30%到60%之間。另一個相似的度量單位叫做位元組命中率,描繪了cache提供服務的資料容量(位元組數),如何提升cache命中率?

1)apache nginx 可以expries,cache-control快取頭
2)動靜分離,靜態化,對靜態走CDN
3)mysql cache讓快取靠前
4)4XX,5XX之類錯誤頁面,死鏈不快取。

1.2.2 cache丟失

cache丟失在cache server不能從它的快取裡滿足客戶端HTTP請求時發生。cache丟失的原因有很多種。

1)當cache server第一次接收到對第一個新資源的請求時,就會產生一個cache丟失。如何解決第一次命中?

預熱或者預取。
a,內部先請求訪問。可以通過指令碼實現(這是個思路但不靠譜)。
b,後端生成資料之後,統一推到前端cache server。即預取,預熱。

2)儲存空間滿或者物件自身過期,cache server會清除這些快取物件以釋放空間給新物件。

a,加大記憶體或者磁碟。
b,過期時間設定的長一些。
c,引數設定,快取的引數設定大一些。最大快取物件2M(熱點快取)。
d,分資源快取,1M,10M,100M(分拆伺服器,acl 正則匹配拋給不同的pools)

3)還有可能是客戶訪問的資源不可到達。原始伺服器會指示cache server 怎樣處理使用者響應。例如,它會提示資料不能被快取,或在有限的時間內才被重複使用等等

1.2.3 cache確認

  • 對於快取來講,資料的一致性是一個特別頭疼的問題,特別是memcached。
  • cache確認保證cache server不對訪問的使用者返回過期的資料。在重複使用快取物件時,cache server需要經常從原始伺服器確認它。假如伺服器指示squid的拷貝仍然有效,資料就傳送出去。否則,squid更新它的快取拷貝,並且轉發給客戶。
  • 當用戶更新了資料到資料庫或者儲存伺服器的時候,可以從業務角度主動呼叫介面清除該物件快取的指令。CDN 5-15分鐘。
  • 圖片放到CDN了需要更新嗎?不需要更新。圖片修改算更新,這樣的業務就要推送。
  • 網站改版:再CDN上推送JS,css(改名)

from:http://home.arcor.de/mailerstar/jeff/squid/chap01.html#al

1.3 squid服務介紹

  • Squid是一個高效能的代理快取伺服器,Squid支援FTP,gopher和HTTP協議。和一般的代理快取軟體不同,Squid用一個單獨的,非模組化的,I/O驅動的程序來處理所有的客戶端請求。
  • Squid將資料元快取在記憶體和硬碟中,同時也快取DNS查詢的結果。Squid支援SSL,支援訪問控制。由於使用了ICP(輕量Internet快取協議),Squid能夠實現層疊的代理陣列,從而最大限度的節約頻寬。
  • Squid Cache(簡稱Squid)是一個流行的代理服務武器和Web快取伺服器軟體。Squid服務有相當多的用途:
  1. 用於放置在Web伺服器的前面,快取網站Web伺服器的相關資料,這樣使用者請求快取伺服器就可以直接返回資料給使用者了,從而提升了使用者的訪問網站體驗,從另一方面也減輕了Web伺服器,資料庫伺服器,圖片檔案儲存伺服器等業務伺服器的壓力。這種應用被稱之為反向代理服務。
  2. 用於放置在企業內部關鍵出網位置或者某些共享網路的前端,快取內部上網使用者的資料,域名系統和其他網路搜尋資料等,這樣使用者上網請求的資料,就可以由快取伺服器返回給內部使用者,而不需要上網了,從而使得內部使用者上網更快,更安全,也會大大節約公司的頻寬。這種應用被稱之為正向代理服務(普通代理或者透明代理)。
  3. 通過放在網路的關鍵位置過濾網路流量和訪問資料,提升整個網路安全。例如:可以監控及限制內部企業員工的上網行為,可以和iptables配合作為辦公網的閘道器。
  4. 用作區域網通過代理上網,只要是一臺可以上網的機器就可以,位置隨便,讓所有的使用者的瀏覽器設定這個伺服器代理上網即可。

Squid代理伺服器主要用於類Unix系統中執行,其發展歷史相當悠久,功能也相當完善。除了對HTTP支援的很好外,對於FTP與HTTPS的支援也相當好,在3.0測試版中也支援了IPv6,Squid的主頁在http://www.squid-cache.org。目前業界主流CDN都是基於Squid進行二次開發作為cache快取伺服器的。

1.3.1 傳統代理服務原理

傳統的代理伺服器就是前面我們所說的通過瀏覽器設定代理的方法:

windows如何設定代理?

1.3.2 透明代理服務原理

  • 所謂透明代理,是相對於代理伺服器而言,客戶端不需要做任何和代理伺服器相關的設定和操作,對使用者而言,感覺不到代理伺服器的存在,所以稱之為透明代理。即把代理伺服器部署在核心的上網出口,當用戶上網瀏覽頁面時,會交給代理伺服器向外請求,如果結合iptables可以實現代理+閘道器+內容過濾+流量安全控制等完整的上網解決方案。

透明代理流程說明:

使用者A傳送一個訪問請求到防火牆,由防火牆將該使用者的訪問請求轉發到SQUID,SQUID在先檢查自身快取中有無該使用者請求的訪問內容,如果沒有,則請求遠端目的伺服器,獲取該使用者的訪問內容,在返回給使用者的同時,在自身快取保留一份記錄以備下次呼叫;當用戶B傳送一個和使用者A相同的訪問請求時,由防火牆將轉發該使用者請求到SQUID,SQUID檢查自身快取發現有同樣內容後,直接將該內容返回給使用者。

1.3.3 反向代理服務原理

  • 普通代理方式是代理內部網路使用者訪問internet上伺服器的連線請求,客戶端必須指定代理伺服器,並將本來要直接傳送到internet上伺服器的連線請求傳送給代理伺服器處理。反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從內部伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。

反向代理流程說明:

  • SQUID作為反向代理伺服器,通常工作在一個伺服器叢集的前端,在使用者端看來,SQUID伺服器就是他說要訪問的伺服器,而實際意義上SQUID只是接受使用者的請求,同時將用過戶請求轉發給內網真正的WEB伺服器,如果SQUID本身有使用者要訪問的內容,則SQUID直接將資料返回給使用者,起到了快取資料的作用,減少了後端服務的壓力。

1.3.4 三種代理伺服器對比

問:網站什麼時候就需要用squid(CDN)了?

靜態抗不住了,想節省頻寬,節省成本,想提高訪問速度

a,節省頻寬及伺服器成本。
b,提升使用者體驗。
c,源站抗不住了。

1.3.5 淘寶最新CDN架構圖

淘寶:

1.3.6 如何選擇squid服務的版本

  • 目前主流使用的Squid快取服務,大公司,2.7是最多的,基本上90%以上的商業CDN公司,例如國內的CDN,藍汛,網宿,帝聯都在用squid2.7,squid3.0使用C++重寫後,效能上和Squid 2.6和2.7還是有些距離的。使用的人並不是很多,效能穩定性等還有必要在等等看。

第2章 安裝squid硬體和系統要求

2.1 作業系統環境

Squid可以執行在幾乎所有的常見Unix及Linux系統上,也可以在Microsoft Windows上執行。儘管squid的Windows支援在不斷改進,但在Unix及Linux系統上執行Squid依然是更簡單,安全,更有效率,本章我們就使用Centos6.4 x86_64來執行Squid。

2.2 伺服器硬體環境

1)第一重要資源:記憶體

squid對硬體的要求最主要的是記憶體資源。記憶體短缺會嚴重影響效能。因為所有的物件都會盡可能的被快取到記憶體中,這樣才能更快的提升使用者的響應及返回資料。

2)第二重要資源:磁碟

磁碟空間也是另一個squid能夠高效執行的重要因素。更多的磁碟空間意味著更多的快取目標和更高的命中率。快速的磁碟介質也是必要的。例如:用ssd,sas替代sata磁碟,除了使用過raid外,可以指定多個磁碟路徑快取。

3)其他:磁碟與記憶體的關聯

因為squid對每個快取響應使用少數記憶體,因此在磁碟空間和記憶體要求之間有一定聯絡。基本規則是,每G磁碟空間需要32M記憶體。這樣,512M記憶體的系統,能支援16G的磁碟快取。你的情況當然會不同。記憶體需求依賴於如下事實:快取目標大小,CPU體系(32位或64位),同時線上的使用者數量,和你使用的特殊功能。

2.3 虛擬伺服器硬體環境

記憶體:512M
硬碟:8-10G
VM:1-2個,其中一個部署快取伺服器,一個部署web伺服器做測試用。
系統:Centos6.5 x86_64

2.4 虛擬伺服器實施部署前主機規劃列表

名稱介面IP用途
Squid server eth0 192.168.0.190 Squid
Web server eth0 192.168.0.220 nginxWeb

第3章 squid編譯與安裝

3.1 squid下載與解壓

1)下載squid軟體

[root@localhost ~]# wget http://www1.it.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE20.tar.gz
[root@localhost ~]# ls -l squid-3.0.STABLE20.tar.gz 
-rw-r--r--. 1 root root 2452224 Oct 29  2009 squid-3.0.STABLE20.tar.gz

2)解開原始碼包

[root@localhost ~]# tar xf squid-3.0.STABLE20.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/squid-3.0.STABLE20/
[root@localhost squid-3.0.STABLE20]# pwd
/usr/src/squid-3.0.STABLE20

3.2 squid編譯前關鍵核心引數調整

3.2.1 調整檔案描述符

Squid在高負載下,需要大量的核心資源。特別的,你需要給你的系統配置比正常情況更高的檔案描述符和快取,最好在開始編譯squid之前來增加檔案描述符的大小(在系統安裝時我們已經講解過)。squid和核心通過資料結構來交換資訊,資料結構的大小不能超過設定的檔案描述符的限制。squid在執行時檢查這些設定,並且使用最安全的(最小的)值。

檔案描述符:

  • 檔案描述符是一個簡單的整數,用以標明每一個被程序所開啟的檔案和socket。第一個開啟的檔案是0,第二個是1,依此類推。Unix作業系統通常給每個程序能開啟的檔案數量強加一個限制。更甚的是,unix通常有一個系統級的限制(1024).因為squid的工作方式,檔案描述符的限制可能會極大的影響效能。當squid用完所有的檔案描述符後,它不能接收使用者新的連線。也就是說,用完檔案描述符導致拒絕服務。直到一部分當前請求完成,相應的檔案和socket被關閉,squid不能接收新請求。當squid發現檔案描述符短缺時,它會發布警告。
  • 在執行./configure之前,檢查你的系統的檔案描述符限制是否合適,能給你避免一些麻煩。大多數情況下,1024個檔案描述符足夠了。非常忙的cache可能需要4096或更多。在配置檔案描述符限制時,我推薦設定系統級限制的數量為每個程序限制的2倍。
[root@localhost squid-3.0.STABLE20]# cd ~
[root@localhost ~]# ulimit -n
1024

#1024這是linux系統預設情況的值

設定開啟的最大檔案描述符的數目

[root@localhost squid-3.0.STABLE20]# cd ~
[root@localhost ~]# ulimit -n
1024
[root@localhost ~]# ulimit -n 20480 #記得在squid執行前設定好該引數
[root@localhost ~]# ulimit -n
20480
[root@localhost ~]# echo "ulimit -n 20480" >> /etc/rc.local
[root@localhost ~]# tail -1 /etc/rc.local
ulimit -n 20480

3.2.2 調整臨時埠範圍

  • 臨時埠是TCP/IP棧分配給出去連線的本地埠。換句話說,當squid發起一條連線到另一臺伺服器,核心給本地socket分配一個埠號。這些本地埠號有特定的範圍限制。
  • 例如,Centos預設是32768-61000.
  • 臨時埠號的短缺對非常慢的代理伺服器(例如每秒數百個連線)來說,會較大的影響效能。這是因為一些TCP連線在他們被關閉時進入TIME_WAIT狀態。當連線進入TIME_WAIT狀態時,臨時埠號不能被重用。

調整臨時埠範圍方法:

[root@localhost ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
32768	61000
[root@localhost ~]# echo "net.ipv4.ip_local_port_range = 4000 65000" >> /etc/sysctl.conf 
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.ip_local_port_range = 4000 65000
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
4000	65000

3.3 squid編譯前檢視幫助

官方:http://www.squid-cache.org/Versions/v3/3.0/cfgman/

1)進入解壓後的squid目錄

[root@localhost squid-3.0.STABLE20]# more INSTALL   #檢視編譯幫助
To build and install the Squid Cache, type:

	% ./configure --prefix=/usr/local/squid     #安裝過程總共3步
        % make all
        % make install

To run a Cache, you will need to:

	1. customize the squid.conf configuration file:
	      % vi /usr/local/squid/etc/squid.conf      #配置檔案

	2. Initalise the cache:
	      % /usr/local/squid/sbin/squid -z          #初始化快取
	      
	3. start the cache:
	      % /usr/local/squid/sbin/squid             #啟動squid

If you want to use the WWW interface to the Cache Manager, copy
the cachemgr.cgi program into your httpd server's cgi-bin
directory.

3.4 squid編譯安裝

#先安裝依賴
yum -y install openssl-devel

##配置編譯環境
[root@localhost squid-3.0.STABLE20]# ./configure --prefix=/usr/local/squid3 --enable-async-io=100 --with-pthreads --enable-storeio="aufs,diskd,ufs" --enable-removal-policies="heap,lru" --enable-icmp --enable-delay-pools --enable-useragent-log --enable-referer-log --enable-kill-parent-hack --enable-cachemgr-hostname=localhost --enable-arp-acl --enable-default-err-language=English --enable-err-languages="Simplify_Chinese English" --disable-poll --disable-wccp --disable-wccpv2 --disable-ident-lookups --disable-internal-dns --enable-basic-auth-helpers="NCSA" --enable-stacktrace --with-large-files --disable-mempools --with-filedescriptors=64000 --enable-ssl --enable-x-acceletator-vary --disable-snmp --with-aio --enable-linux-netfilter --enable-linux-tproxy
#編譯
[root@localhost squid-3.0.STABLE20]# make
#安裝
[root@localhost squid-3.0.STABLE20]# make install
#把安裝目錄做成軟連線
[root@localhost ~]# ln -s /usr/local/squid3/ /usr/local/squid
[root@localhost ~]# ll -d /usr/local/squid
lrwxrwxrwx. 1 root root 18 Sep 17 20:02 /usr/local/squid -> /usr/local/squid3/

3.5 squid目錄檔案結構介紹

在安裝完後,將在squid的安裝目錄裡(/usr/local/squid/)會看到下列目錄和檔案:

[root@localhost squid]# tree -L 2 /usr/local/squid
/usr/local/squid
├── bin
│ ├── RunAccel
│ ├── RunCache
│ └── squidclient
├── etc
│ ├── cachemgr.conf
│ ├── cachemgr.conf.default
│ ├── mime.conf
│ ├── mime.conf.default
│ ├── squid.conf
│ └── squid.conf.default
├── libexec
│ ├── cachemgr.cgi
│ ├── diskd
│ ├── dnsserver
│ ├── ncsa_auth
│ ├── pinger
│ └── unlinkd
├── sbin
│ └── squid
├── share
│ ├── errors
│ ├── icons
│ ├── man
│ └── mib.txt
└── var
    └── logs

10 directories, 17 files

為了讓同學們理解的更清楚明白,我們把這些內容列成了如下表格:

檔名/目錄名功能描述
sbin squid主從程式的目錄,正常只能被root啟動
sbin/squid Squid的主程式
bin bin目錄包含對所有使用者可用的程式
bin/RunCache RunCache是一個shell指令碼,你能用它來啟動squid。假如squid死掉,該指令碼自動重啟它,除非它檢測到經常的重啟
bin/RunAccel RunAccel與RunCache幾乎一致,唯一不同是它增加了一個命令列引數,告訴squid在哪裡偵聽HTTP請求
bin/squidclient squidclient是個簡單的HTTP客戶端程式,你能用它來測試squid。它也有一些特殊功能,用以對執行的squid程序發起管理請求。
libexec libexec目錄包含了輔助程式。有一些命令你不能正常的啟動。然而,這些程式通常被其他程式啟動
libexec/unlinkd unlinkd是一個輔助程式,它從cache目錄裡刪除檔案
libexec/cachemgr.cgi cachemgr.cgi是Squid管理功能的CGI介面。為了使用它,你需要拷貝該程式到你的WEB伺服器的cgi-bin目錄
libexec/diskd(optional) 假如你指定了--enable-storeio=diskd,你才能看到它
libexec/pinger(optional) 假如你指定了--enable-icmp,你才能看到它
etc etc目錄包含squid的配置檔案
etc/squid.conf 這是squid的主配置檔案
var var目錄包含了不是很重要的和經常變化的檔案。這些檔案不必正常的備份他們
var/logs var/logs目錄是squid不同日誌檔案的預設位置。當你第一次安裝squid時,它是空的。一旦squid開始執行,你能在這裡看到名字為access.log,cache.log和store.log這樣的檔案
var/cache 假如你不在squid.conf檔案裡指定,這是預設的快取目錄(cache_dir)

參考:http://home.arcor.de/mailerstar/jeff/squid/chap03.html

第4章 squid配置介紹

4.1 squid.conf語法

  • Squid的配置檔案相對規範。它與其他許多unix程式相似。每行以配置指令開始,後面跟著數字值或關鍵字。在讀取配置檔案時,squid忽略空行和註釋掉的行(以#開始)。
  • 預設的squid.conf內容有相當多的內容,如下:
[root@localhost ~]# cd /usr/local/squid/etc/
[root@localhost etc]# wc -l squid.conf
4863 squid.conf

#去掉以#開頭的註釋和空行(以#開頭!)
[root@localhost etc]# egrep -v "^#|^$" squid.conf.default > squid.conf
[root@localhost etc]# cat squid.conf | wc -l
37
[root@localhost etc]# cat squid.conf
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 10.0.0.0/8	# RFC1918 possible internal network
acl localnet src 172.16.0.0/12	# RFC1918 possible internal network
acl localnet src 192.168.0.0/16	# RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access deny all
icp_access allow localnet
icp_access deny all
htcp_access allow localnet
htcp_access deny all
http_port 3128
hierarchy_stoplist cgi-bin ?
access_log /usr/local/squid3/var/logs/access.log squid
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern (cgi-bin|\?)	0	0%	0
refresh_pattern .		0	20%	4320
icp_port 3130
coredump_dir /usr/local/squid3/var/cache

4.2 squid服務的使用者

  • 幾乎所有的unix程序和檔案擁有檔案的組和屬主的屬性,你必須建立一個使用者和組給squid服務,該使用者和組的組合,必須對大部分squid相關的檔案和目錄有讀和寫的許可權,所以需要建立“squid”的使用者和組,這避免了某人利用squid來讀取系統中的其他檔案。
  • 執行squid必須以root身份執行,設定配置檔案squid.conf中。cache_effective_user為squid來執行,這個使用者和組的名稱理論上可以任意起。

1)建立squid使用者和組,禁止其登陸

[root@localhost etc]# useradd -s /sbin/nologin -M squid

2)編輯配置檔案squid.conf

#設定啟動賬戶為squid
[root@localhost etc]# echo "cache_effective_user squid" >> /usr/local/squid/etc/squid.conf
[root@localhost etc]# tail -1 /usr/local/squid/etc/squid.conf
cache_effective_user squid

#設定啟動賬戶組為squid
[root@localhost etc]# echo "cache_effective_group squid" >> /usr/local/squid/etc/squid.conf
[root@localhost etc]# tail -1 /usr/local/squid/etc/squid.conf
cache_effective_group squid

#開啟store日誌
[root@localhost etc]# echo "cache_store_log /usr/local/squid/var/logs/store.log" >> /usr/local/squid/etc/squid.conf
[root@localhost etc]# tail -1 /usr/local/squid/etc/squid.conf
cache_store_log /usr/local/squid/var/logs/store.log     #快取物件日誌

#開啟cache日誌
[root@localhost etc]# echo "cache_log /usr/local/squid/var/logs/cache.log" >> /usr/local/squid/etc/squid.conf
[root@localhost etc]# tail -1 /usr/local/squid/etc/squid.conf
cache_log /usr/local/squid/var/logs/cache.log

#開啟磁碟快取cache_dir
[root@localhost etc]# echo "cache_dir ufs /usr/local/squid/var/cache 100 16 256" >> /usr/local/squid/etc/squid.conf
[root@localhost etc]# tail -1 /usr/local/squid/etc/squid.conf
cache_dir ufs /usr/local/squid/var/cache 100 16 256

4.3 squid埠號

  • http_port指令告訴squid在哪個埠偵聽HTTP請求。預設埠是3128:
  • 假如你計劃將squid作為web服務加速器執行,可以將該埠設定為80.
    可以使用附加的http_port行,來指示squid偵聽在多個埠上,例如,來自某個部門的瀏覽器傳送請求到3128,然而另一個部門使用80埠。簡單的將兩個埠號列舉出來:
http_port3128
http_port 8080

也可以使用http_port指令來使squid偵聽在指定的介面地址上,當squid作為防火牆執行時,它有兩個網路介面:一個內部的和一個外部的,為了避免來自外部的http請求,使squid僅僅偵聽在內部介面上,簡單的將IP地址放在埠號的前面:

#squid 僅監聽內網地址,拒絕外部Http請求訪問
http_port 192.168.1.1:3128

4.4 squid日誌檔案

  • squid預設的日誌目錄是squid安裝位置下的logs目錄。例如,假如你在./configure中沒有使用--prefix=選項,那麼預設的日誌檔案路徑是/usr/local/squid/var/logs,必須確認日誌檔案所存放的磁碟位置空間足夠。在squid寫日誌時如果接受到錯誤,它會退出和重啟。該行為的主要理由應引起你的注意,squid想確認你不會丟失任何重要的日誌資訊,特別是你的系統被濫用或者被攻擊時。

squid有三個主要的日誌檔案:cache.log,access.log,store.log。

4.4.1 cache.log日誌檔案

cache.log包含多種訊息,例如Squid的配置資訊,效能警告,以及嚴重錯誤。如下是cache.log的輸出樣本:主要的錯誤和異常條件最可能報告在cache.log裡。


剛開始執行squid時,需要密切關注該檔案。假如squid拒絕執行,原因也許會出現在cache.log檔案的結尾處。在正常條件下,該檔案不會變得很大。假如你以-s選項來執行squid,重要的cache.log資訊也可被送到你的rsyslog程序。通過使用cache_log指令,你以修改配置檔案squid.conf來改變該日誌檔案的路徑。

4.4.2 轉發cache.log訊息到系統日誌

為了讓squid傳送cache.log訊息的拷貝到系統日誌,請使用-s命令列選項。僅僅在debug級別0和1的訊息會被轉發。

4.4.3 access.log日誌檔案

  • Squid把關於HTTP事務的關鍵資訊存放在access.log裡。該檔案是基於行的,也就是說每行對應一個客戶端請求。squid記錄客戶端IP(或主機名),請求URL,響應size等其他資訊。
  • Squid在access.log裡記錄所有HTTP訪問,除了那些在還沒有傳送資料前就斷開的連線。Squid也記錄所有的ICP(非HTCP)事務,除非你使用log_icp_queries指令關閉了這個功能。
  • 預設的access.log格式包含了10個域。如下是日誌樣本,長行分割並且縮排排版。
  • access.log檔案記錄了對squid發起的每個客戶請求。每行平均約150個位元組,也就是說,在接受一百萬條客戶請求後,它的體積約是150M。可以使用cache_access_log指令改變該日誌檔案的路徑:
  • 如果不想squid記錄客戶端請求日誌,修改日誌檔案的路徑為/dev/null即可。

4.4.4 store.log日誌檔案

  • store.log記錄Squid關於儲存或刪除cache目標的決定。對每個存在cache裡的目標每個不可cache的目標,以及每個被輪換策略刪除的目標,Squid都會建立相應的日誌條目。該日誌檔案內容既包含了記憶體cache,又包含了磁碟cache。
  • store.log檔案對大多數cache管理員來說並非很有用,但是我們可以通過這個日誌來解析客戶端訪問的資料是否被快取,它包含了進入和離開快取的每個目標的記錄。使用cache_store_log指令來改變它的位置:
  • 通過指定路徑為none,你能輕易的完全禁止store.log日誌:
  • Squid的日誌檔案增加沒有限制...為了保證日誌檔案大小合理,應建立計劃任務來規律的重新命名和打包日誌。squid有內建的日誌回滾功能,也可以避免單個日誌過於龐大。

4.5 squid的訪問控制

ACL元素是Squid的訪問控制基礎。這裡會告訴你如何指定包括IP地址,埠號,主機名,和URL匹配等變數。每個ACL元素有個名字,在編寫訪問控制規則時需要引用他們。

  • 基本的ACL元素語法如下:
acl name type value1 value2 ...

#例如:
acl Workstations src 10.0.0.0/16     #表示源地址匹配10.0.0.0/16網段

在多數情況下,你能對一個ACL元素列舉多個值。你也可以有多個ACL行。例如,下列兩行配置是等價的:

acl Http_ports port 80 8000 8080
#提示:三個埠是或的關係,or

上面一行與下面三行等價

acl Http_ports port 80
acl Http_ports port 8000
acl Http_ports port 8080

4.5.1 IP地址的acl定義

使用物件:src,dst,myip

squid在ACL裡指定IP地址時,擁有強有力的語法。你能以子網,地址範圍形式編寫地址。squid支援標準IP地址寫法(由“.”連線的4個小於256的數字)。另外,假如你忽略掩碼,squid會自動計算相應的掩碼。例如,下組是相等的:

acl Bar src 172.16.66.0/255.255.255.0
acl Bar src 172.16.66.0/24
acl Squid dst www.squid-cache.org

將ACl主機名轉換到IP地址的過程會延緩squid的啟動。除非絕對必要,請避免使用主機名。

4.5.2 域名的acl定義

使用物件:srcdomain,dstdomain和cache_host_domain指令

域名簡單的就是DNS名字或區域。例如,下面是有效的域名:

www.squid-cache.org
squid-cache.org
org
  • 域名ACL有點深奧,因為相對於匹配域名和子域有點微妙的差別。當ACL域名以“.”開頭,squid將它作為萬用字元,它匹配在該域的任何主機名,甚至域名自身。相反的,如果ACL域名不以“.”開頭,squid使用精確的字串比較,主機名同樣必須被嚴格檢查。
  • 域名匹配可能讓人迷惑,所以繼續往下看,以便你可以真正理解它。如下是兩個稍微不同的ACL。
acl A dstdomain foo.com
acl B dstdomain .foo.com
  • 使用者對http://www.foo.com/的請求匹配ACL B,但不匹配A。ACL A要求嚴格的字串匹配,然而ACL B 裡領頭的點就像萬用字元。
  • 另外,使用者對http://foo.com/的請求同時匹配A和B。儘管在URL主機名裡的foo.com前面沒有字元,但ACL B裡領頭的點仍然導致一個匹配。

4.5.3 正則表示式的acl定義

使用物件:srcdom_regex,dstdom_regex,url_regex,urlpath_regex,browser,referer_regex,ident_regex,proxy_auth_regex,req_mime_type,rep_mime_type

大量的ACL使用正則表示式來匹配字串。對squid來說,最常使用的正則表示式功能用以匹配字串的開頭或結尾。例如,^字元是特殊元字元,它匹配行或字串的開頭:

  • [x] :^http://

    • 該正則表示式匹配任意以http://開頭的URL。$也是特殊的元字元,因為它匹配行或字串的結尾
  • [x] :.jpg$

    • 實際上,該示例也有些錯誤,因為.字元也是特殊元字元。它是匹配任意單個字元的萬用字元。我們實際想要的應該是,見下行:
  • [x] :\.jpg$

    • 反斜槓對這個“.”進行轉義。該正則表示式匹配以.jpg結尾的任意字串。假如你不使用^或$字元,正則表示式的行為就象標準子串搜尋。他們匹配在字串裡任何位置出現的單詞或片語。
    • 對所有的squid正則表示式類,你可以使用大小寫敏感的選項。匹配是預設大小寫敏感的。為了大小寫不敏感,在ACL型別後面使用-i選項。例如:
      acl Foo url_regex -i ^http://www

4.5.4 TCP埠號的acl定義

使用物件:port,myport

該型別是相對的。值是個別的埠號或埠範圍。回想一下TCP埠號是16位值,這樣它的值必須大於0或小於65536。如下是一些示例:

acl Foo port 123
acl Bar port 1-1024
acl Foo port 123 80 443

參考:http://home.arcor.de/jeffpang/squid/chap06.html

4.5.5 method的acl定義

method ACL 指HTTP請求方法。GET是典型的最常用方法,接下來是POST,PUT,和其他。下例說明如何使用method ACL:

acl Uploads method PUT POST

注意:CONNECT方法非常特殊。它是用於通過HTTP代理來封裝某種請求的方法。在處理CONNECT方法和遠端伺服器的埠號時應特別謹慎。就像前面章節講過的一樣,你不希望squid連線到某些遠端服務。你該限制CONNECT方法僅僅能連線到HTTPS/SSL或NNTPS埠(443或563).預設的squid.conf這樣做:

acl CONNECT method CONNECT
acl SSL_ports 443 563
http_access allow CONNECT SSL_ports #限制CONNECT方法僅僅能連線到HTTPS/SSL
http_access deny CONNECT

PURGE 是另一個特殊的請求方法。它是Squid的專有方法,沒有在任何RFC裡定義。它讓管理員能強制刪除快取物件。既然該方法有些危險,squid預設拒絕PURGE請求,除非你定義了ACL引用該方法。否則,任何能訪問cache者也許能夠刪除任意快取物件。在這裡,我建議僅僅允許來自localhost的PURGE。

acl Purge method PURGE
acl localhost src 127.0.0.1/32
http_access allow Purge Localhost
http_access deny Purge

4.5.6 proto的acl定義

該型別指URI訪問(或傳輸)協議。如下是有效值:http,https(same as HTTP/TLS),ftp,gopher,urn,whois和cache_object。也就是說,這些是被squid支援的URL機制名字。例如,假如你想拒絕所有的FTP請求,你可使用下列指令:

acl FTP proto FTP
http_access deny FTP

cache_object機制是squid的特性。它用於訪問squid的快取管理介面,不幸的是,它並非好名字,可能會被改變。預設的squid.conf檔案有許多行限制快取管理訪問:

acl Manager proto cache_object
acl Localhost src 127.0.0.1
http_access allow Manager Localhost
http_access deny Manager

4.5.7 url_regex的acl定義

url_regex ACL用於匹配請求URL的任何部分,包括傳輸協議和原始伺服器主機名。例如,如下ACL匹配從FTP伺服器的MP3檔案請求:

acl FTPMP3 url_regex -i ^ftp://.*\.mp3$
acl sex url_regex -i ^http://.*sex.*

4.5.8 urlpath_regex的acl定義

urlpath_regex與url_regex非常相似,不過傳輸協議和主機名不包含在匹配條件裡。這讓某些型別的檢測非常容易。例如,假設你必須拒絕URL裡的"sex",但仍允許在主機名裡含有"sex"的請求,那麼這樣做:

acl Sex urlpath_regex sex
http_access deny Sex

另一個例子,假如你想特殊處理cgi-bin請求,你能這樣捕獲它們:

acl CGI1 urlpath_regex ^/cgi-bin

當然,CGI程式並非總在/cgi-bin/目錄下,這樣你應該編寫其他的ACL來捕獲它們。

4.5.9 更多acl定義見squid配置檔案

(1)限制同一IP客戶端的最大連線數

acl OverConnLimit maxconn 16        #定義連線數16
http_access deny OverConnLimit      #拒絕達到16個的

(2)防止天涯盜鏈,轉嫁給百度

acl tianya referer_regex -i tianya  #referer含有tianya
http_access deny tianya         #拒絕
deny_info http://www.baidu.com/logs.gif tianya  #拒絕資訊回百度

(3)防止被人利用為HTTP代理,設定允許訪問的IP地址

acl myip dst 192.168.1.1
http_access deny !myip

(4)防止百度機器人爬死伺服器

acl AntiBaidu req_header User-Agent Baiduspider
http_access deny AntiBaidu

(5)允許本地管理

acl Manager proto cache_object
acl Localhost src 127.0.0.1 192.168.1.1
http_access allow Manger Localhost

提示:
更多acl定義及用法請見acl配置檔案401行到603行
sed -n '401,603p' /usr/local/squid/etc/squid.conf.default

4.6 Squid如何匹配訪問控制元素

理解squid如何搜尋ACL元素去匹配是很重要的。當ACL元素有多個值時,任何單個值能導致匹配。也就是說,squid在檢查ACL元素值時使用OR邏輯。當squid找到第一個值匹配時,它停止搜尋。這意味著把最可能匹配的值放在列表開頭處,能減少延時。

重點強調:

(1)squid在搜尋ACL元素時使用的"或"邏輯。在acl裡的任何單值都可以導致匹配。
(2)而應用訪問規則恰好相反。對http_access和其他規則設定,squid使用"與"邏輯。

squid預設的配置檔案拒絕每一個客戶請求。在任何人能使用代理之前,你必須在squid.conf檔案里加入附加的訪問控制規則。最簡單的方法就是定義一個針對客戶IP地址的ACL和一個訪問規則,告訴squid允許來自這些地址的HTTP請求。squid有許多不同的ACL型別。src型別匹配客戶IP地址,squid會針對客戶HTTP請求檢查http_access規則。這樣,你就需要增加兩行:

acl MyNetwork src 192.168.0.0/16
http_access allow MyNetwork

這兩行需要放在正確的位置。http_access的順序非常重要,但是acl行的順序不必介意。squid預設的配置檔案包含了一些重要的訪問控制,最好不要改變或刪除它們,除非你完全理解他們的意義。在你第一次編輯squid.conf檔案時,請看如下注釋:

#INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

在該註釋之後,以及"http_access deny all"之前插入你自己的規則,即MyNetwork的定義,如下是:

一個典型的ACL設定,請大家用心理解。

#定義squid acl訪問控制規則
acl Safe_ports port 80
acl SSL_ports port 443
acl lannet src 10.0.0.0/24
acl localhost src 127.0.0.1/255.255.255.255
acl webip dst 10.0.0.8
acl webdomain dstdomain .yunjisuan.com
acl manager proto cache_object
acl CONNECT method CONNECT

#應用squid acl訪問控制規則
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
acl MyNetwork src all
http_access allow MyNetwork
http_access allow lannet
http_access deny all

#關於acl all src 0.0.0.0/0.0.0.0,在squid 3裡,已經預設定義了all範圍,所以不需要像squid 2.x那樣手動定義all了

4.7 squid可見主機名

  • 如果不設定可見主機名,squid可能會報錯無法執行。
  • 設定主機名有如下好處:
  • 主機名出現在squid的錯誤訊息裡,這幫助使用者驗證潛在問題的源頭。
  • 主機名出現在squid轉發的cache單元的HTTP Via頭裡。當請求到達原始主機時,Via頭包含了在傳輸過程中涉及的代理列表。squid也使用Via頭來檢測轉發環路。
  • 通過修改squid配置檔案squid.conf中visible_hostname欄位,可修改可見主機名:
[root@localhost etc]# sed -n '2965,2987p' /usr/local/squid/etc/squid.conf.default 
#
#Default:
# httpd_suppress_version_string off

#  TAG: visible_hostname
#	If you want to present a special hostname in error messages, etc,
#	define this.  Otherwise, the return value of gethostname()
#	will be used. If you have multiple caches in a cluster and
#	get errors about IP-forwarding you must set them to have individual
#	names with this setting.
#
#Default:
# none

#  TAG: unique_hostname
#	If you want to have multiple machines with the same
#	'visible_hostname' you must give each machine a different
#	'unique_hostname' so forwarding loops can be detected.
#
#Default:
# none
visible_hostname www.yunjisuan.com

#如果不指定可見主機名,那麼系統會返回squid服務的主機名(也可能導致服務無法啟動)

編輯squid.conf配置檔案,新增可見主機名

[root@localhost etc]# echo "visible_hostname www.yunjisuan.com" >> /usr/local/squid/etc/squid.conf
[root@localhost etc]# tail -1 /usr/local/squid/etc/squid.conf
visible_hostname www.yunjisuan.com

4.8 squid管理聯絡資訊

設定cache_mgr指令作為對使用者的幫助,它是一個email地址,假如故障發生,使用者能寫信給管理員來通知管理員,cache_mgr地址默認出現在squid的錯誤訊息裡,修改配置檔案squid.conf中cache_mgr欄位。

cache_mgr [email protected]

編輯squid.conf配置檔案,新增郵件聯絡人資訊

[root@localhost etc]# echo "cache_mgr 215379068@qq.com" /usr/local/squid/etc/squid.conf
[root@localhost etc]# tail -1 /usr/local/squid/etc/squid.conf
cache_mgr [email protected]

4.9 squid最終的配置檔案

根據以上的設定之後,squid.conf的內容如下:

[root@localhost etc]# cat /usr/local/squid/etc/squid.conf
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 10.0.0.0/8	# RFC1918 possible internal network
acl localnet src 172.16.0.0/12	# RFC1918 possible internal network
acl localnet src 192.168.0.0/16	# RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access deny all
icp_access allow localnet
icp_access deny all
htcp_access allow localnet
htcp_access deny all
http_port 3128
hierarchy_stoplist cgi-bin ?
access_log /usr/local/squid3/var/logs/access.log squid
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern (cgi-bin|\?)	0	0%	0
refresh_pattern .		0	20%	4320
icp_port 3130
coredump_dir /usr/local/squid3/var/cache

#以下是新增的修改內容
cache_effective_user squid      #程式執行賬戶
cache_effective_group squid     #程式執行賬戶組
cache_store_log /usr/local/squid/var/logs/store.log     #store日誌
cache_log /usr/local/squid/var/logs/cache.log           #cache日誌
cache_dir ufs /usr/local/squid/var/cache 100 16 256     #cache快取
visible_hostname www.yunjisuan.com                      #可見主機名
cache_mgr 215379068@qq.com                              #郵件聯絡人

第5章 執行squid並實現squid的普通代理模式

5.1 Squid主程式命令列選項

在執行squid前,需要了解squid主程式命令列選項。執行如下命令可以獲得系統幫助:

[root@localhost etc]# /usr/local/squid/sbin/squid -h
Usage: squid [-cdhvzCDFNRVYX] [-s | -l facility] [-f config-file] [-[au] port] [-k signal]
       -a port   Specify HTTP port number (default: 3128).
       -d level  Write debugging to stderr also.
       -f file   Use given config-file instead of   #指定配置檔案啟動;重要
                 /usr/local/squid3/etc/squid.conf
       -h        Print help message.
       -k reconfigure|rotate|shutdown|interrupt|kill|debug|check|parse  #控制服務執行狀態;重要
                 Parse configuration file, then send signal to 
                 running copy (except -k parse) and exit.
       -s | -l facility
                 Enable logging to syslog.
       -u port   Specify ICP port number (default: 3130), disable with 0.
       -v        Print version.
       -z        Create swap directories    #初始化快取;重要
       -C        Do not catch fatal signals.
       -D        Disable initial DNS tests. #禁止DNS解析;重要
       -F        Dont serve any requests until store is rebuilt.
       -N        No daemon mode.        #不啟用後臺模式
       -R        Do not set REUSEADDR on port.
       -S        Double-check swap during rebuild.
       -X        Force full debugging.      #強制debug模式
       -Y        Only return UDP_HIT or UDP_MISS_NOFETCH during fast reload.

5.2 檢查配置檔案語法

/usr/local/squid/sbin/squid -k parse 檢查語法的命令

[root@localhost etc]# /usr/local/squid/sbin/squid -k parse      #檢查語法
2017/09/18 05:17:06| Processing Configuration File: /usr/local/squid3/etc/squid.conf (depth 0)
2017/09/18 05:17:06| Initializing https proxy context
WARNING: Cannot write log file: /usr/local/squid/var/logs/cache.log
/usr/local/squid/var/logs/cache.log: Permission denied  #出現錯誤,許可權拒絕
         messages will be sent to 'stderr'.
[root@localhost etc]# ll -d /usr/local/squid/var/logs   #檢視目錄許可權
drwxr-xr-x. 2 root root 4096 Sep 17 19:59 /usr/local/squid/var/logs #沒有授權程式使用者訪問
[root@localhost etc]# chown -R squid /usr/local/squid/var/logs  #遞迴授權屬主為squid
[root@localhost etc]# /usr/local/squid/sbin/squid -k parse  #再次檢查語法
2017/09/18 05:19:36| Processing Configuration File: /usr/local/squid3/etc/squid.conf (depth 0)
2017/09/18 05:19:36| Initializing https proxy context

5.3 初始化cache目錄

在執行squid之前,或者增加了新的cache_dir,你必須初始化cache,命令為:squid -z

1)設定環境變數,或者做命令的軟連線

[root@localhost squid]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
[root@localhost squid]# ln -s /usr/local/squid/bin/* /usr/local/bin/
[root@localhost squid]# which squid
/usr/local/sbin/squid

2)初始化cache

[root@localhost squid]# squid -z    #初始化快取命令
2017/09/18 05:26:07| Creating Swap Directories  
FATAL: Failed to make swap directory /usr/local/squid/var/cache: (13) Permission denied #報錯,許可權拒絕
[root@localhost squid]# ll -d /usr/local/squid/var/ #原來是目錄對於程式使用者沒有許可權
drwxr-xr-x. 3 root root 4096 Sep 17 19:59 /usr/local/squid/var/
[root@localhost squid]# chown -R squid /usr/local/squid/var/    #授權程式使用者squid
[root@localhost squid]# squid -z        #再次初始化cache
2017/09/18 05:27:00| Creating Swap Directories
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/00
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/01
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/02
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/03
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/04
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/05
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/06
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/07
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/08
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/09
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/0A
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/0B
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/0C
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/0D
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/0E
2017/09/18 05:27:00| Making directories in /usr/local/squid/var/cache/0F

5.4 光碟安裝一些必須的工具

[root@localhost squid]# yum -y install tree telnet dos2unix

檢視快取目錄

[root@localhost squid]# tree /usr/local/squid/var/cache/

5.5 在終端窗口裡測試啟動squid

初始化cache目錄後,就可以在終端窗口裡執行squid,將日誌記錄到標準日子裡,就可以輕易的定位任何錯誤或問題,並且確認squid是否成功啟動。

[root@localhost squid]# squid -N -d1        #以debug除錯模式在前臺啟動squid
2017/09/18 05:37:01| Starting Squid Cache version 3.0.STABLE20 for x86_64-unknown-linux-gnu...
2017/09/18 05:37:01| Process ID 59661
2017/09/18 05:37:01| With 4096 file descriptors available
2017/09/18 05:37:01| Performing DNS Tests...
2017/09/18 05:37:02| Successful DNS name lookup tests...
2017/09/18 05:37:02| helperOpenServers: Starting 5/5 'dnsserver' processes
2017/09/18 05:37:02| User-Agent logging is disabled.
2017/09/18 05:37:02| Referer logging is disabled.
2017/09/18 05:37:02| Unlinkd pipe opened on FD 14
2017/09/18 05:37:02| Swap maxSize 102400 + 8192 KB, estimated 8507 objects
2017/09/18 05:37:02| Target number of buckets: 425
2017/09/18 05:37:02| Using 8192 Store buckets
2017/09/18 05:37:02| Max Mem  size: 8192 KB
2017/09/18 05:37:02| Max Swap size: 102400 KB
2017/09/18 05:37:02| Rebuilding storage in /usr/local/squid/var/cache (DIRTY)
2017/09/18 05:37:02| Using Least Load store dir selection
2017/09/18 05:37:02| Set Current Directory to /usr/local/squid3/var/cache
2017/09/18 05:37:02| Loaded Icons.
2017/09/18 05:37:02| Accepting  HTTP connections at 0.0.0.0, port 3128, FD 15.
2017/09/18 05:37:02| Accepting ICP messages at 0.0.0.0, port 3130, FD 16.
2017/09/18 05:37:02| HTCP Disabled.
2017/09/18 05:37:02| Pinger socket opened on FD 18
2017/09/18 05:37:02| Ready to serve requests.           #出現這個表示啟動成功!
2017/09/18 05:37:03| Done scanning /usr/local/squid/var/cache swaplog (0 entries)
2017/09/18 05:37:03| Finished rebuilding storage from disk.
2017/09/18 05:37:03|         0 Entries scanned
2017/09/18 05:37:03|         0 Invalid entries.
2017/09/18 05:37:03|         0 With invalid flags.
2017/09/18 05:37:03|         0 Objects loaded.
2017/09/18 05:37:03|         0 Objects expired.
2017/09/18 05:37:03|         0 Objects cancelled.
2017/09/18 05:37:03|         0 Duplicate URLs purged.
2017/09/18 05:37:03|         0 Swapfile clashes avoided.
2017/09/18 05:37:03|   Took 0.91 seconds (  0.00 objects/sec).
2017/09/18 05:37:03| Beginning Validation Procedure
2017/09/18 05:37:03|   Completed Validation Procedure
2017/09/18 05:37:03|   Validated 25 Entries
2017/09/18 05:37:03|   store_swap_size = 0
2017/09/18 05:37:03| storeLateRelease: released 0 objects

注意:
此時命令列無法再繼續輸入命令了,如果要檢視視窗可以單開一個視窗進行檢視

一旦你見到"Ready to requests"訊息,就可用一些HTTP請求來測試squid;你的瀏覽器使用squid作為代理,然後開啟某個web頁面。假如squid工作正常,正常載入就像沒用過squid一樣。

5.6 進行squid代理測試

(1)設定squid伺服器為瀏覽器進行代理

(2)重啟瀏覽器,登陸一個網頁,比如www.baidu.com

[root@localhost ~]# tail /usr/local/squid/var/logs/access.log
1505728306.391     18 192.168.0.110 TCP_MISS/200 353 GET http://suggestion.baidu.com/su? - DIRECT/123.125.114.101 text/javascript
1505728307.520  61084 192.168.0.110 TCP_MISS/200 5569 CONNECT cm.g.doubleclick.net:443 - DIRECT/203.208.51.57 -
1505728307.543     22 192.168.0.110 TCP_MISS/000 0 GET http://suggestion.baidu.com/su? - DIRECT/123.125.114.101 -
1505728309.726     27 192.168.0.110 TCP_MISS/200 422 GET http://suggestion.baidu.com/su? - DIRECT/123.125.114.101 text/javascript
1505728309.871     25 192.168.0.110 TCP_MISS/200 422 GET http://suggestion.baidu.com/su? - DIRECT/123.125.114.101 text/javascript
1505728310.162     33 192.168.0.110 TCP_MISS/200 423 GET http://suggestion.baidu.com/su? - DIRECT/123.125.114.101 text/javascript
1505728310.240     23 192.168.0.110 TCP_MISS/200 417 GET http://suggestion.baidu.com/su? - DIRECT/123.125.114.101 text/javascript
1505728310.384     35 192.168.0.110 TCP_MISS/200 384 GET http://suggestion.baidu.com/su? - DIRECT/123.125.114.101 text/javascript
1505728310.440     19 192.168.0.110 TCP_MISS/200 356 GET http://suggestion.baidu.com/su? - DIRECT/123.125.114.101 text/javascript
1505728310.692     17 192.168.0.110 TCP_MISS/302 600 GET http://www.baidu.com/ - DIRECT/61.135.169.125 text/html         #記錄在案

到這裡位置,我們就是想了squid的普通(傳統)代理模式
預設情況下,squid是普通代理模式

5.7 將squid作為服務程序執行

正常情況下你想將squid以後臺程序執行(不出現在終端窗口裡)。最容易的方法是簡單執行如下命令:

[root@localhost squid]# /usr/local/squid/sbin/squid -D
[root@localhost squid]# netstat -antup | grep 3128
tcp        0      0 0.0.0.0:3128                0.0.0.0:*                   LISTEN      59774/(squid)       
tcp        0      0 192.168.0.190:3128          192.168.0.110:57625         TIME_WAIT   -  

-D:跳過DNS初始化檢測

特別說明:
-s 選項導致squid將重要的狀態和警告資訊寫到syslogd,同樣的訊息被寫進cache.log檔案,忽略-s選項也是安全的。注意日誌檔案cache.log,無論squid以什麼方式執行,cache.log總會記錄squid的日誌資訊,有時候squid服務意外終止,通過這個檔案也能檢視到很重要的資訊。

5.8 開機自啟動squid

通常squid在每次伺服器重啟後需要自動啟動,有如下兩種方法可以實現squid的自動啟動:

5.8.1 將啟動命令追加入/etc/rc.local

最容易的方法是修改/etc/rc.local指令碼,在每次系統啟動時以root執行。使用該指令碼來啟動squid非常容易,增加如下行到/etc/rc.lcoal裡。

[root@localhost squid]# echo "#startup squid by Mr.chen at 2017/9/21" >> /etc/rc.local
[root@localhost squid]# echo "/usr/local/squid/sbin/squid -D" >> /etc/rc.local
[root@localhost squid]# tail -2 /etc/rc.local
#startup squid by Mr.chen at 2017/9/21
/usr/local/squid/sbin/squid -D
  • 當然你的安裝位置可能不同,還有你可能要使用其他命令列選項。不要在這裡使用-N選項(會列印很多除錯日誌,這在生產環境中檢查日誌是非常痛苦的)。
  • 如果沒有使用cache_effective_user指令設定squid使用者,你可以嘗試使用su來讓squid以非root使用者執行:
  • /usr/bin/su -nobody -c '/usr/local/squid/sbin/squid -s' 這樣也是可以的。
    但是設定cache_effective_user為root使用者執行是絕對不允許的。

5.8.2 使用init.d和rc.d機制啟動

(1)編寫squid啟動指令碼

#!/bin/sh
# chkconfig:345 88 14
# description:squid Daemon
case "$1" in 
start)
    /usr/local/squid/sbin/squid -D
    ;;
stop)
    /usr/local/squid/sbin/squid -k shutdown
    ;;
restart)
    /usr/local/squid/sbin/squid -k reconfigure
    ;;
parse)
    /usr/local/squid/sbin/squid -k parse
    ;;
check)
    /usr/local/squid/sbin/squid -k check
    ;;
*)
    echo "Usage:$0  start|stop|restart|check|parse"
    ;;
esac

(2)新增squid開機自動啟動服務

拷貝squid啟動指令碼到/etcc/rc.d/init.d目錄下

chmod +x /etc/init.d/squid
chkconfig --add squid

檢視squid服務是否已經成功加上

chkconfig --list squid

5.9 啟動squid服務

啟動squid服務方法有兩種,一種是直接執行squid程式,另外一種是通過服務啟動squid

直接執行squid程式

/usr/local/squid/sbin/squid -D

通過服務啟動squid

/usr/local/squid/sbin/squid -k shutdown
/etc/init.d/squid start

啟動完成後,記得檢查squid程序啟動情況

ps -ef | grep squid | grep -v grep

5.10 停止squid

停止squid服務方法有兩種,一種是直接執行squid程式,另外一種是通過服務停止squid

直接執行squid程式

/usr/local/squid/sbin/squid -k shutdown

通過服務停止squid

/etc/init.d/squid stop

5.11 squid日誌輪詢

加入squid的訪問日誌每天有上G,那麼我們需要每天對squid的日誌進行回滾,回滾的方法是如下:

/usr/lcoal/squid/sbin/squid -k rotate

一旦執行squid日誌回滾,這個命令會把access.log,store.log,cache.log都回滾

[root@localhost squid]# /usr/local/squid/sbin/squid -k rotate
#每執行一次回滾,就會產生一個新的回滾日誌,但是最多的回滾數為squid.conf中的logfile_rotate引數,預設是10個,即副檔名0-9,並且包含一個最新的日誌檔案(不帶下標)

[root@localhost squid]# tree /usr/local/squid/var/logs/
/usr/local/squid/var/logs/
├── access.log
├── access.log.0
├── cache.log
├── cache.log.0
├── squid.pid
├── store.log
└── store.log.0

0 directories, 7 files

  • 日誌回滾主要避免單個日誌檔案過大導致squid崩潰的問題,有些較老的系統版本檔案大小有2GB限制,所以需要定期回滾一次,並且還可以節省磁碟空間。
  • 除非你在squid.conf裡禁止,squid會寫大量的日誌檔案。你必須週期性的滾動日誌檔案,以阻止他們變得太大。squid將大量的重要資訊寫入日誌,假如寫不進去了,squid會發生錯誤並退出。為了合理控制磁碟空間消耗,在cron裡使用如下命令:

squid -k rotate

例如:如下任務介面在每天的早上0點滾動日誌:

0 0 * * * /bin/sh /server/scripts/rotate_squid.sh > /dev/null 2>&1

#!/bin/bash
#cat /server/scripts/rotate_squid.sh
cd /usr/local/squid/var/logs/
[ -f access.log ] && mv access.log  access_$(date +%F).log
[ -f store.log ] && mv store.log  store_$(date +%F).log
[ -f cache.log ] && mv cache.log  cache_$(date +%F).log
/usr/local/squid/sbin/squid -k rotate
  • 該命令做兩件事。首先,它關閉當前開啟的日誌檔案。然後,通過在檔名後加數字副檔名,它重新命名cache.log,store.log和access.log。例如,cache.log變成cache.log.0,cache.log.0變成cache.log.1,如此繼續,滾動到logfile_rotate選項指定的值。
  • squid僅僅儲存每個日誌檔案的最後logfile_rotate版本。更老的版本在重新命名過程中被刪除。假如你想儲存更多的拷貝,你需要增加logfile_rotate限制,或者編寫指令碼用於將日誌檔案移動到其他位置上。

5.12 實戰測試squid服務acl控制

acl sex_host url_regex -i ^http://.*yunjisuan.*
acl sex_path urlpath_regex2561410
http_access deny sex_path
http_access deny sex

提示:放置位置要注意
同學們開始自己實驗

5.13 利用Web介面來管理squid

squid有一個cachemgr.cgi的程式,可以Web來顯示內容,這個對於調整squid的引數很是方便。可以平時我們安裝完squid後其實就有這個程式了。我們只要在Apache中配置以下即可。

(1)安裝apache服務

yum -y install httpd

(2)查詢cachemgr.cgi的存放位置

[root@localhost ~]# find /usr/local/squid/ -name "cachemgr.cgi"
/usr/local/squid/libexec/cachemgr.cgi

(3)配置Apache中的squid。加入cachemgr.cgi來顯示。

#在http配置檔案里加入如下6行。
[root@localhost ~]# tail -6 /etc/httpd/conf/httpd.conf
ScriptAlias "/squid" "/usr/local/squid/libexec/cachemgr.cgi"
<Location "/squid">
	Order	deny,allow
	Deny	from all
	Allow	from all
</location>

(4)為了避免和後邊的squid反向代理衝突,http修改埠為8080

[root@localhost ~]# sed -n '136p' /etc/httpd/conf/httpd.conf
Listen 80
[root@localhost ~]# sed -i '136 s#80#8080#g' /etc/httpd/conf/httpd.conf
[root@localhost ~]# sed -n '136p' /etc/httpd/conf/httpd.conf
Listen 8080

(5)啟動apache服務

[root@localhost ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the servers fully qualified domain name, using ::1 for ServerName                    #忽略提示即可
                                                           [  OK  ]
[root@localhost ~]# netstat -antup | grep 8080
tcp        0      0 :::8080                     :::*                        LISTEN      1395/httpd    

(6)瀏覽器訪問http://IP地址(squid伺服器):埠號/squid/

(7)登陸squid管理Web介面

附錄一:squid編譯引數詳細解釋

#指定安裝路徑
./configure --prefix=/usr/local/squid3 \
#
--enable-debug-cbdata \
#使用100個執行緒進行同步IO
--enable-async-io=100 \
#使用POSIX(可移植性作業系統介面)執行緒
--with-pthreads \
#Squid支援大量的不同儲存模組。該選項指定squid編譯時使用哪個模組
--enable-storeio="aufs,diskd,ufs" \
#指定排除元素,排除元素是squid需要騰出空間給新的cache目標時,用以排除舊目標的機制。squid在2.5支援3個排除元素:最少近期使用(LRU),貪婪對偶大小(GDS),最少經常使用(LFU)。
--enable-removal-policies="heap,lru" \
#啟用ICMP,為了啟用netdb,必須使用--enable-icmp選項來配置squid。也必須以超級使用者許可權來安裝pinger程式。
--enable-icmp \
#啟用延遲池。延時池是squid用於傳輸形狀或頻寬限制的技術。該池由大量的客戶端IP地址組成。當來自這些客戶端的請求處於cache丟失狀態,他們的響應可能被人工延遲。
--enable-delay-pools \
#該選項啟用來自客戶請求的HTTP使用者代理日誌
--enable-useragent-log \
#該選項啟用來自客戶請求的HTTP referfer日誌
--enable-referer-log \
#遇到駭客時才有用,自動反hackers
--enable-kill-parent-hack \
#squid在一些作業系統中支援ARP,或者以太地址訪問控制列表。該程式碼使用非標準的函式介面,來執行ARP訪問控制列表,所以它預設被禁止。假如,你在linux或solaris上使用squid,你可能用的上這個功能。
--enable-arp-acl \
#該選項設定error_directory指令的預設值
--enable-default-err-language=Simplify_Chinese \
#該選項指定複製到安裝目錄($prefix/share/errors)的語言。假如你不使用該選項,所有可用語言被安裝。
--enable-err-languages="Simplify_Chinese English" \
#強制使用“poll()”函式掃描檔案描述符
--disable-poll \
#禁用WCCP協議
--disable-wccp \
#禁用WCCP協議V2
--disable-wccpv2 \
#禁用ident協議
--disable-ident-lookups \
#禁用內部DNS
--disable-internal-dns \
#設定基礎幫助名單
--enable-basic-auth-helpers="NCSA" \
#啟用崩潰追蹤,squid崩潰後會自動記錄cache.log
--enable-stacktrace \
#啟用大檔案服務
--with-large-files \
#禁用mempools
--disable-mempools \
#預設的檔案描述符是65535
--with-filedescriptors=65535 \
#支援SSL
--enable-ssl \
#該高階功能可能在squid被配置成加速器時使用。它建議squid在響應請求時,從後臺原始伺服器中尋找X-Accelerator-Vary頭。
--enable-x-acceletator-vary
#Enable Transparent Proxy support for Linux (Netfilter)
--enable-linux-netfilter
#Enable real Transparent Proxy support for Netfilter
--enable-linux-tproxy

附錄二:生產環境squid3.0的編譯引數展示

squid3.0實際編譯的引數:

./configure --prefix=/usr/local/squid3 \
--enable-async-io=100 \
--with-pthreads \
--enable-storeio="aufs,diskd,ufs" \
--enable-removal-policies="heap,lru" \
--enable-icmp \
--enable-delay-pools \
--enable-useragent-log \
--enable-referer-log \
--enable-kill-parent-hack \
--enable-cachemgr-hostname=loccalhost \
--enable-arp-acl \
--enable-default-err-language=English \
--enable-err-languages="Simplify_Chinese English" \
--disable-poll \
--disable-wccp \
--disable-wccpv2 \
--disable-ident-lookups \
--disable-internal-dns \
--enable-basic-auth-helpers="NCSA" \
--enable-stacktrace \
--with-large-files \
--disable-mempools \
--with-filedescriptors=64000 \
--enable-ssl \
--enable-x-acceletator-vary \
--disable-snmp \
--with-aio \
--enable-linux-netfilter \
--enable-linux-tproxy