varnish

Varnish是一款高性能的开源HTTP加速器挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。

Varnish与一般服务器软件类似,分为master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。

针对文件缓存部分,master读入存储配置(-s file[,path[,size[,granularity]]] ),调用合适的存储类型,然后创建/读入相应大小的缓存大文件。接着,master初始化管理该存储空间的结构体。这些变量都是全局变量,在fork以后会被child进程所继承(包括文件描述符)。

在child进程主线程初始化过程中,将前面打开的存储大文件整个mmap到内存中(如果超出系统的虚拟内存,mmap失败,进程会减少原来的配置mmap大小,然后继续mmap),此时创建并初始化空闲存储结构体,挂到存储管理结构体,以待分配。

接着,真正的工作开始,Varnish的某个负责接受新HTTP连接的线 程开始等待用户,如果有新的HTTP连接过来,它总负责接收,然后叫醒某个等待中的线程,并把具体的处理过程交给它。Worker线程读入HTTP请求的 URI,查找已有的object,如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。

分配缓存的过程是这样的:它根据所读到object的大小,创建相应大小的缓存文件。为了读写方便,程序会把每个object的大小变为最接近其大小的内存页面倍数。然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。如果缓存已满,就根据LRU机制,把最旧的object释放掉。

释放缓存的过程是这样的:有一个超时线程,检测缓存中所有object的生存期,如果超初设定的TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块,如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。

整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的object都考虑是在内存中,如果系统内存不足,系统会自动将其换到swap空间,而不需要varnish程序去控制。

物理主机:  172.25.26.254
实验主机:
varnish    172.25.26.1
apache     172.25.26.2
apache     172.25.26.3


配置varnish主机:172.25.26.1
创建:
cd /var/lib/libvirt/images/
ls
qemu-img create -f qcow2 -b dd.qcow2  dd1

配置:
hostname server1
vim /etc/sysconfig/network
   NETWORKING=yes
   HOSTNAME=server1


vim /etc/sysconfig/network-scripts/ifcfg-eth0
   DEVICE=eth0
   ONBOOT=yes
   BOOTPROTO=no
   IPADDR=172.25.26.1
   PREFIX=24


/etc/init.d/network  restart
ip addr
[root@server1 varnish]# cd /root
[root@server1 ~]# ls
varnish-3.0.5-1.el6.x86_64.rpm  varnish-libs-3.0.5-1.el6.x86_64.rpm
[root@server1 ~]yum install * -y


cd /etc/varnish
ls
[root@server1 ~]# sysctl -a | grep file
fs.file-nr = 480    0    98861
fs.file-max = 98861

[root@server1 ~]# vim /etc/sysconfig/varnish
    
  7 # Maximum number of open files (for ulimit -n)
  8 NFILES=98000
  9
 10 # Locked shared memory (for ulimit -l)
 11 # Default log size is 82MB + header
 12 MEMLOCK=82000
 13
 14 # Maximum number of threads (for ulimit -u)
 15 NPROCS="unlimited"

 65 # VARNISH_LISTEN_ADDRESS=
 66 VARNISH_LISTEN_PORT=80

[root@server1 ~]# vim /etc/security/limits.conf
# End of file
varnish            -       nofile         98001
varnish            -      memlock         82000
varnish            -      nproc           unlimited


/etc/init.d/varnish  start
netstat -antlp

一、
配置apache     172.25.26.2
创建:
cd /var/lib/libvirt/images/
ls
qemu-img create -f qcow2 -b dd.qcow2  dd2
配置:
hostname server2
vim /etc/sysconfig/network
   NETWORKING=yes
   HOSTNAME=server2
vim /etc/sysconfig/network-scripts/ifcfg-eth0
   DEVICE=eth0
   ONBOOT=yes
   BOOTPROTO=no
   IPADDR=172.25.26.2
   PREFIX=24
/etc/init.d/network  restart
ip addr
yum install -y httpd
/etc/init.d/httpd  start
cd /var/www/html
ls
vim index.html
www.westos.org---server2
(1)配置varnish
配置varnish主机:172.25.26.1
[root@server1 ~]# cd /etc/varnish/
[root@server1 varnish]# ls
default.vcl  secret


[root@server1 varnish]# vim default.vcl
backend web1 {
  .host = "172.25.26.2";
  .port = "80";
}
/etc/init.d/varnish    reload


物理主机的测试    172.25.26.250
vim /etc/hosts
172.25.26.1  www.westos.org   

浏览器:172.25.26.1
curl  www.westos.org  
curl  www.westos.org -I

 

(2)、查看缓存命中情况

配置varnish主机:172.25.26.1
[root@server1 ~]# cd /etc/varnish/
[root@server1 varnish]# ls
default.vcl  secret
[root@server1 varnish]# vim default.vcl
backend web1 {
  .host = "172.25.26.2";
  .port = "80";
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}


/etc/init.d/varnish    reload


物理主机的测试    172.25.26.250
curl  www.westos.org  
curl  www.westos.org -I


二、

配置apache     172.25.26.3
创建:
cd /var/lib/libvirt/images/
ls
qemu-img create -f qcow2 -b dd.qcow2  dd2


配置:
hostname server3
vim /etc/sysconfig/network
   NETWORKING=yes
   HOSTNAME=server2
vim /etc/sysconfig/network-scripts/ifcfg-eth0
   DEVICE=eth0
   ONBOOT=yes
   BOOTPROTO=no
   IPADDR=172.25.26.3
   PREFIX=24
/etc/init.d/network  restart
ip addr
yum install -y httpd
/etc/init.d/httpd  start


cd /var/www/html
ls
vim index.html
bbs.westos.org

(1)不同多个域名站点的后端服务器存在,此时varnish服务设置
配置varnish主机:172.25.26.1
[root@server1 ~]# cd /etc/varnish/
[root@server1 varnish]# ls
default.vcl  secret
[root@server1 varnish]# vim default.vcl
###定义多个不同域名站点的后端服务器
backend web1 {
  .host = "172.25.26.2";
  .port = "80";
}
backend web2 {
  .host = "172.25.26.3";
  .port = "80";
}

sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = web1;
#return (pass);
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}

sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}

/etc/init.d/varnish    reload


物理主机的测试    172.25.26.250
vim /etc/hosts
172.25.26.1  www.westos.org   bbs.westos.org


浏览器:172.25.26.1
curl  www.westos.org  
curl  www.westos.org -I
curl  bbs.westos.org  
curl  bbs.westos.org -I

(2)当访问www.westos.org时有可能后台服务器忽然坏掉,此时我们需要设置当其中一个有问题时,可以从其他的获取

配置apache     172.25.26.3
vim /etc/httpd/conf/httpd.conf
 990 NameVirtualHost *:80
 991 #
 992 # NOTE: NameVirtualHost cannot be used without a port specifier
 993 # (e.g. :80) if mod_ssl is b

 1009 #</VirtualHost>
 1010 <VirtualHost *:80>
 1011     DocumentRoot /var/www/html
 1012     ServerName bbs.westos.org
 1013 </VirtualHost>
 1014
 1015 <VirtualHost *:80>
 1016     DocumentRoot /www1
 1017     ServerName www.westos.org
 1018 </VirtualHost>

[root@server3 html]# vim /etc/httpd/conf/httpd.conf
 
[root@server3 html]# mkdir /www1
[root@server3 html]# cd /www1
[root@server3 www1]# ls
[root@server3 www1]# vim index.html
www.westos.org---server3


[root@server3 www1]# /etc/init.d/httpd   restart

配置varnish主机:172.25.26.1
[root@server1 ~]# cd /etc/varnish/
[root@server1 varnish]# ls
default.vcl  secret
[root@server1 varnish]# vim default.vcl
backend web1 {
  .host = "172.25.26.2";
  .port = "80";
}
backend web2 {
  .host = "172.25.26.3";
  .port = "80";
}

director westos round-robin {
{.backend = web1;}
{.backend = web2;}
}

sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = westos;
#return (pass);
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}


sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}


/etc/init.d/varnish    reload

物理主机的测试    172.25.26.250
 
配置varnish主机:172.25.26.1
[root@server1 ~]# cd /etc/varnish/
[root@server1 varnish]# ls
default.vcl  secret
[root@server1 varnish]# vim default.vcl
               return (pass);


/etc/init.d/varnish    reload


物理主机的测试    172.25.26.250
  curl  www.westos.org  
  curl  www.westos.org -I
  curl  www.westos.org
  curl  www.westos.org   -I
  curl  www.westos.org


配置varnish主机:172.25.26.1
[root@server1 ~]# cd /etc/varnish/
[root@server1 varnish]# ls
default.vcl  secret
[root@server1 varnish]# vim default.vcl
     #return (pass);
/etc/init.d/varnish    reload


[root@server1 varnish]#varnishadm ban.url  /index.html


物理主机的测试    172.25.26.250
www.westos.org/index.html
www.westos.org/index.html
www.westos.org/index.html

 

Logo

更多推荐