squid代理與緩存(上)
1. Squid介紹
1.1 緩存服務器介紹
- 緩存服務器(英文意思cache server),即用來存儲(介質為內存及硬盤)用戶訪問的網頁,圖片,文件等等信息的專用服務器。這種服務器不僅可以使用戶可以最快的得到他們想要的信息,而且可以大大減少服務端網絡傳輸的數據量。緩存服務器往往也是代理服務器。對於網站的用戶來說,緩存服務器和代理是不可見的,即在用戶看來所有的網站信息都來自其正在訪問的網站,而實際上可能是緩存服務器在提供訪問數據。
- 目前國內互聯網公司常用的緩存服務器有:squid,varnish(幾乎絕跡),nginx,ats。
- 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命中率?
- apache nginx 可以expries,cache-control緩存頭
- 動靜分離,靜態化,對靜態走CDN
- mysql cache讓緩存靠前
- 4XX,5XX之類錯誤頁面,死鏈不緩存。
1.2.2 cache丟失
cache丟失在cache server不能從它的緩存里滿足客戶端HTTP請求時發生。cache丟失的原因有很多種
(1)當cache server第一次接收到對第一個新資源的請求時,就會產生一個cache丟失。如何解決第一次命中?
預熱或者預取。
- 內部先請求訪問。可以通過腳本實現(這是個思路但不靠譜)。
- 后端生成數據之后,統一推到前端cache server。即預取,預熱。
(2)存儲空間滿或者對象自身過期,cache server會清除這些緩存對象以釋放空間給新對象。
- 加大內存或者磁盤。
- 過期時間設置的長一些。
- 參數設置,緩存的參數設置大一些。最大緩存對象2M(熱點緩存)。
- 分資源緩存,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(改名)
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)了?
靜態抗不住了,想節省帶寬,節省成本,想提高訪問速度
- 節省帶寬及服務器成本。
- 提升用戶體驗。
- 源站抗不住了。
1.3.5 如何選擇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 服務器硬件環境
2.2.1 第一重要資源:內存
squid對硬件的要求最主要的是內存資源。內存短缺會嚴重影響性能。因為所有的對象都會盡可能的被緩存到內存中,這樣才能更快的提升用戶的響應及返回數據。
2.2.2 第二重要資源:磁盤
磁盤空間也是另一個squid能夠高效運行的重要因素。更多的磁盤空間意味着更多的緩存目標和更高的命中率。快速的磁盤介質也是必要的。例如:用ssd,sas替代sata磁盤,除了使用過raid外,可以指定多個磁盤路徑緩存。
2.2.3 其他:磁盤與內存的關聯
因為squid對每個緩存響應使用少數內存,因此在磁盤空間和內存要求之間有一定聯系。基本規則是,每G磁盤空間需要32M內存。這樣,512M內存的系統,能支持16G的磁盤緩存。你的情況當然會不同。內存需求依賴於如下事實:緩存目標大小,CPU體系(32位或64位),同時在線的用戶數量,和你使用的特殊功能。
2.3 虛擬服務器硬件環境
名稱 | 環境 |
---|---|
內存 | 1G |
硬盤 | 20G |
VM | 1-2個,其中一個部署緩存服務器,一個部署web服務器做測試用 |
系統 | Centos7.6 x86_64 |
2.4 虛擬服務器實施部署前主機規划列表
| 名稱 | IP | 用途 |
| :--: | :--: |
| Squid-Server | 192.168.200.13 | Squid |
3. squid編譯與安裝
3.1 squid下載與解壓
3.1.1 下載squid軟件
[root@Squid-Server ~]# which wget
/usr/bin/wget
[root@Squid-Server ~]# wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.26.tar.gz
[root@Squid-Server ~]# ll -d squid-3.5.26.tar.gz
-rw-r--r-- 1 root root 4838368 6月 20 15:47 squid-3.5.26.tar.gz
3.1.2 解開源代碼包
[root@Squid-Server ~]# tar xf squid-3.5.26.tar.gz -C /usr/src/
[root@Squid-Server ~]# ll -d /usr/src/squid-3.5.26
drwxr-xr-x 17 1000 1000 4096 6月 2 2017 /usr/src/squid-3.5.26
3.2 squid編譯前關鍵內核參數調整
3.2.1 調整文件描述符
Squid在高負載下,需要大量的內核資源。特別的,你需要給你的系統配置比正常情況更高的文件描述符和緩存,最好在開始編譯squid之前來增加文件描述符的大小(在系統安裝時我們已經講解過)。squid和內核通過數據結構來交換信息,數據結構的大小不能超過設置的文件描述符的限制。squid在運行時檢查這些設置,並且使用最安全的(最小的)值。
1)文件描述符:
- 文件描述符是一個簡單的整數,用以標明每一個被進程所打開的文件和socket。第一個打開的文件是0,第二個是1,依此類推。Unix操作系統通常給每個進程能打開的文件數量強加一個限制。更甚的是,unix通常有一個系統級的限制(1024).因為squid的工作方式,文件描述符的限制可能會極大的影響性能。當squid用完所有的文件描述符后,它不能接收用戶新的連接。也就是說,用完文件描述符導致拒絕服務。直到一部分當前請求完成,相應的文件和socket被關閉,squid不能接收新請求。當squid發現文件描述符短缺時,它會發布警告。
- 在運行./configure之前,檢查你的系統的文件描述符限制是否合適,能給你避免一些麻煩。大多數情況下,1024個文件描述符足夠了。非常忙的cache可能需要4096或更多。在配置文件描述符限制時,我推薦設置系統級限制的數量為每個進程限制的2倍。
[root@Squid-Server ~]# ulimit -n
1024
#1024這是linux系統默認情況的值
2)設置打開的最大文件描述符的數目
[root@Squid-Server ~]# ulimit -n
1024
[root@Squid-Server ~]# ulimit -n 20480
[root@Squid-Server ~]# ulimit -n
20480
[root@Squid-Server ~]# echo "ulimit -n 20480" >> /etc/rc.local
[root@Squid-Server ~]# tail -1 /etc/rc.local
ulimit -n 20480
3.2.2 調整臨時端口范圍
- 臨時端口是TCP/IP棧分配給出去連接的本地端口。換句話說,當squid發起一條連接到另一台服務器,內核給本地socket分配一個端口號。這些本地端口號有特定的范圍限制。
- 例如,Centos默認是32768-61000.
- 臨時端口號的短缺對非常慢的代理服務器(例如每秒數百個連接)來說,會較大的影響性能。這是因為一些TCP連接在他們被關閉時進入TIME_WAIT狀態。當連接進入TIME_WAIT狀態時,臨時端口號不能被重用。
調整臨時端口范圍方法:
[root@Squid-Server ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
[root@Squid-Server ~]# echo "net.ipv4.ip_local_port_range = 4000 65000" >> /etc/sysctl.conf
[root@Squid-Server squid-3.0.STABLE20]# sysctl -p
net.ipv4.ip_local_port_range = 4000 65000
[root@Squid-Server ~]# cat /proc/sys/net/ipv4/ip_local_port_range
4000 65000
3.3 squid編譯前查看幫助
官方:http://www.squid-cache.org/Versions/v3/3.5/cfgman/
進入解壓后的squid目錄
[root@Squid-Server ~]# cd /usr/src/squid-3.5.26/
[root@Squid-Server squid-3.5.26]# more INSTALL
/*
* Copyright (C) 1996-2017 The Squid Software Foundation and contributors
*
* Squid software is distributed under GPLv2+ license and includes
* contributions from numerous individuals and organizations.
* Please see the COPYING and CONTRIBUTORS files for details.
*/
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 tools/cachemgr.cgi program into your httpd server's cgi-bin
directory.
3.4 squid編譯安裝
#先進行安裝依賴
[root@Squid-Server squid-3.5.26]# yum -y install openssl-devel libXpm-devel fontconfig-devel
[root@Squid-Server squid-3.5.26]# rpm -qa openssl-devel libXpm-devel fontconfig-devel
libXpm-devel-3.5.12-1.el7.x86_64
fontconfig-devel-2.13.0-4.3.el7.x86_64
openssl-devel-1.0.2k-16.el7_6.1.x86_64
#配置編譯環境
[root@Squid-Server squid-3.5.26]# ./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@Squid-Server squid-3.5.26]# make
#安裝
[root@Squid-Server squid-3.5.26]# make install
#指定安裝路徑
./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
#把安裝目錄做成軟連接
[root@Squid-Server squid-3.5.26]# ln -s /usr/local/squid3/ /usr/local/squid
[root@Squid-Server squid-3.5.26]# ll -d /usr/local/squid
lrwxrwxrwx 1 root root 18 6月 20 16:13 /usr/local/squid -> /usr/local/squid3/
3.5 squid目錄文件結構介紹
在安裝完后,將在squid的安裝目錄里(/usr/local/squid/)會看到下列目錄和文件:
[root@Squid-Server squid-3.5.26]# tree -L 2 /usr/local/squid
/usr/local/squid
├── bin
│ ├── purge
│ └── squidclient
├── etc
│ ├── cachemgr.conf
│ ├── cachemgr.conf.default
│ ├── errorpage.css
│ ├── errorpage.css.default
│ ├── mime.conf
│ ├── mime.conf.default
│ ├── squid.conf
│ ├── squid.conf.default
│ └── squid.conf.documented
├── libexec
│ ├── basic_db_auth
│ ├── basic_fake_auth
│ ├── basic_getpwnam_auth
│ ├── basic_msnt_multi_domain_auth
│ ├── basic_ncsa_auth
│ ├── basic_nis_auth
│ ├── basic_pop3_auth
│ ├── basic_radius_auth
│ ├── basic_smb_auth
│ ├── basic_smb_auth.sh
│ ├── basic_smb_lm_auth
│ ├── cachemgr.cgi
│ ├── cert_tool
│ ├── digest_file_auth
│ ├── diskd
│ ├── ext_delayer_acl
│ ├── ext_file_userip_acl
│ ├── ext_kerberos_ldap_group_acl
│ ├── ext_sql_session_acl
│ ├── ext_unix_group_acl
│ ├── ext_wbinfo_group_acl
│ ├── helper-mux.pl
│ ├── log_db_daemon
│ ├── log_file_daemon
│ ├── negotiate_kerberos_auth
│ ├── negotiate_kerberos_auth_test
│ ├── negotiate_wrapper_auth
│ ├── ntlm_fake_auth
│ ├── ntlm_smb_lm_auth
│ ├── pinger
│ ├── storeid_file_rewrite
│ ├── unlinkd
│ ├── url_fake_rewrite
│ └── url_fake_rewrite.sh
├── sbin
│ └── squid
├── share
│ ├── errors
│ ├── icons
│ ├── man
│ └── mib.txt
└── var
├── cache
├── logs
└── run
12 directories, 47 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) |
4. squid配置介紹
4.1 squid.conf語法
- Squid的配置文件相對規范。它與其他許多unix程序相似。每行以配置指令開始,后面跟着數字值或關鍵字。在讀取配置文件時,squid忽略空行和注釋掉的行(以#開始)。
- 默認的squid.conf內容有相當多的內容,如下:
[root@Squid-Server squid-3.5.26]# cd /usr/local/squid/etc/
[root@Squid-Server etc]# wc -l squid.conf
73 squid.conf
#去掉以#開頭的注釋和空行(以#開頭!)
[root@Squid-Server etc]# egrep -v "^#|^$" squid.conf.default > squid.conf
[root@Squid-Server etc]# cat squid.conf | wc -l
30
[root@Squid-Server etc]# cat squid.conf
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 localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
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 deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /usr/local/squid3/var/cache/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
4.2 squid服務的用戶
- 幾乎所有的unix進程和文件擁有文件的組和屬主的屬性,你必須創建一個用戶和組給squid服務,該用戶和組的組合,必須對大部分squid相關的文件和目錄有讀和寫的權限,所以需要創建“squid”的用戶和組,這避免了某人利用squid來讀取系統中的其他文件。
- 運行squid必須以root身份運行,設置配置文件squid.conf中。cache_effective_user為squid來運行,這個用戶和組的名稱理論上可以任意起。
4.2.1 創建squid用戶和組,禁止其登陸
[root@Squid-Server etc]# useradd -s /sbin/nologin -M squid
[root@Squid-Server etc]# id squid
uid=1000(squid) gid=1000(squid) 組=1000(squid)
4.2.2 編輯配置文件squid.conf
#設置啟動賬戶為squid
[root@Squid-Server etc]# echo "cache_effective_user squid" >> /usr/local/squid/etc/squid.conf
[root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf
cache_effective_user squid
#設置啟動賬戶組為squid
[root@Squid-Server etc]# echo "cache_effective_group squid" >> /usr/local/squid/etc/squid.conf
[root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf
cache_effective_group squid
#開啟store日志
[root@Squid-Server etc]# echo "cache_store_log /usr/local/squid/var/logs/store.log" >> /usr/local/squid/etc/squid.conf
[root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf
cache_store_log /usr/local/squid/var/logs/store.log #緩存對象日志
#開啟cache日志
[root@Squid-Server etc]# echo "cache_log /usr/local/squid/var/logs/cache.log" >> /usr/local/squid/etc/squid.conf
[root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf
cache_log /usr/local/squid/var/logs/cache.log
#開啟磁盤緩存cache_dir
[root@Squid-Server etc]# echo "cache_dir ufs /usr/local/squid/var/cache 100 16 256" >> /usr/local/squid/etc/squid.conf
[root@Squid-Server 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來說,最常使用的正則表達式功能用以匹配字符串的開頭或結尾。例如,^字符是特殊元字符,它匹配行或字符串的開頭:
- ^http://
該正則表達式匹配任意以http://開頭的URL。$也是特殊的元字符,因為它匹配行或字符串的結尾
- :.jpg$
實際上,該示例也有些錯誤,因為.字符也是特殊元字符。它是匹配任意單個字符的通配符。我們實際想要的應該是,見下行:
- .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
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找到第一個值匹配時,它停止搜索。這意味着把最可能匹配的值放在列表開頭處,能減少延時。
-重點強調:
- squid在搜索ACL元素時使用的"或"邏輯。在acl里的任何單值都可以導致匹配。
- 而應用訪問規則恰好相反。對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可能會報錯無法運行。
- 設置主機名有如下好處:
(1)主機名出現在squid的錯誤消息里,這幫助用戶驗證潛在問題的源頭。
(2)主機名出現在squid轉發的cache單元的HTTP Via頭里。當請求到達原始主機時,Via頭包含了在傳輸過程中涉及的代理列表。squid也使用Via頭來檢測轉發環路。- 通過修改squid配置文件squid.conf中visible_hostname字段,可修改可見主機名:
#編輯squid.conf配置文件,添加可見主機名
[root@Squid-Server etc]# echo "visible_hostname www.yangwenbo.com" >> /usr/local/squid/etc/squid.conf
[root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf
visible_hostname www.yangwenbo.com
4.8 squid管理聯系信息
設置cache_mgr指令作為對用戶的幫助,它是一個email地址,假如故障發生,用戶能寫信給管理員來通知管理員,cache_mgr地址默認出現在squid的錯誤消息里,修改配置文件squid.conf中cache_mgr字段。
cache_mgr 17310658206@163.com
編輯squid.conf配置文件,添加郵件聯系人信息
[root@Squid-Server etc]# echo "cache_mgr 17310658206@163.com" >> /usr/local/squid/etc/squid.conf
[root@Squid-Server etc]# tail -1 /usr/local/squid/etc/squid.conf
cache_mgr 17310658206@163.com
4.9 squid最終的配置文件
根據以上的設置之后,squid.conf的內容如下:
[root@Squid-Server etc]# cat /usr/local/squid/etc/squid.conf
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 localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
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 deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /usr/local/squid3/var/cache/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
#以下是添加的修改內容
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.yangwenbo.com #可見主機名
cache_mgr 17310658206@163.com #郵件聯系人
5. 運行squid並實現squid的普通代理模式
5.1 Squid主程序命令行選項
在運行squid前,需要了解squid主程序命令行選項。執行如下命令可以獲得系統幫助:
[root@Squid-Server 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@Squid-Server etc]# /usr/local/squid/sbin/squid -k parse #檢查語法
#以上省略。。。
2019/06/20 17:58:10| Processing: cache_effective_user squid
2019/06/20 17:58:10| Processing: cache_effective_group squid
2019/06/20 17:58:10| Processing: cache_store_log /usr/local/squid/var/logs/store.log
2019/06/20 17:58:10| Processing: cache_log /usr/local/squid/var/logs/cache.log
2019/06/20 17:58:10| Processing: cache_dir ufs /usr/local/squid/var/cache 100 16 256
2019/06/20 17:58:10| Processing: visible_hostname www.yangwenbo.com
2019/06/20 17:58:10| Processing: cache_mgr 17310658206@163.com
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@Squid-Server etc]# ll -d /usr/local/squid/var/logs #查看目錄權限
drwxr-xr-x 2 root root 6 6月 20 16:10 /usr/local/squid/var/logs #沒有授權程序用戶訪問
[root@Squid-Server etc]# chown -R squid /usr/local/squid/var/logs #遞歸授權屬主為squid
[root@Squid-Server etc]# ll -d /usr/local/squid/var/logs
drwxr-xr-x 2 squid root 6 6月 20 16:10 /usr/local/squid/var/logs
[root@Squid-Server etc]# /usr/local/squid/sbin/squid -k parse #再次檢查語法
#以上省略。。。
2019/06/20 17:58:10| Processing: cache_effective_user squid
2019/06/20 17:58:10| Processing: cache_effective_group squid
2019/06/20 17:58:10| Processing: cache_store_log /usr/local/squid/var/logs/store.log
2019/06/20 17:58:10| Processing: cache_log /usr/local/squid/var/logs/cache.log
2019/06/20 17:58:10| Processing: cache_dir ufs /usr/local/squid/var/cache 100 16 256
2019/06/20 17:58:10| Processing: visible_hostname www.yangwenbo.com
2019/06/20 17:58:10| Processing: cache_mgr 17310658206@163.com
5.3 初始化cache目錄
在運行squid之前,或者增加了新的cache_dir,你必須初始化cache,命令為:squid -z
5.3.1 設置環境變量,或者做命令的軟連接
[root@Squid-Server etc]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/
[root@Squid-Server etc]# ln -s /usr/local/squid/bin/* /usr/local/bin/
[root@Squid-Server etc]# which squid
/usr/local/sbin/squid
5.3.2 初始化cache
[root@Squid-Server etc]# squid -z #初始化緩存命令
[root@Squid-Server etc]# 2019/06/20 18:57:18 kid1| Set Current Directory to /usr/local/squid3/var/cache/squid
2019/06/20 18:57:18 kid1| Creating missing swap directories
2019/06/20 18:57:18 kid1| /usr/local/squid/var/cache exists
FATAL: Failed to make swap directory /usr/local/squid/var/cache/00: (13) Permission denied #報錯,權限拒絕
[root@Squid-Server etc]# ll -d /usr/local/squid/var/
drwxr-xr-x 5 root root 42 6月 20 16:10 /usr/local/squid/var/ #原來是目錄對於程序用戶沒有權限
[root@Squid-Server etc]# chown -R squid /usr/local/squid/var/ #授權程序用戶squid
[root@Squid-Server etc]# ll -d /usr/local/squid/var/
drwxr-xr-x 5 squid root 42 6月 20 16:10 /usr/local/squid/var/
[root@Squid-Server etc]# squid -z #再次初始化cache
[root@Squid-Server etc]# 2019/06/20 18:59:43 kid1| Set Current Directory to /usr/local/squid3/var/cache/squid
2019/06/20 18:59:43 kid1| Creating missing swap directories
2019/06/20 18:59:43 kid1| /usr/local/squid/var/cache exists
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/00
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/01
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/02
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/03
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/04
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/05
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/06
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/07
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/08
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/09
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0A
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0B
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0C
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0D
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0E
2019/06/20 18:59:43 kid1| Making directories in /usr/local/squid/var/cache/0F
5.4 光盤安裝一些必須的工具
[root@Squid-Server etc]# yum -y install tree telnet dos2unix
[root@Squid-Server etc]# rpm -qa tree telnet dos2unix
telnet-0.17-64.el7.x86_64
tree-1.6.0-10.el7.x86_64
dos2unix-6.0.3-7.el7.x86_64
#查看緩存目錄
[root@Squid-Server etc]# tree /usr/local/squid/var/cache/
5.5 在終端窗口里測試啟動squid
初始化cache目錄后,就可以在終端窗口里運行squid,將日志記錄到標准日子里,就可以輕易的定位任何錯誤或問題,並且確認squid是否成功啟動.
[root@Squid-Server etc]# squid -N -d1 #以debug調試模式在前台啟動squid
2019/06/20 19:10:42| Set Current Directory to /usr/local/squid3/var/cache/squid
2019/06/20 19:10:42| Starting Squid Cache version 3.5.26 for x86_64-pc-linux-gnu...
2019/06/20 19:10:42| Service Name: squid
2019/06/20 19:10:42| Process ID 7021
2019/06/20 19:10:42| Process Roles: master worker
2019/06/20 19:10:42| With 1024 file descriptors available
2019/06/20 19:10:42| Initializing IP Cache...
2019/06/20 19:10:42| DNS Socket created at [::], FD 8
2019/06/20 19:10:42| DNS Socket created at 0.0.0.0, FD 9
2019/06/20 19:10:42| Adding domain localdomain from /etc/resolv.conf
2019/06/20 19:10:42| Adding nameserver 192.168.200.254 from /etc/resolv.conf
2019/06/20 19:10:42| Logfile: opening log daemon:/usr/local/squid3/var/logs/access.log
2019/06/20 19:10:42| Logfile Daemon: opening log /usr/local/squid3/var/logs/access.log
2019/06/20 19:10:42| Unlinkd pipe opened on FD 15
2019/06/20 19:10:42| Logfile: opening log /usr/local/squid/var/logs/store.log
2019/06/20 19:10:42| WARNING: log name now starts with a module name. Use 'stdio:/usr/local/squid/var/logs/store.log'
2019/06/20 19:10:42| Swap maxSize 102400 + 262144 KB, estimated 28041 objects
2019/06/20 19:10:42| Target number of buckets: 1402
2019/06/20 19:10:42| Using 8192 Store buckets
2019/06/20 19:10:42| Max Mem size: 262144 KB
2019/06/20 19:10:42| Max Swap size: 102400 KB
2019/06/20 19:10:42| Rebuilding storage in /usr/local/squid/var/cache (no log)
2019/06/20 19:10:42| Using Least Load store dir selection
2019/06/20 19:10:42| Set Current Directory to /usr/local/squid3/var/cache/squid
2019/06/20 19:10:42| Finished loading MIME types and icons.
2019/06/20 19:10:42| HTCP Disabled.
2019/06/20 19:10:42| Pinger socket opened on FD 20
2019/06/20 19:10:42| Squid plugin modules loaded: 0
2019/06/20 19:10:42| Adaptation support is off.
2019/06/20 19:10:42| Accepting HTTP Socket connections at local=[::]:3128 remote=[::] FD 18 flags=9
2019/06/20 19:10:42| Done scanning /usr/local/squid/var/cache dir (0 entries)
2019/06/20 19:10:42| Finished rebuilding storage from disk.
2019/06/20 19:10:42| 0 Entries scanned
2019/06/20 19:10:42| 0 Invalid entries.
2019/06/20 19:10:42| 0 With invalid flags.
2019/06/20 19:10:42| 0 Objects loaded.
2019/06/20 19:10:42| 0 Objects expired.
2019/06/20 19:10:42| 0 Objects cancelled.
2019/06/20 19:10:42| 0 Duplicate URLs purged.
2019/06/20 19:10:42| 0 Swapfile clashes avoided.
2019/06/20 19:10:42| Took 0.07 seconds ( 0.00 objects/sec).
2019/06/20 19:10:42| Beginning Validation Procedure
2019/06/20 19:10:42| Completed Validation Procedure
2019/06/20 19:10:42| Validated 0 Entries
2019/06/20 19:10:42| store_swap_size = 0.00 KB
2019/06/20 19:10:43| storeLateRelease: released 0 objects
#注意:此時命令行無法再繼續輸入命令了,如果要查看窗口可以單開一個窗口進行查看
[root@Squid-Server ~]# netstat -antup | grep squid
tcp6 0 0 :::3128 :::* LISTEN 7009/squid
udp 0 0 0.0.0.0:53138 0.0.0.0:* 7009/squid
udp6 0 0 ::1:7714 ::1:16543 ESTABLISHED 7009/squid
udp6 0 0 :::28577 :::* 7009/squid
#備注:3128為服務端口
一旦啟動成功,就可用一些HTTP請求來測試squid;你的瀏覽器使用squid作為代理,然后打開某個web頁面。假如squid工作正常,正常載入就像沒用過squid一樣。
5.6 進行squid代理測試
5.6.1 設置squid服務器為瀏覽器進行代理
5.6.2 重啟瀏覽器,登陸一個網頁,比如www.baidu.com
[root@Squid-Server ~]# tail -100f /usr/local/squid/var/logs/access.log
1561103380.651 23497 192.168.200.1 TAG_NONE/503 0 CONNECT accounts.google.com:443 - HIER_NONE/- -
1561103380.656 21139 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- -
1561103380.656 23005 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- -
1561103380.656 23435 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- -
1561103380.656 23193 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- -
1561103380.656 23004 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- -
1561103380.730 21005 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- -
1561103380.955 21009 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- -
1561103382.145 21008 192.168.200.1 TAG_NONE/503 0 CONNECT www.google.com:443 - HIER_NONE/- -
1561103396.560 34619 192.168.200.1 TCP_TUNNEL/200 186 CONNECT www.baidu.com:443 - HIER_DIRECT/180.97.33.107 - #記錄在案
- 到這里位置,我們就是想了squid的普通(傳統)代理模式
- 默認情況下,squid是普通代理模式
5.7 將squid作為服務進程運行
#正常情況下你想將squid以后台進程運行(不出現在終端窗口里)。最容易的方法是簡單執行如下命令:
[root@Squid-Server ~]# /usr/local/sbin/squid -D
2019/06/21 16:17:45| WARNING: -D command-line option is obsolete.
[root@Squid-Server ~]# netstat -antup | grep 3128
tcp6 0 0 :::3128 :::* LISTEN 67859/(squid-1)
tcp6 0 0 192.168.200.13:3128 192.168.200.1:53311 ESTABLISHED 67859/(squid-1)
tcp6 0 0 192.168.200.13:3128 192.168.200.1:53299 TIME_WAIT -
tcp6 0 0 192.168.200.13:3128 192.168.200.1:53313 ESTABLISHED 67859/(squid-1)
tcp6 0 0 192.168.200.13:3128 192.168.200.1:53308 ESTABLISHED 67859/(squid-1)
tcp6 0 0 192.168.200.13:3128 192.168.200.1:53307 ESTABLISHED 67859/(squid-1)
tcp6 0 0 192.168.200.13:3128 192.168.200.1:53302 ESTABLISHED 67859/(squid-1)
#-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@Squid-Server ~]# echo "#startup squid by Mr.yang at 2019/6/21" >> /etc/rc.local
[root@Squid-Server ~]# echo "/usr/local/sbin/squid -D" >> /etc/rc.local
[root@Squid-Server ~]# tail -2 /etc/rc.local
#startup squid by Mr.yang at 2019/6/21
/usr/local/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啟動腳本
[root@Squid-Server ~]# cd /etc/init.d/
[root@Squid-Server init.d]# vim squid
[root@Squid-Server init.d]# cat 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開機自動啟動服務
[root@Squid-Server init.d]# chmod +x /etc/init.d/squid
[root@Squid-Server init.d]# ll -d squid
-rwxr-xr-x 1 root root 420 6月 21 16:30 squid
[root@Squid-Server init.d]# chkconfig --add squid
#查看squid服務是否已經成功加上
[root@Squid-Server init.d]# chkconfig --list squid
注:該輸出結果只顯示 SysV 服務,並不包含
原生 systemd 服務。SysV 配置數據
可能被原生 systemd 配置覆蓋。
要列出 systemd 服務,請執行 'systemctl list-unit-files'。
查看在具體 target 啟用的服務請執行
'systemctl list-dependencies [target]'。
squid 0:關 1:關 2:關 3:開 4:開 5:開 6:關
5.9 啟動squid服務
啟動squid服務方法有兩種,一種是直接運行squid程序,另外一種是通過服務啟動squid
#直接運行squid程序
[root@Squid-Server ~]# /usr/local/sbin/squid -D
#通過服務啟動squid
[root@Squid-Server ~]# /etc/init.d/squid start
#啟動完成后,記得檢查squid進程啟動情況
[root@Squid-Server ~]# ps -ef | grep squid | grep -v grep
5.10 停止squid
#直接關閉squid程序
[root@Squid-Server ~]# /usr/local/sbin/squid -k shutdown
#通過服務停止squid
[root@Squid-Server ~]# /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@Squid-Server ~]# /usr/local/squid/sbin/squid -k rotate
#每執行一次回滾,就會產生一個新的回滾日志,但是最多的回滾數為squid.conf中的logfile_rotate參數,默認是10個,即擴展名0-9,並且包含一個最新的日志文件(不帶下標)
[root@Squid-Server ~]# tree /usr/local/squid/var/logs/
/usr/local/squid/var/logs/
├── access.log
├── cache.log
└── store.log
0 directories, 3 files
- 日志回滾主要避免單個日志文件過大導致squid崩潰的問題,有些較老的系統版本文件大小有2GB限制,所以需要定期回滾一次,並且還可以節省磁盤空間。
- 除非你在squid.conf里禁止,squid會寫大量的日志文件。你必須周期性的滾動日志文件,以阻止他們變得太大。squid將大量的重要信息寫入日志,假如寫不進去了,squid會發生錯誤並退出。為了合理控制磁盤空間消耗,在cron里使用如下命令:
squid -k rotate
#例如:如下任務接口在每天的早上0點滾動日志:
[root@Squid-Server ~]# crontab -l
0 0 * * * /bin/sh /root/rotate_squid.sh > /dev/null 2>&1
[root@Squid-Server ~]# cat rotate_squid.sh
#!/bin/bash
#cat /root/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/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 利用Web界面來管理squid
squid有一個cachemgr.cgi的程序,可以Web來顯示內容,這個對於調整squid的參數很是方便。可以平時我們安裝完squid后其實就有這個程序了。我們只要在Apache中配置以下即可。
5.12.1 安裝apache服務
[root@Squid-Server ~]# yum -y install httpd
[root@Squid-Server ~]# which httpd
/usr/sbin/httpd
5.12.2 查找cachemgr.cgi的存放位置
[root@Squid-Server ~]# find /usr/local/squid/ -name "cachemgr.cgi"
/usr/local/squid/libexec/cachemgr.cgi
5.12.3 將文件拷貝到apache服務器下的cgi-bin目錄下
[root@Squid-Server ~]# cp -a /usr/local/squid/libexec/cachemgr.cgi /var/www/cgi-bin/
5.12.4 為了避免和后邊的squid反向代理沖突,http修改端口為8080
[root@Squid-Server ~]# sed -n '42p' /etc/httpd/conf/httpd.conf
Listen 80
[root@Squid-Server ~]# sed -i '42 s#80#8080#g' /etc/httpd/conf/httpd.conf
[root@Squid-Server ~]# sed -n '42p' /etc/httpd/conf/httpd.conf
Listen 8080
5.12.5 啟動apache服務
[root@Squid-Server ~]# systemctl start httpd
[root@Squid-Server ~]# netstat -antup | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 68176/httpd