IT技术博客大学习 共学习 共进步

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

博学无忧 2016-02-20 16:44:17 浏览 3,186 次
前言

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

降级目标

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

   1、只提供基本的浏览服务

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

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

降级方案

存储

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

更新

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

降级

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

流程图

   Pc_downgrade

流程描述

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

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

   3、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脚本

   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

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

修改nginx配置文件

   首先,在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 /pc_get_auto_status {
           if ($white_ip = 0) {
               return 403;
           }
           content_by_lua_file lua/pc_get_auto_status.lua;
 }
location /pc_get_status {
     if ($white_ip = 0) {
         return 403;
     }
     content_by_lua_file lua/pc_get_status.lua;
}
location /pc_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;
部署crond脚本

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

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

降级管理

varnish降级

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

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

nginx降级

   设置降级

curl -H"Host:demo.bo56.com"-i http://127.0.0.1/pc_set_status?status=1

   恢复正常

curl -H"Host:demo.bo56.com" -i http://127.0.0.1/pc_set_status?status=0

   查看降级状态

curl -H"Host:demo.bo56.com" -i http://127.0.0.1/pc_get_status

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

建议继续学习

  1. 降级论 (阅读 6,605)
  2. Nginx与Lua (阅读 5,565)
  3. Nginx 还是 Varnish? (阅读 5,184)
  4. Lua GC 的源码剖析 (2) (阅读 4,944)
  5. Ameba , 一个简单的 lua 多线程实现 (阅读 4,844)
  6. Varnish VS Nginx测试报告 (阅读 4,663)
  7. Lua GC 的源码剖析 (4) (阅读 4,604)
  8. Proto Buffers in Lua (阅读 4,283)
  9. Lua GC 的源码剖析 (1) (阅读 4,228)
  10. 使用 luajit 的 ffi 绑定 zeromq (阅读 4,163)