1,有两种模式:
1)  Nginx(负载)+varish(缓存)+WEB
2)  Varish(缓存和负载)+web
Varish的负载我没有试过,但是感觉用第一种模式可以取得更好的扩展性和高可用性。
   
Nginx  轮询转发到后台三台 varish 后连接三个WEB 连接数据库
 
2varish是以内存作为共享容器的,内存的大小决定了它的缓存容量。相对于主要以硬盘为存储的squid来说要高效的多。它适合一些经常查询且变化不大的静态内容缓存。
    
     Nginx  图片和静态文本给 varish 后端是WEB8080端口
            动态内容给后端WEB  后端是WEB8080端口
     这个架构要看服务器和存储内容,如果nginx不用做反向代理以支持后台诸多应用的话,那么单就nginx来说,利用proxy_cache模块也可以支持本地缓存。它缓存在硬盘上,性能和squid相差不大,但是稳定性和易用性要好的多。
 
3,安装varish
    1 创建用户和组,赋予权限
groupadd www
useradd -g www www
mkdir -p /car/vcache
chown -R www:www /var/vcache
   
  2 )创建 varnish 日志目录并授权
mkdir -p /var/log/varnish
chmod +w /var/log/varnish
chown -R www:www /var/log/varnish
   
 3 编译安装 varnish
tar zxvf varnish- 1.1.2 .tar.gz
cd varnish- 1.1.2
./configure --prefix=/usr/local/varnish
make && make install
   
 4 创建并修改配置文件
vi /usr/local/varnish/vcl/conf
 
backend default {                           # 通过反向代理请求后端 IP 192.168.0.5 80 端口的 WEB 服务器 可以是本机 也可以是后台
                  .host = "192.168.0.151";
                  .port = "81";
}
 
acl purge {                                      # 允许这三个来源的 IP 通过 PURGE 方法清除缓存
       "localhost";
       "127.0.0.1";
       "192.168.1.0"/24;
}
 
sub vcl_recv {
       if (req.request == "PURGE") {
               if (!client.ip ~ purge) {
                       error 405 "Not allowed.";    #405 错误显示
               }
              return(lookup);
       }
 
       if (req.http.host ~ "^blog.s135.com") {
               set req.backend = default;
               if (req.request != "GET" && req.request != "HEAD") {
                return(pipe);
               }
               else {
                return (lookup);
               }
       }
       else {
               error 404 "Not in cache"; #404 错误显示
               return(lookup);
       }
}
 
sub vcl_hit {
       if (req.request == "PURGE") {
               set obj.ttl = 0s;
               error 200 "Purged.";
       }
}
 
sub vcl_miss {
       if (req.request == "PURGE") {
               error 404 "Not in cache.";
       }
}
 
sub vcl_fetch {                                            
       if (req.request == "GET" && req.url ~ "\.(txt|js)$") {
              set obj.ttl = 3600s;                         # 对于 txt js 缓存一个小时
       }
       else {
               set obj.ttl = 30d;                     # 其余的缓存一天
       }
}
Varnish HTTP 协议中的 GET HEAD 请求进行缓存 POST 请求透过 让其直接访问后端 Web 服务器。之所以这样配置,是因为 POST 请求一般是发送数据给服务器的,需要服务器接收、处理,所以不缓存;
 
   5 )启动
ulimit -SHn 51200 
/usr/local/varnish/sbin/varnishd -a :80 -b 192.168.0.151:81 -p thread_pool_max=1500 -p thread_pools=5 -p listen_depth=512  -w 1,10000,120
 
 6 将访问日志写入访问文件
/usr/local/varnish/bin/varnishncsa -n /var/vcache -w /var/log/varnish/varnish.log &
 
  7 )查看状态
安装varish作为缓存和代理_第1张图片
8)测试
我们用varish监听80端口,同时将数据来源转向到监听81端口的Apache
访问主页
安装varish作为缓存和代理_第2张图片