跑上nginx+varnish的结构已经有一段时间了,比较稳定,再加上这段时间主要工作是民工活(搬运等体力活),没去关心这些东西。
忙完一段,有闲暇看看这些东西的文档和邮件列表。
原来一直觉得varnish虽然也支持round robin的后端负载均衡,但缺乏对主备系统的支持,也就是平时向后端的请求负载全部落在一个后端服务上,当这个后端服务宕了,才落到另一个后端服务上去。以前也转过这个念头,但貌似用vcl很难实现这个功能。
在varnish的wiki网站上增加了这样一条:http://varnish.projects.linpro.no/wiki/VCLExampleRestarts,上次看到这个东西,也没有空去试一下。
貌似从2067就开始支持了,呵呵,以前一直没注意到,直到上次重装系统的时候。
于是修改了一下自己的VCL:
在recv里增加了
if (req.restarts == 0) {
set req.backend = backend1;
} else {
set req.backend = backend2;
}
在fetch里增加了
if (obj.status != 200 && req.restarts == 0) {
restart;
}
这样,如果backend1对于请求返回200,则走正常流程,否则看转向请求backend2,如果backend2也返回200(此时req.restarts 不再是0),则转出错流程,不向后端重复请求。在这个配置下,我把原来apache服务也起在8080上,作为nginx的备份,平时是没有流量的。
查看varnish日志,确实体现了这样的情况
16 VCL_return c lookup
16 VCL_call c hash
16 VCL_return c hash
16 VCL_call c miss /*请求的东西在缓存里没有*/
16 VCL_return c fetch /*于是到后端取*/
20 TxRequest b GET
20 TxURL b /images/toolbar1.gif
20 TxProtocol b HTTP/1.1
20 TxHeader b Host: xxx.xxx.com
20 TxHeader b X-Real-IP: xxx.xxx.xxx.70
20 TxHeader b X-Forwarded-For: xxx.xxx.xxx.70
20 TxHeader b Accept: */*
20 TxHeader b Referer: http://xxx.xxx.com/index.php
20 TxHeader b Accept-Language: zh-cn
20 TxHeader b Accept-Encoding: gzip, deflate
20 TxHeader b User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; QQDownload 1.7)
20 TxHeader b Cookie: xxxxxxxxxxxxxxxxxxxxxxxxxxx
20 TxHeader b X-Varnish: 485739665
20 TxHeader b X-Forwarded-for: 127.0.0.1
20 RxProtocol b HTTP/1.1
20 RxStatus b 404 /*后端1说没这个东西*/
20 RxResponse b Not Found
20 RxHeader b Server: nginx
20 RxHeader b Date: Tue, 08 Apr 2008 01:29:29 GMT
20 RxHeader b Content-Type: text/html
20 RxHeader b Content-Length: 522
20 RxHeader b Connection: keep-alive
16 ObjProtocol c HTTP/1.1
16 ObjStatus c 404
16 ObjResponse c Not Found
16 ObjHeader c Server: nginx
16 ObjHeader c Date: Tue, 08 Apr 2008 01:29:29 GMT
16 ObjHeader c Content-Type: text/html
20 BackendReuse b backend1
16 TTL c 485739665 RFC 518400 1207619349 1207618169 0 0 0
16 VCL_call c fetch
16 VCL_return c restart /*由于上次返回的是404,于是restart*/
16 VCL_call c recv
16 VCL_return c lookup
16 VCL_call c hash
16 VCL_return c hash
16 VCL_call c miss
16 VCL_return c fetch
17 BackendClose backend2 /*这次是到后端2去取的*/
17 BackendOpen b backend2 xxx.xxx.xxx.xxx 54163 xxx.xxx.xxx.xxx 8080
17 TxRequest b GET
17 TxURL b /images/toolbar1.gif
17 TxProtocol b HTTP/1.1
17 TxHeader b Host: xxx.xxx.com
17 TxHeader b X-Real-IP: xxx.xxx.xxx.70
17 TxHeader b X-Forwarded-For: xxx.xxx.xxx.70
17 TxHeader b Accept: */*
17 TxHeader b Referer: http://xxx.xxx.com/index.php
17 TxHeader b Accept-Language: zh-cn
17 TxHeader b Accept-Encoding: gzip, deflate
17 TxHeader b User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; QQDownload 1.7)
17 TxHeader b Cookie: xxxxxxxxxxxxxxxxxxxxxxxxxxx
17 TxHeader b X-Varnish: 485739665
17 TxHeader b X-Forwarded-for: 127.0.0.1
17 RxProtocol b HTTP/1.1
17 RxStatus b 404 /*还是没有取到*/
17 RxResponse b Not Found
17 RxHeader b Date: Tue, 08 Apr 2008 01:29:29 GMT
17 RxHeader b Server: Apache/2.2.2 (Unix) xxxxxxxxxxxxxxx
17 RxHeader b Content-Length: 404
17 RxHeader b Content-Type: text/html; charset=iso-8859-1
16 ObjProtocol c HTTP/1.1
16 ObjStatus c 404
16 ObjResponse c Not Found
16 ObjHeader c Date: Tue, 08 Apr 2008 01:29:29 GMT
16 ObjHeader c Server: Apache/2.2.2 (Unix) xxxxxxxxxxxxxxxxxxxxxxxxxxx
16 ObjHeader c Content-Type: text/html; charset=iso-8859-1
17 BackendReuse b backend1
16 TTL c 485739665 RFC 518400 1207619349 1207618169 0 0 0
16 VCL_call c fetch
16 VCL_return c pass
16 Length c 404
16 VCL_call c deliver
16 VCL_return c deliver
由于是实际日志,上面摘取的部分修改了一些信息。