天天看点

使用 varnish + nginx + lua 搭建网站的降级系统

通常一个网站数据库挂掉后,后果将是非常严重的。基本上整个网站基本不可用了。对于一些网站来说,当数据库挂掉后,如果能提供基本的浏览服务,也是不错的。本文将尝试使用 varnish + nginx + lua 搭建网站降级系统来实现整个目标。

使用 varnish + nginx + lua 搭建网站的降级系统

<a target="_blank"></a>

降级方案的目标是,当网站出现致命故障时(如出现500错误,不能提供服务),可以把缓存的页面数据展现给用户。从而提供基本的浏览服务。

只提供基本的浏览服务

浏览的数据都是非登录状态下的数据

支持手动和自动降级。自动降级是当后端返回500错误次数在一段时间内达到一定阈值(不包含503)。手动降级是从控制界面操作。

使用varnish作为存储。有效的节约了物理内存,并保持了较好的性能。

使用crond脚本从nginx的access日志中分析出请求url,然后向varnish发请求,从而更新varnish的缓存。缓存的异步更新,减少对nginx的压力。

支持手动降级和自动降级。降级后,nginx自动从varnish中提取数据,并返回给用户。

使用 varnish + nginx + lua 搭建网站的降级系统

pc_downgrade

用户请求到nginx时,nginx会判断当前是否是降级状态。如果属于降级状态,直接从varnish中获取数据。非降级状态,把请求转到php-fpm。

当crond脚本请求varnish进行缓存数据更新时,如果当前varnish处于降级状态,则不进行缓存更新。如果没有处在降级状态,则把请求转到nginx,获取数据。然后把获取的数据缓存到varnish中。

varnish会自动监控后端nginx的状态。如果检测到nginx已经处于降级状态,则varnish也会自动进入降级状态。

vanish安装到/home/varnish 目录下。安装步骤如下:

首先,安装libpcre。

<code>sudo yum install pcre pcre-devel</code>

其次,安装varnish。

<code>./configure --prefix=/home/varnish</code>

<code>make</code>

<code>sudo -u admin make install</code>

<code>sudo -u admin mkdir -p /home/varnish/vcache/</code>

<code>sudo chown admin:admin -r /home/varnish</code>

<code>sudo -u admin touch /home/varnish/vcache/varnish_cache.data</code>

<code>sudo chmod 777 /home/varnish/vcache/varnish_cache.data</code>

最后,启动varnish。启动脚本也在压缩包中,名称为 varnishctl

<code>sudo /home/admin/varnish/sbin/varnishctl start</code>

注意:启动后可以通过varnishlog命令查看是否运行正常。如果出现以下字样,说明运行正常。http的返回状态为200

<code>$ /home/varnish/bin/varnishlog</code>

<code>0 backend_health - default still healthy 4--x-rh 4 2 4 0.002698 0.001722 http/1.1 200 ok</code>

lua脚本在/home/admin/nginx/data/lua目录下。 确保目录下有如下几个个脚本。

<code>pc_get_downgrade_data.lua</code>

<code>init.lua</code>

<code>pc_status_stat.lua</code>

<code>pc_get_status.lua</code>

<code>pc_set_satus.lua</code>

这几个脚本在下载的压缩包中有。

首先,在http域增加

<code>init_by_lua_file 'lua/init.lua';</code>

<code>lua_shared_dict pc_status 1m;</code>

<code>lua_shared_dict pc_auto_status 1m;</code>

<code>#varnish config</code>

<code>upstream varnish{</code>

<code>server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=5s;</code>

<code>}</code>

最后,在server域宏增加如下配置。

<code>location @php {</code>

<code>include fastcgi_params;</code>

<code>location @var {</code>

<code>proxy_pass http://varnish$str_params;</code>

<code>location ~* ^(.+\.php)(.*)$ {</code>

<code>#check downgrade status, then get data from varnish</code>

<code>set $str_params $uri;</code>

<code>content_by_lua_file lua/pc_get_downgrade_data.lua;</code>

<code>location /hl_get_auto_status {</code>

<code>if ($white_ip = 0) {</code>

<code>return 403;</code>

<code>content_by_lua_file lua/pc_get_auto_status.lua;</code>

<code>location /hl_get_status {</code>

<code>content_by_lua_file lua/pc_get_status.lua;</code>

<code>location /hl_set_status {</code>

<code>content_by_lua_file lua/pc_set_status.lua;</code>

<code></code>

<code>log_by_lua_file lua/pc_status_stat.lua;</code>

脚本varnish_crond.php。在crond中增加执行命令。每分钟执行一次。

来自crond的请求,user-agent数据为varnish_crond。把user-agent为varnish_crond请求特殊处理。保证能正常请求,并返回相关数据。

只要让varnish配置中指定的监控脚本check.php返回500错误即可。varnish监控到指定脚本不可用,自动会进入降级状态。

当脚本返回200状态后,varnish自动又会恢复正常。

设置降级:

<code>curl -h "host:demo.bo56.com" -i http://127.0.0.1/hl_set_status?status=1</code>

恢复正常:

<code>curl -h "host:demo.bo56.com" -i http://127.0.0.1/hl_set_status?status=0</code>

查看降级状态:

<code>curl -h "host:demo.bo56.com" -i http://127.0.0.1/hl_get_status</code>

如果返回的值为1表示降级。

<b></b>

<b>原文发布时间为:2015-06-25</b>

<b>本文来自云栖社区合作伙伴“linux中国”</b>