squid+apache實現緩存加速

本實例是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.

相關文章
相關標籤/搜索