squid-cache 官網
http://www.squid-cache.org
squid介紹及其簡單配置
https://www.cnblogs.com/cherishry/p/5706736.html
CentOS 7安裝squid代理服務器
https://blog.csdn.net/ithomer/article/details/78136993
squid的概念
squid是一種用來緩存Internet數據的軟件。接受來自人們需要下載的目標(object)的請求並適當的處理這些請求。也就是說,如果一個人想下載一web界面,他請求squid為他取得這個頁面。squid隨之連接到遠程服務器並向這個頁面發出請求。然后,squid顯式地聚集數據到客戶端機器,而且同時復制一份。當下一次有人需要同一頁面時, squid可以簡單的從磁盤中讀到它,那樣數據會立即傳輸到客戶機上。
squid代理的作用
- 通過緩存的方式為用戶提供Web訪問加速
-
對用戶的Web訪問進行過濾控制
工作流程
當代理服務器中有客戶端需要的數據時:
a. 客戶端向代理服務器發送數據請求;
b. 代理服務器檢查自己的數據緩存;
c. 代理服務器在緩存中找到了用戶想要的數據,取出數據;
d. 代理服務器將從緩存中取得的數據返回給客戶端。
當代理服務器中沒有客戶端需要的數據時:
-
客戶端向代理服務器發送數據請求;
-
代理服務器檢查自己的數據緩存;
-
代理服務器在緩存中沒有找到用戶想要的數據;
-
代理服務器向Internet 上的遠端服務器發送數據請求;
-
遠端服務器響應,返回相應的數據;
-
代理服務器取得遠端服務器的數據,返回給客戶端,並保留一份到自己的數據緩存中。
Squid代理服務器工作在TCP/IP應用層
Squid各種代理的定義
正向代理
標准的代理緩沖服務器
一個標准的代理緩沖服務被用於緩存靜態的網頁到本地網絡上的一台主機上(即代理服務器)。當被緩存的頁面被第二次訪問的時候,瀏覽器將直接從本地代理服務器那里獲取請求數據而不再向原web站點請求數據。這樣就節省了寶貴的網絡帶寬,而且提高了訪問速度。但是,要想實現這種方式,必須在每一個內部主機的瀏覽器上明確指名代理服務器的IP地址和端口號。客戶端上網時,每次都把請求發送給代理服務器處理,代理服務器根據請求確定是否連接到遠程web服務器獲取數據。如果在本地緩沖區有目標文件,則直接將文件傳給用戶即可。如果沒有的話則先取回文件,先在本地保存一份緩沖,然后將文件發送給客戶端瀏覽器。
透明代理緩沖服務器
透明代理緩沖服務器和標准代理服務器的功能完全相同。但是,代理操作對客戶端的瀏覽器是透明的(即不需指明代理服務器的IP和端口)。透明代理服務器阻斷網絡通信,並且過濾出訪問外部的HTTP(80端口)流量。如果客戶端的請求在本地有緩沖則將緩沖的數據直接發給用戶,如果在本地沒有緩沖則向遠程web服務器發出請求,其余操作和標准的代理服務器完全相同。對於linux操作系統來說,透明代理使用Iptables或者Ipchains實現。因此不需要對瀏覽器作任何設置,所以,透明代理對於ISP(Internet服務器提供商)特別有用。
反向代理
反向代理緩沖器
反向代理是和前兩種代理完全不同的一種代理服務。使用它可以降低原始WEB服務器的負載。反向代理服務器承擔了對原始WEB服務器的靜態頁面的請求,防止原始服務器過載。它位於WEB服務器和Internet之間,處理所有對WEB服務器的請求,組織了WEB服務器和Internet的直接通信。如果互聯網用戶請求的頁面在代理服務器上有緩沖的話,代理服務器直接將緩沖內容發送給用戶。如果沒有緩沖則先向WEB服務器發出請求,取回數據,本地緩存后再發給用戶。這種方式通過降低了WEB服務器的請求數從而降低了WEB服務器的負載。
正向代理與反向代理的區別
概念
正向代理:對於原始服務器而言,就是客戶端的代言人
反向代理:對於客戶端而言,就像是原始服務器
用途
正向代理的典型用途是為在防火牆內的局域網客戶端提供訪問Internet的途徑。正向代理還可以使用緩沖特性減少網絡使用率。
反向代理還可以為后端的多台服務器提供負載平衡,或為后端較慢的服務器提供緩沖服務。另外,反向代理還可以啟用高級URL策略和管理技術,從而使處於不同web服務器系統的web頁面同時存在於同一個URL空間下。
安全性
正向代理允許客戶端通過它訪問任意網站並且隱藏客戶端自身,因此你必須采取安全措施以確保僅為經過授權的客戶端提供服務。
反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。
Squid主要組成部分
服務名:squid
主程序:/usr/sbin/squid
配置目錄:/etc/squid
主配置文件:/etc/squid/squid.conf
監聽tcp端口號:3128
默認訪問日志文件:/var/log/squid/access.log
squid常用配置選項
/etc/squid/squid.conf
http_port 3128 (還可以只監聽一個IP http_port 192.168.0.1:3128) cache_mem 64MB #緩存占內存大小 maximum_object_size 4096KB #最大緩存塊 reply_body_max_size 1024000 allow all #限定下載文件大小 access_log /var/log/squid/access.log #訪問日志存放的地方 visible_hostname proxy.test.xom #可見的主機名 cache_dir ufs /var/spool/squid 100 16 256 #ufs:緩存數據的存儲格式 #/var/spool/squid 緩存目錄 #100:緩存目錄占磁盤空間大小(M) #16:緩存空間一級子目錄個數 #256:緩存空間二級子目錄個數 cache_mgr webmaster@test.com #定義管理員郵箱 http_access deny all #訪問控制
squid中的訪問控制
使用訪問控制特性,可以控制在訪問時根據特定的時間間隔進行緩存、訪問特定站點或一組站點等等。squid訪問控制有兩個要素:ACL元素和訪問列表。訪問列表可以允許或拒絕某些用戶對此服務的訪問。
ACL元素類型
- src:源地址(即客戶機IP地址)
- dst:目標地址(即服務器IP地址)
- srcdomain:源名稱(即客戶機名稱)
- dstdomain:目標名稱(即服務器名稱)
- time:一天中的時刻和一周內的一天
- url_regex:URL規則表達式匹配
- urlpath_regex:URL-path規則表達式匹配,略去協議和主機名
- proxy_auth:通過外部程序進行用戶驗證
- maxconn:單一IP的最大連接數
ACL格式
為了使用控制功能,必須先設置ACL規則並應用。ACL聲明的格式如下:
acl acl_element_name type_of_acl_element values_to_acl
注:
- acl_element_name 可以是任一個在ACL中定義的名稱
- 任何兩個ACL元素不能用相同的名字
- 每個ACL由列表值組成。當進行匹配檢測的時候,多個值由邏輯或運算連接;換言之,即任一ACL元素的值被匹配,則這個ACL元素即被匹配。
- 並不是所有ACL元素都能使用訪問列表中的全部類型
- 不同的ACL元素寫在不同行中,squid將把他們組合在一個列表中
訪問條目
我們可以使用許多不同的訪問條目。下面是我們常用的幾個:
- http_access:允許HTTP訪問
- no_cache:定義對緩存請求的響應。
訪問列表的規則由一些類似'allow'或‘deny’的關鍵字構成,用以允許或拒絕向特定或一組ACL元素提供服務。
- 一個訪問列表可以由多條規則組成
-
如果沒有任何規則與訪問請求匹配,默認動作將與列表中最后一條規則對應。
-
一個訪問條目中所有元素將用邏輯與運算連接
http_access Action 聲明1 AND 聲明2 AND 聲明 OR.
http_access Action 聲明3
多個http_accesss聲明間用或運算連接,但每個訪問條目的元素間用與運算連接。 - 列表中的規則總是遵循由上而下的順序
-
這些規則按照他們的排列順序進行匹配檢測,一旦檢測到匹配的規則,匹配就立即結束。
Squid.conf配置文件詳解
#acl all src 0.0.0.0/0.0.0.0 and http_access allow all選項定義了一個訪問控制列表。詳細情況參見和Squid軟件 #攜帶的文檔。這里的訪問控制列表允許所有對代理服務的訪問,因為這里該代理是加速web服務器。 acl all src 0.0.0.0/0.0.0.0 #允許所有IP訪問 acl manager proto http #manager url協議為http acl localhost src 127.0.0.1/255.255.255.255 #允午本機IP acl to_localhost dst 127.0.0.1 #允午目的地址為本機IP acl Safe_ports port 80 # 允許安全更新的端口為80 acl CONNECT method CONNECT #請求方法以CONNECT http_access allow all #允許所有人使用該代理.因為這里是代理加速web服務器 http_reply_access allow all #允許所有客戶端使用該代理 acl OverConnLimit maxconn 16 #限制每個IP最大允許16個連接,防止攻擊 http_access deny OverConnLimit icp_access deny all #禁止從鄰居服務器緩沖內發送和接收ICP請求. miss_access allow all #允許直接更新請求 ident_lookup_access deny all #禁止lookup檢查DNS http_port 8080 transparent #指定Squid監聽瀏覽器客戶請求的端口號。 hierarchy_stoplist cgi-bin ? #用來強制某些特定的對象不被緩存,主要是處於安全的目的。 acl QUERY urlpath_regex cgi-bin \? cache deny QUERY cache_mem 1 GB #這是一個優化選項,增加該內存值有利於緩存。應該注意的是: #一般來說如果系統有內存,設置該值為(n/)3M。現在是3G 所以這里1G fqdncache_size 1024 #FQDN 高速緩存大小 maximum_object_size_in_memory 2 MB #允許最大的文件載入內存 memory_replacement_policy heap LFUDA #動態使用最小的,移出內存cache cache_replacement_policy heap LFUDA #動態使用最小的,移出硬盤cache cache_dir ufs /home/cache 5000 32 512 #高速緩存目錄 ufs 類型 使用的緩沖值最大允午1000MB空間, #32個一級目錄,512個二級目錄 max_open_disk_fds 0 #允許最大打開文件數量,0 無限制 minimum_object_size 1 KB #允午最小文件請求體大小 maximum_object_size 20 MB #允午最大文件請求體大小 cache_swap_low 90 #最小允許使用swap 90% cache_swap_high 95 #最多允許使用swap 95% ipcache_size 2048 # IP 地址高速緩存大小 2M ipcache_low 90 #最小允許ipcache使用swap 90% ipcache_high 95 #最大允許ipcache使用swap 90% access_log /var/log/squid/access.log squid #定義日志存放記錄 cache_log /var/log/squid/cache.log squid cache_store_log none #禁止store日志 emulate_httpd_log on #將使Squid仿照Web服務器的格式創建訪問記錄。如果希望使用 #Web訪問記錄分析程序,就需要設置這個參數。 refresh_pattern . 0 20% 4320 override-expire override-lastmod reload-into-ims ignore-reload #更新cache規則 acl buggy_server url_regex ^http://.... http:// #只允許http的請求 broken_posts allow buggy_server acl apache rep_header Server ^Apache #允許apache的編碼 broken_vary_encoding allow apache request_entities off #禁止非http的標分准請求,防止攻擊 header_access header allow all #允許所有的http報頭 relaxed_header_parser on #不嚴格分析http報頭. client_lifetime 120 minute #最大客戶連接時間 120分鍾 cache_mgr sky@test.com #指定當緩沖出現問題時向緩沖管理者發送告警信息的地址信息。 cache_effective_user squid #這里以用戶squid的身份Squid服務器 cache_effective_group squid icp_port 0 #指定Squid從鄰居服務器緩沖內發送和接收ICP請求的端口號。 #這里設置為0是因為這里配置Squid為內部Web服務器的加速器, #所以不需要使用鄰居服務器的緩沖。0是禁用 # cache_peer 設置允許更新緩存的主機,因是本機所以127.0.0.1 cache_peer 127.0.0.1 parent 80 0 no-query default multicast-responder no-netdb-exchange cache_peer_domain 127.0.0.1 hostname_aliases 127.0.0.1 error_directory /usr/share/squid/errors/Simplify_Chinese #定義錯誤路徑 always_direct allow all # cache丟失或不存在是允許所有請求直接轉發到原始服務器 ignore_unknown_nameservers on #開反DNS查詢,當域名地址不相同時候,禁止訪問 coredump_dir /var/log/squid #定義dump的目錄 max_filedesc 2048 #最大打開的文件描述 half_closed_clients off #使Squid在當read不再返回數據時立即關閉客戶端的連接。 #有時read不再返回數據是由於某些客戶關閉TCP的發送數據 #而仍然保持接收數據。而Squid分辨不出TCP半關閉和完全關閉。 buffered_logs on #若打開選項“buffered_logs”可以稍稍提高加速某些對日志文件的寫入,該選項主要是實現優化特性。 #防止天涯盜鏈,轉嫁給百度 acl tianya referer_regex -i tianya http_access deny tianya deny_info tianya #阻止baidu蜘蛛 acl baidu req_header User-Agent Baiduspider http_access deny baidu #限制同一IP客戶端的最大連接數 acl OverConnLimit maxconn 128 http_access deny OverConnLimit #防止被人利用為HTTP代理,設置允許訪問的IP地址 acl myip dst 222.18.63.37 http_access deny !myip #允許本地管理 acl Manager proto cache_object acl Localhost src 127.0.0.1 222.18.63.37 http_access allow Manager Localhost cachemgr_passwd 53034338 all http_access deny Manager #僅僅允許80端口的代理 acl all src 0.0.0.0/0.0.0.0 acl Safe_ports port 80 # http http_access deny !Safe_ports http_access allow all #Squid信息設置 visible_hostname happy.swjtu.edu.cn cache_mgr ooopic2008@qq.com #基本設置 cache_effective_user squid cache_effective_group squid tcp_recv_bufsize 65535 bytes #2.6的反向代理加速配置 cache_peer 127.0.0.1 parent 80 0 no-query originserver #錯誤文檔 error_directory /usr/local/squid/share/errors/Simplify_Chinese #單台使用,不使用該功能 icp_port 0 hierarchy_stoplist cgi-bin ? acl QUERY urlpath_regex cgi-bin \? .php .cgi .avi .wmv .rm .ram .mpg .mpeg .zip .exe cache deny QUERY acl apache rep_header Server ^Apache broken_vary_encoding allow apache refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 cache_store_log none pid_filename /usr/local/squid/var/logs/squid.pid emulate_httpd_log on
Squid常用命令
-
初始化在squid.conf里配置的cache目錄
squid -z
如果有錯誤提示,請檢查cache目錄的權限,可以更改目錄權限
chown -R squid:squid /cache目錄 -
對squid.conf排錯,即驗證squid.conf的語法和配置
squid -k parse
如果在squid.conf中有語法或配置錯誤,這里會返回提示,若無返回,嘗試啟動squid -
前台啟動squid,並輸出啟動過程
/usr/local/squid/sbin/squid -N -d1
如果有ready to server reques相關信息,說明squid啟動成功
然后ctrl+c ,停止squid,並以后台運行的方式啟動它 -
啟動squid在后台運行
squid -s
可以使用ps -ax | grep squid 來查看squid進程是否存在 -
停止squid
squid -k shutdown -
重新引導修改過的squid.conf
squid -k reconfigure -f /XXX/squid.conf
當squid進行配置更改后,可以使用該命令進行squid配置重載 - 把squid添加到系統啟動項
vim /etc/rc.local
/usr/local/squid/sbin/squid -s -
修改cache緩存目錄的權限
chown -R squid.squid /cache目錄
cache緩存目錄根據自己的配置更改,squid用戶和組是squid,squid -
修改squid日志目錄的權限
chown -R squid.squid 定義的日志文件所在目錄
這一步並不是適合每一個使用squid的用戶,意為讓squid有權限在該目錄里進行寫操作 -
查看你的日志文檔
more /usr/local/squid/var/logs/access.log | grep TCP_MEM_HIT
該指令可以看到在squid運行過程中,有那些文件被squid緩存到內存中,並返回給訪問用戶。
more /usr/local/squid/var/logs/access.log | grep TCP_HIT
該指令可以看到在squid運行過程中,有那些文件被squid緩存到cache目錄中,並返回給訪問用戶。
more /usr/local/squid/var/logs/access.log | grep TCP_MISS
該指令可以看到在squid運行過程中,有那些文件沒有被squid緩存,而是從原始服務器獲取並返回給訪問用戶。
Squid命中率分析
/usr/local/squid/bin/squidclient -p 80 mgr:info /usr/local/squid/bin/squidclient -p 80 mgr:5min
可以看到詳細的性能情況,其中PORT是你的proxy的端口,5min可以是60min
取得squid運行狀態信息:
squidclient -p 80 mgr:info
取得squid內存使用情況:
squidclient -p 80 mgr:mem
取得squid已經緩存的列表:
squidclient -p 80 mgr:bjects. use it carefully,it may crash
取得squid的磁盤使用情況:
squidclient -p 80 mgr:diskd
強制更新某個url:
squidclient -p 80 -m PURGE http://www.xxx.com/xxx.php
更多的請查看:squidclient-h 或者 squidclient -p 80 mgr:
查命中率:
squidclient -h IP(具體偵聽IP) -p 80(具體偵聽端口) mgr:info
定期清理swap.state內無效數據
/path/to/squid/sbin/squid -k rotate -f /path/to/squid/conf_file vi /etc/crontab 0 0 * * * root /usr/local/sbin/squid -k rotate -f /usr/local/etc/squid/squid1.conf
當squid應用運行了一段時間之后,cache_dir對應的swap.state文件就會變得越來越大,里面的無效接口數據越來越多,這可能影響squid的響應時間,因此需要使用squid清理swap.state里面的無效數據,減少swap.state的大小。
參考文章:
http://blog.chinaunix.net/uid-18933439-id-2808695.html
http://linuxme.blog.51cto.com/1850814/372960
http://blog.sina.com.cn/s/blog_67dd1efa0100izc0.html