通常一个网站数据库挂掉后,后果将是非常严重的。基本上整个网站基本不可用了。对于一些网站来说,当数据库挂掉后,如果能提供基本的浏览服务,也是不错的。本文将尝试使用 varnish + nginx + lua 搭建网站降级系统来实现整个目标。
降级方案的目标是,当网站出现致命故障时(如出现500错误,不能提供服务),可以把缓存的页面数据展现给用户。从而提供基本的浏览服务。
使用varnish作为存储。有效的节约了物理内存,并保持了较好的性能。
使用crond脚本从nginx的access日志中分析出请求url,然后向varnish发请求,从而更新varnish的缓存。缓存的异步更新,减少对nginx的压力。
支持手动降级和自动降级。降级后,nginx自动从varnish中提取数据,并返回给用户。
vanish安装到/home/varnish 目录下。安装步骤如下:
首先,安装libpcre。
sudo yum install pcre pcre-devel
其次,安装varnish。
./configure --prefix=/home/varnish make sudo -u admin make install sudo -u admin mkdir -p /home/varnish/vcache/ sudo chown admin:admin -R /home/varnish sudo -u admin touch /home/varnish/vcache/varnish_cache.data sudo chmod 777 /home/varnish/vcache/varnish_cache.data
再次,修改varnish配置文件和部署相关脚本。 点击下载文件压缩包 。配置文件名为default.vcl。
最后,启动varnish。启动脚本也在压缩包中,名称为 varnishctl
sudo /home/admin/varnish/sbin/varnishctl start
注意:启动后可以通过varnishlog命令查看是否运行正常。如果出现以下字样,说明运行正常。http的返回状态为200
$ /home/varnish/bin/varnishlog 0 Backend_health - default Still healthy 4--X-RH 4 2 4 0.002698 0.001722 HTTP/1.1 200 OK
lua脚本在/home/admin/nginx/data/lua目录下。 确保目录下有如下几个个脚本。
pc_get_downgrade_data.lua init.lua pc_status_stat.lua pc_get_status.lua pc_set_satus.lua
这几个脚本在下载的压缩包中有。
首先,在http域增加
init_by_lua_file 'lua/init.lua'; lua_shared_dict pc_status 1m; lua_shared_dict pc_auto_status 1m; #varnish config upstream varnish{ server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=5s; }
最后,在server域宏增加如下配置。
location @php { include fastcgi_params; } location @var { proxy_pass http://varnish$str_params; } location ~* ^(.+/.php)(.*)$ { #check downgrade status, then get data from varnish set $str_params $uri; content_by_lua_file lua/pc_get_downgrade_data.lua; } location /hl_get_auto_status { if ($white_ip = 0) { return 403; } content_by_lua_file lua/pc_get_auto_status.lua; } location /hl_get_status { if ($white_ip = 0) { return 403; } content_by_lua_file lua/pc_get_status.lua; } location /hl_set_status { if ($white_ip = 0) { return 403; } content_by_lua_file lua/pc_set_status.lua; } log_by_lua_file lua/pc_status_stat.lua;
脚本varnish_crond.php。在crond中增加执行命令。每分钟执行一次。
来自crond的请求,user-agent数据为varnish_crond。把user-agent为varnish_crond请求特殊处理。保证能正常请求,并返回相关数据。
只要让varnish配置中指定的监控脚本check.php返回500错误即可。varnish监控到指定脚本不可用,自动会进入降级状态。当脚本返回200状态后,varnish自动又会恢复正常。
设置降级:
curl -H "Host:demo.bo56.com" -i http://127.0.0.1/hl_set_status?status=1
恢复正常:
curl -H "Host:demo.bo56.com" -i http://127.0.0.1/hl_set_status?status=0
查看降级状态:
curl -H "Host:demo.bo56.com" -i http://127.0.0.1/hl_get_status
如果返回的值为1表示降级。
来源: http://www.bo56.com/%E4%BD%BF%E7%94%A8varnish-nginx-lua%E6%90%AD%E5%BB%BA%E7%BD%91%E7%AB%99%E7%9A%84%E9%99%8D%E7%BA%A7%E7%B3%BB%E7%BB%9F/