本實例是squid和apache在同一臺機器上,squid作前端反向代理。port爲80,apache做爲後端web,port爲81php
serverip:172.16.8.102css
1.首先介紹下版本號選擇,在進行測試以前必定要選定一個合適的squid版本號,在此推薦2.7。她和2.6功能類似但更好的支持http1.1,也有3.0以上版本號的很多特性。html
2.squid2.7安裝前端
cd /usr/local/src
linux
tar -zxvf squid-2.7.STABLE9.tar.gzweb
cd squid-2.7.STABLE9算法
./configure -prefix=/usr/local/squid2.7 -enable-xmalloc-statistics --enable-async-io=320 --with-maxfd=65536 -enable-useragent-log -enable-referer-log -enable-epoll -disable-poll -enable-large-cache-files -disable-internal-dns -enable-linux-netfilter -enable-truncate -enable-x-accelerator-vary -enable-follow-x-forwarded-for -with-large-files -with-pthreads -enable-storeio="aufs,coss,diskd,ufs" -enable-kill-parent-hack -enable-gnuregex -enable-cache-digests -enable-delay-pools -enable-stacktraces -enable-default-err-language=Simplify_Chinese -enable-err-languages="Simplify_Chinese English" --enable-auth="basic" --enable-basic-auth-helpers="NCSA" --enable-snmpapache
make && make installvim
3.建立suqid用戶後端
useradd squid
chown -R squid.squid squid
設置suqid安裝文件文件夾的屬性,不然squid可能會沒法啓動
4.建立緩文件夾
cd /data
mkdir -p squid/cache
chown -R squid.squid squid
5.建立日誌文件夾
cd /var/log
mkdir squid
chown -R squid.squid squid
設置suqid日誌的屬性,不然squid可能會沒法啓動
5.配置squid.conf
cd /usr/local/squid2.7
vim squid.conf
acl all src all
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 81 # http
acl Safe_ports port 3128 # http
acl Safe_ports port 8080 # 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 localnet
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow all
icp_access allow localnet
icp_access deny all
http_port 80 accel vhost vport
cache_peer 127.0.0.1 parent 81 0 no-query originserver name=test
cache_peer_access test allow all
hierarchy_stoplist cgi-bin ?
cache_mem 1024 MB
maximum_object_size_in_memory 6 MB
memory_replacement_policy lru
cache_replacement_policy lru
cache_dir ufs /data/squid/cache 1024 16 256
maximum_object_size 6 MB
cache_swap_low 90
cache_swap_high 95
access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
refresh_pattern ^ftp: 144020%10080
refresh_pattern ^gopher: 14400%1440
refresh_pattern -i (/cgi-bin/|\?) 0 0%0
refresh_pattern \.(jpg|png|gif|mp3|xml|html|htm|css|js|aspx) 1440 50% 2880 ignore-reload
refresh_pattern . 020%4320
acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]
cache_vary on
acl apache rep_header Server ^Apache
broken_vary_encoding allow all
cache_effective_user squid
cache_effective_group squid
visible_hostname 172.16.8.102
icp_port 0
reload_into_ims on
coredump_dir /usr/local/squid2.7/var/cache
所更改的參數解釋:
(1)acl Safe_ports port 81 # http
acl Safe_ports port 3128 # http
acl Safe_ports port 8080 # http
此處定義可以訪問的端口,由於http_access deny !Safe_ports,僅僅要不是在Safe_ports中出現的端口都會被限制,這個可以依據實際狀況而定.
(2)http_access allow all
在此我定義的是所有的ip都可以訪問squid,這也是爲了方便我在測試環境中使用,假設是線上應用請制定對應的訪問限制。
(3)http_port 80 accel vhost vport
定義訪問squid的port。
假設不加accel vhost vport說明你的squid默認作爲一個緩存服務器。這個時候假設client有請求發到了squid。squid起到的是路由功能,把請求轉發出去。被真正的web server接收,web server返回響應。當squid接收到響應後,依據響應頭決定是否緩存。此時的squid,僅僅是一個cache server。
假設加上accel vhost vport說明你的squidsquid就從一個緩存(cache server)變成了一個web server, 這個時候squid在80port監聽請求。同一時候和web server的請求port(vhost vport)綁定。這個時候請求到了squid,squid是不用轉發請求的。而是直接要麼從緩存中拿數據要麼向綁定的port直接請求數據。另外綁定port另外一個優勢,可以充分利用http 響應頭中的到期時間頭和etag頭。
cache_peer 127.0.0.1 parent 81 0 no-query originserver name=test
反向代理81port。81port爲apache;no-query不作查詢,直接獲取數據;orginserver 表明是源服務器;name定義反向代理的名字。可以對acl控制
(4)cache_mem 1024 MB
設置所用內存的大小
maximum_object_size_in_memory 6 MB
設置緩存對象所佔用的最大內存
memory_replacement_policy lru
cache_replacement_policy lru
替換機制
cache_dir ufs /data/squid/cache 1024 16 256
緩存文件夾的大小。應該不低於cache_mem
maximum_object_size 6 MB
最大的單個緩存對象
(5)access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
設置squid的日誌文件夾。注意日誌權限,不然有可能致使squid沒法啓動
(6)refresh_pattern \.(jpg|png|gif|mp3|xml|html|htm|css|js|aspx) 1440 50% 2880 ignore-reload
設置jpg等後綴格式的文件在cache中停留的時間
(7)cache_vary on
假設你發現squid緩存命中率很是低。即便調整refresh_pattern。maximum_object_size_in_memory,加大內存都沒用。利用cachemgr.cgi統計工具中的In-Memory and In-Transit Objects,發現HTML/js/css not_in_memory,而jpg/png等圖片都緩存了,則多是有由於這個參數off致使。
這是因爲apache在 response header 中返回了一個vary:Accept-encoding ,則squid在存儲緩存文件時需要將「瀏覽器」request header 信息中的Accept-encoding字段的值(gzip。deflate之類)做爲緩存key的一部分,所以對於不一樣的Accept-encoding字段值。都需要保存不一樣的文件。(IE與firefox的請求頭的Accept-encoding字段值中就有一個空格的區別下次
請求到squid的時候,需要先找到一個緩存文件的索引文件,依據索引文件裏的不一樣的Accep-encoding值再去找對應的緩存文件。 cache vary off,那麼通過gzip壓縮後含有vary頭的。都不會被cache了,因此和上述緩存策略沒什麼影響,而jpg原本是被壓縮過,不含vary,天然會被cache了。
(8)cache_effective_user squid
cache_effective_group squid
設置squid的用戶和組
(9)icp_port 0
禁用icp鄰居,假設你想使用squid集羣可以更改這個參數
(10)reload_into_ims on
開啓這個全局參數。可將client發來的no-cache轉化爲If-Modified-Since去處理
這個參數的設置,可以參考此博客http://blog.sina.com.cn/s/blog_56d8ea9001018xev.html
(11)hierarchy_stoplist cgi-bin ?
此爲默認參數。不論什麼包括問號或cgi-bin字符串的請求匹配該列表,變成不可層疊。
Squid內在的將每個client請求標記爲層疊或不可層疊。不可層疊的請求看起來不會致使cache命中。好比。POST請求的響應差點兒從不會被cache。在squid能簡單的鏈接到原始server時,轉發不可cache目標的請求到鄰居cache。純粹是浪費資源。
某些區分層疊和不可層疊請求的規則,在squid裏難於編碼。好比。POST和PUT方式老是不可層疊的。
然而,hierarchy_stoplist指令贊成你定製這樣的算法。它包括一個字符串列表。當在URI裏發現它們時。squid將請求標記爲不可層疊。
更改完配置文件後,可以進行初始化緩存文件夾和啓動squid了
/usr/local/squid2.7/sbin/squid -z
/usr/local/squid2.7/sbin/squid
lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
squid 1399 squid 17u IPv4 9965038 0t0 TCP *:http (LISTEN)
說明啓動成功,假設發現啓動沒成功,則檢查配置文件
6.cachemgr.cgi統計工具
vim /usr/local/squid2.7/etc/cachemgr.conf
localhost:80
80port爲squid的http_portport
cd /var/www/html
mkdir squid/cgi-bin
cp /usr/local/squid2.7/libexec/cachemgr.cgi /var/www/html/squid/cgi-bin
在apache中設置對應的訪問
vim /etc/httpd/conf.d/squid.conf
ScriptAlias /squid/cgi-bin/cachemgr.cgi /usr/local/squid2.7/libexec/cachemgr.cgi
# Only allow access from localhost by default
<Location /squid/cgi-bin/cachemgr.cgi>
order allow,deny
# allow from localhost.localdomain
allow from all
# Add additional allowed hosts as needed
# allow from .example.com
</Location>
service httpd restart使配置文件生效。
由於Apache使用的是81port,咱們直接用81port訪問就能夠
http://172.16.8.102:81/squid/cgi-bin/cachemgr.cgi
由於咱們沒有設置usernamepassword直接訪問就能夠,但是應用到線上則必須設置。
7.apache配置
網站的訪問配置我在直接用的是咱們一個測試網站,在這不作過多介紹。但在此要介紹下apache的mod_expoires模塊。此模塊可以下降10%左右的反覆請求,讓反覆的用戶對指定的頁面請求結果都CACHE在本地,根本不向server發出請求。
檢查apache按安裝有mod_expires模塊,所以咱們僅僅需要在/etc/httpd/conf.d/mod_expires.conf中進行配置就能夠。
vim /etc/httpd/conf.d/mod_expires.conf
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 12 hours"
ExpiresByType text/html "access plus 3 days"
ExpiresByType text/plain "access plus 3 days"
ExpiresByType text/css "access plus 7 days"
ExpiresByType image/gif "access plus 30 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/jpg "access plus 30 days"
ExpiresByType image/x-icon "access plus 30 days"
ExpiresByType video/x-flv "access plus 30 days"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
</IfModule>
當中對所有文件可以緩存的文件都默認設置爲12小時,對text/image/video等類型的文件又一次設置成對應的緩存時間。
設置完畢後service httpd restart 就能夠。
最後咱們訪問測試。而後查看緩存命中了。
另,在apache前端加squid後。個人負載能夠達到4000。但是squid消耗的cpu也有點高啊。
[root@localhost webbench-1.5]# webbench -c 4000 -t 30 http://172.16.8.102/Login.php
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://172.16.8.102/Login.php
4000 clients, running 30 sec.
Speed=685846 pages/min, 4664574 bytes/sec.
Requests: 342923 susceed, 0 failed.