一、關(guān)于緩存代理
1、代理的工作機(jī)制
作為應(yīng)用層的代理服務(wù)軟件,Squid主要提供緩存加速和應(yīng)用層過濾控制的功能。當(dāng)客戶機(jī)通過代理來請(qǐng)求Web頁面時(shí),指定的代理服務(wù)器會(huì)先檢查自己的緩存,如果緩存中已經(jīng)有客戶機(jī)需要訪問的頁面,則直接將緩存中的頁面內(nèi)容反饋給客戶機(jī);如果緩存中沒有客戶機(jī)需要訪問的頁面,則由代理服務(wù)器向Internet發(fā)送訪問請(qǐng)求,當(dāng)獲得返回的Web頁面以后,將網(wǎng)頁數(shù)據(jù)保存到緩存中并發(fā)送給客戶機(jī)。
HTTP代理的緩存加速對(duì)象主要是文字、圖像等靜態(tài)Web元素。使用緩存機(jī)制后,當(dāng)客戶機(jī)在不同的時(shí)候訪問同一Web元素,或者不同的客戶機(jī)訪問相同的Web元素時(shí),可以直接從代理服務(wù)器的緩存中獲得結(jié)果。這樣就大大減少了向Internet重復(fù)提交Web請(qǐng)求的過程,提高了客戶機(jī)的Web訪問響應(yīng)速度。
由于客戶機(jī)的Web訪問請(qǐng)求實(shí)際上是由代理服務(wù)器來代替完成的,從而可以隱藏用戶的真實(shí)IP地址,起到一定的保護(hù)作用。另一方面,代理服務(wù)器擔(dān)任著類似“經(jīng)紀(jì)人”的角色,所以有機(jī)會(huì)針對(duì)要訪問的目標(biāo)、客戶機(jī)的地址、訪問的時(shí)間端進(jìn)行過濾控制。
2、代理的基本類型
根據(jù)實(shí)現(xiàn)的方式不同,代理服務(wù)可分為傳統(tǒng)代理和透明代理兩個(gè)常見的代理服務(wù)。
1)傳統(tǒng)代理
也就是普通的代理服務(wù),首先必須在客戶機(jī)的瀏覽器、QQ聊天工具、下載軟件等程序中手動(dòng)設(shè)置代理服務(wù)器的地址和端口,然后才能使用代理服務(wù)來訪問網(wǎng)絡(luò)。對(duì)于網(wǎng)頁瀏覽器,訪問網(wǎng)站時(shí)的域名解析請(qǐng)求也會(huì)發(fā)送給指定的代理服務(wù)器。
2)透明代理
提供與傳統(tǒng)代理相同的功能和服務(wù),其區(qū)別在于客戶機(jī)不需要指定代理服務(wù)器的地址和端口,而是通過默認(rèn)路由、防火墻策略將Web訪問重定向,實(shí)際上仍然交給代理服務(wù)器來處理。重定向的過程對(duì)客戶機(jī)來說時(shí)是“透明”的,用戶甚至并不知道自己在使用代理服務(wù),所以稱為“透明代理”。使用透明代理時(shí),網(wǎng)頁瀏覽器訪問網(wǎng)站時(shí)的域名解析請(qǐng)求將優(yōu)先發(fā)給DNS服務(wù)器。
在實(shí)際應(yīng)用中,傳統(tǒng)代理多見于Internet環(huán)境,如為QQ程序使用代理可以隱藏本機(jī)真實(shí)IP地址,為下載工具使用多個(gè)代理可以規(guī)避服務(wù)器的并發(fā)連接限制。而透明帶多見于局域網(wǎng)環(huán)境,如在Linux網(wǎng)關(guān)中啟用透明代理后,局域網(wǎng)主機(jī)無需進(jìn)行額外的設(shè)置就可以享受更好的上網(wǎng)速度。
二、搭建Squid傳統(tǒng)代理服務(wù)器
1、安裝Squid
tar xf squid-3.5.27.tar.gz yum install gcc gcc-c++ make perl-devel -y //安裝環(huán)境 cd squid-3.5.27/ //進(jìn)入源碼包進(jìn)行配置 ./configure --prefix=/usr/local/squid #單獨(dú)將配置文件修改到其他目錄 --sysconfdir=/etc #單獨(dú)將配置文件修改到其他目錄 --enable-arp-acl #可以在規(guī)則中設(shè)置為直接通過客戶端MAC進(jìn)行管理,防止客戶端使用IP欺騙 --enable-linux-netfilter #使用內(nèi)核過濾 --enable-linux-tproxy #支持透明模式 --enable-async-io=100 #異步I/O,提升存儲(chǔ)性能 --enable-err-language="Simplify_Chinese" #錯(cuò)誤信息的顯示語言 --enable-underscore #允許URL中有下劃線 --enable-poll #使用poll()模式,提升性能 --enable-gnuregex #使用GNU正則表達(dá)式 make && make install //編譯并安裝 ln -s /usr/local/squid/sbin/* /usr/local/sbin //對(duì)命令做本地軟鏈接 useradd -M -s /sbin/nologin squid //為程序創(chuàng)建用戶 chown -R squid:squid /usr/local/squid/var/ //更改目錄屬主和屬組
2、更改配置文件(配置傳統(tǒng)代理)vi /etc/squid.conf
http_access allow all
http_port 3128 //在下面新增
visible_hostname 192.168.80.181
cache_mem 64 MB
cache_swap_low 80
cache_swap_high 97
cache_dir ufs /usr/local/squid/var/cache/squid 512 16 256 //配置硬盤緩存,打開#.緩存目錄512M,其中一級(jí)目錄16個(gè),二級(jí)256個(gè)
cache_effective_user squid
cache_effective_group squid
squid -k parse //檢查配置文件 squid -k rec //重新加載配置文件 squid -zX //初始化緩存目錄
3、制作啟動(dòng)腳本vi /etc/init.d/squid
#!/bin/bash
#chkconfig: 35 90 25
#config: /etc/squid.conf
#pidfile: /usr/local/squid/var/run/squid.pid
#Description: Squid – Internet Object Cache
PID=”/usr/local/squid/var/run/squid.pid”
CONF=”/etc/squid.conf”
CMD=”/usr/local/squid/sbin/squid”
case “$1” in
start)
netstat -utpln | grep squid &>/dev/null
if [ $? -eq 0 ]
then
echo “Squid is running”
else
$CMD
fi
;;
stop)
$CMD -k kill &>/dev/null
rm -rf $PID &>/dev/null
;;
status)
[ -f $PID ] &>/dev/null
if [ $? -eq 0 ]
then
netstat -utpln | grep squid
else
echo “Squid is not running”
fi
;;
restart)
$0 stop &>/dev/null
echo “正在關(guān)閉Squid…”
$0 start &>/dev/null
echo “正在啟動(dòng)Squid…”
;;
reload)
$CMD -k reconfigure
;;
check)
$CMD -k parse
;;
*)
echo “用法:{start | stop | restart | reload | check | status}”
esac
chmod +x /etc/init.d/squid //添加服務(wù)執(zhí)行權(quán)限 chkconfig --add squid //添加到系統(tǒng)配置中 chkconfig squid on //在系統(tǒng)配置中開啟 service squid start //開啟服務(wù) netstat -anpt | grep 3128 //查看監(jiān)聽端口
yum install httpd -y //在另外一臺(tái)服務(wù)器上安裝apache systemctl start httpd //啟動(dòng)服務(wù)
4、配置代理端口并訪問驗(yàn)證
Windows使用代理服務(wù)器
瀏覽器—工具—Internet選項(xiàng)—連接—局域網(wǎng)(LAN)設(shè)置
Linux使用代理服務(wù)器vi /etc/profile
末行添加
export HTTP_PROXY=http://192.168.80.100:3128 //使用HTTP協(xié)議指定代理
export HTTPS_PROXY=https://192.168.80.100:3128 //使用HTTPS協(xié)議指定代理
export FTP_PROXY=http://192.168.80.100:3128 //使用FTP協(xié)議指定代理
export NO_PROXY=192.168.1.,192.168.2. //不使用代理的兩個(gè)局域網(wǎng)段source /etc/profile //刷新環(huán)境
驗(yàn)證代理服務(wù)器
使用windows瀏覽器訪問網(wǎng)頁192.168.80.110cat /usr/local/squid/var/logs/access.log //在squid服務(wù)器跟蹤訪問日志文件
結(jié)論:通過訪問日志可以發(fā)現(xiàn)客戶機(jī)192.168.80.10訪問web服務(wù)器192.168.80.110的記錄,說明squi的代理服務(wù)器發(fā)揮了作用。cat /etc/httpd/logs/access_log //在web服務(wù)器查看訪問日志的新增記錄
結(jié)論:通過訪問日志可以發(fā)現(xiàn)來自代理服務(wù)器192.168.80.100的訪問記錄,說明當(dāng)客戶機(jī)使用代理以后,web服務(wù)器并不知道客戶機(jī)的真實(shí)IP地址,因?yàn)閷?shí)際上由代理服務(wù)器在代替客戶機(jī)訪問。
當(dāng)客戶機(jī)再次訪問同一web頁面時(shí),Squid訪問日志中會(huì)增加新的記錄,但web訪問日志中的記錄不會(huì)有變化(除非頁面變更或強(qiáng)制刷新)。說明重復(fù)訪問同一靜態(tài)頁面時(shí),實(shí)際上頁面是由代理服務(wù)器通過緩存提供的。
三、搭建Squid透明代理服務(wù)器
1、系統(tǒng)環(huán)境
內(nèi)網(wǎng)卡ens33:192.168.80.100
外網(wǎng)卡ens37:192.168.90.100
Web服務(wù)器:192.168.80.110
客戶端:192.168.90.11echo 1 > /proc/sys/net/ipv4/ip_forward //開啟Squid服務(wù)器的路由轉(zhuǎn)發(fā)功能
2、更改配置文件(透明代理)vi /etc/squid.conf //配置服務(wù)器并關(guān)閉客戶端指定代理設(shè)置
service squid restart //重啟服務(wù)
3、這只iptables的重定向策略
iptables -F //清空iptables策略兵器新建策略 iptables -t nat -I PREROUTING -i ens33 -s 192.168.80.0/24 -p tcp --dport 80 -j REDIRECT --to 3128 iptables -t nat -I PREROUTING -i ens33 -s 192.168.80.0/24 -p tcp --dport 443 -j REDIRECT --to 3128 iptables -I INPUT -p tcp --dport 3218 -j ACCEPT service iptables save
4、ACL訪問控制
1)禁止某IP地址主機(jī)上網(wǎng)
acl nolink src 192.168.90.9
http_access deny nolink
2)禁止某網(wǎng)段在某時(shí)間段上網(wǎng)
acl nolink src 192.168.1.0/24
acl nowang time MTWHF 9:00-11:30
http_access deny nolink nowang
3)禁止所有人訪問某網(wǎng)站(精確匹配)
acl nourl dstdomain -i www.qq.com
http_access deny nourl
4)禁止所有人訪問某些網(wǎng)站(含有關(guān)鍵字的都會(huì)過慮)
acl nourl url_regex -i taobao.com
http_access deny nourl
5)禁止下載某類型的文件
acl nof urlpath_regex -i .avi$ .mkv$
http_access deny nof
6)禁止訪問某類型的網(wǎng)站
acl nop url_regex -i ^emule:// ^thunder
http_access deny nop
5、測(cè)試透明代理
內(nèi)網(wǎng)web服務(wù)器指定內(nèi)網(wǎng)網(wǎng)關(guān)vi /etc/sysconfig/network-scripts/ifcfg-ens33
外網(wǎng)web瀏覽器指定外網(wǎng)網(wǎng)關(guān)
打開win7瀏覽器模擬外網(wǎng)客戶端
訪問192.168.80.110 //直接訪問內(nèi)網(wǎng)主機(jī)
四、搭建Squid反向代理服務(wù)器
1、系統(tǒng)環(huán)境
增加一臺(tái)web服務(wù)器對(duì)應(yīng)的IP地址為:192.168.80.120
2、修改配置文件(反向代理)vi /etc/squid.conf
http_port 192.168.80.100:80 accel vhost vport
cache_peer 192.168.80.110 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
cache_peer 192.168.80.120 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2
cache_peer_domain web1 web2 www.yun.com
service squid stop //服務(wù)重啟 service squid start
3、Web訪問代理服務(wù)器
五、Squid日志分析(sarg工具)
1、安裝sarg工具
yum install httpd gd gd-devel pcre-devel -y //squid服務(wù)器安裝apache和對(duì)應(yīng)的庫文件 tar xf sarg-2.3.11.tar.gz //解壓源碼包 cd sarg-2.3.11/ ./configure //安裝前的配置 --prefix=/usr/local/sarg --sysconfdir=/etc/sarg --enable-extraprotection make && make install //編譯安裝
2、相關(guān)配置vi /etc/sarg/sarg.conf //修改日志分析配置文件
7 access_log /usr/local/squid/var/logs/access.log //squid的訪問日志位置
25 title “Squid User Access Reports” //網(wǎng)頁標(biāo)題
120 output_dir /var/www/html/squid-reports //分析報(bào)告的存放位置
178 user_ip no //不使用IP代替用戶ID
184 topuser_sort_field BYTES reverse //升序排列
190 user_sort_field BYTES reverse
206 exclude_hosts /usr/local/sarg/noreport //設(shè)置不生成報(bào)告的主機(jī)
257 overwrite_report no
289 mail_utility mailx //指定發(fā)郵件命令
434 charset UTF-8
518 weekdays 0-6 //指定top排序星期周期
523 hours 7-12,14,16,18-20 //指定top排序時(shí)間周期
633 www_document_root /var/www/html //網(wǎng)頁根目錄
touch /usr/local/sarg/noreport //建立不生成報(bào)告的主機(jī)列表文件 ln -s /usr/local/sarg/bin/sarg /usr/local/bin/ sarg //啟動(dòng),執(zhí)行該命令只記錄一次
crontab -e //做計(jì)劃任務(wù)分時(shí)段記錄 */10 * * * * /usr/local/bin/sarg
3、驗(yàn)證訪問
http://192.168.80.100:81/squid-reports/
注意:由于上訴squid做代理80端口被占用,因此將squid服務(wù)器httpd對(duì)應(yīng)的端口改為81
六、Varnish與Nginx緩存服務(wù)器
1、高性能緩存服務(wù)器Varnish
Varnish是一款高性能的、開源的方向代理服務(wù)器和緩存器。挪威最大的在線報(bào)紙Verdens Gang使用了3臺(tái)Varnish代替了原來的12臺(tái)Squid,性能更好!
Varnish與Squid的對(duì)比如下:
(1)優(yōu)點(diǎn)
Varnish具有更好的穩(wěn)定性、更快的訪問速度、更多的并發(fā)連接支持?jǐn)?shù),可以通過管理端口來管理緩存。
(2)缺點(diǎn)
1)在高并發(fā)狀態(tài)下,Varnish消耗更多的CPU、I/O和內(nèi)存資源。
2)Varnish進(jìn)程一旦掛起、崩潰或者重啟,緩存的數(shù)據(jù)會(huì)從內(nèi)存中釋放,此時(shí)所有的請(qǐng)求都會(huì)轉(zhuǎn)發(fā)到后端服務(wù)器,給后端服務(wù)器造成很大壓力。
2、輕量級(jí)緩存服務(wù)器Nginx
Nginx支持類似Squid的緩存功能,把URL以及相關(guān)信息當(dāng)成key,用MD5編碼Hash后把數(shù)據(jù)文件保存在硬盤上。
Nginx只能為只當(dāng)?shù)腢RL或者狀態(tài)碼設(shè)置過期時(shí)間,并不支持類似Squid的purge命令來手動(dòng)清除指定的緩存頁面??梢酝ㄟ^第三方的ngx_cache_purge來清除指定的URL緩存。
Nginx的緩存加速功能是由proxy_cache和fastcgi_cache兩個(gè)功能模塊完成的。
Nginx緩存加速的特點(diǎn)如下:
1)緩存功能十分穩(wěn)點(diǎn),運(yùn)行速度不遜于Squid。
2)對(duì)多核CPU的利用率比其他的開源軟件要好。
3)支持高并發(fā)請(qǐng)求數(shù),能同時(shí)承受更多的訪問請(qǐng)求。