第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命中率?javascript
1)apache nginx 能夠expries,cache-control緩存頭
2)動靜分離,靜態化,對靜態走CDN
3)mysql cache讓緩存靠前
4)4XX,5XX之類錯誤頁面,死鏈不緩存。css
1.2.2 cache丟失
cache丟失在cache server不能從它的緩存裏知足客戶端HTTP請求時發生。cache丟失的緣由有不少種。html
1)當cache server第一次接收到對第一個新資源的請求時,就會產生一個cache丟失。如何解決第一次命中?前端
預熱或者預取。
a,內部先請求訪問。能夠經過腳本實現(這是個思路但不靠譜)。
b,後端生成數據以後,統一推到前端cache server。即預取,預熱。java
2)存儲空間滿或者對象自身過時,cache server會清除這些緩存對象以釋放空間給新對象。mysql
a,加大內存或者磁盤。
b,過時時間設置的長一些。
c,參數設置,緩存的參數設置大一些。最大緩存對象2M(熱點緩存)。
d,分資源緩存,1M,10M,100M(分拆服務器,acl 正則匹配拋給不一樣的pools)linux
3)還有多是客戶訪問的資源不可到達。原始服務器會指示cache server 怎樣處理用戶響應。例如,它會提示數據不能被緩存,或在有限的時間內才被重複使用等等nginx
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#alweb
1.3 squid服務介紹
- Squid是一個高性能的代理緩存服務器,Squid支持FTP,gopher和HTTP協議。和通常的代理緩存軟件不一樣,Squid用一個單獨的,非模塊化的,I/O驅動的進程來處理全部的客戶端請求。
- Squid將數據元緩存在內存和硬盤中,同時也緩存DNS查詢的結果。Squid支持SSL,支持訪問控制。因爲使用了ICP(輕量Internet緩存協議),Squid可以實現層疊的代理陣列,從而最大限度的節約帶寬。
- Squid Cache(簡稱Squid)是一個流行的代理服務武器和Web緩存服務器軟件。Squid服務有至關多的用途:
- 用於放置在Web服務器的前面,緩存網站Web服務器的相關數據,這樣用戶請求緩存服務器就能夠直接返回數據給用戶了,從而提高了用戶的訪問網站體驗,從另外一方面也減輕了Web服務器,數據庫服務器,圖片文件存儲服務器等業務服務器的壓力。這種應用被稱之爲反向代理服務。
- 用於放置在企業內部關鍵出網位置或者某些共享網絡的前端,緩存內部上網用戶的數據,域名系統和其餘網絡搜索數據等,這樣用戶上網請求的數據,就能夠由緩存服務器返回給內部用戶,而不須要上網了,從而使得內部用戶上網更快,更安全,也會大大節約公司的帶寬。這種應用被稱之爲正向代理服務(普通代理或者透明代理)。
- 經過放在網絡的關鍵位置過濾網絡流量和訪問數據,提高整個網絡安全。例如:能夠監控及限制內部企業員工的上網行爲,能夠和iptables配合做爲辦公網的網關。
- 用做局域網經過代理上網,只要是一臺能夠上網的機器就能夠,位置隨便,讓全部的用戶的瀏覽器設置這個服務器代理上網便可。
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_port | 3128 |
---|---|
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 215379068@qq.com
編輯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 215379068@qq.com
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