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

简介:
前言

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

降级目标

降级方案的目标是,当网站出现致命故障时(如出现500错误,不能提供服务),可以把缓存的页面数据展现给用户。从而提供基本的浏览服务。
1、只提供基本的浏览服务
2、浏览的数据都是非登录状态下的数据
3、支持手动和自动降级。自动降级是当后端返回500错误次数在一段时间内达到一定阈值(不包含503)。手动降级是从控制界面操作。

降级方案

存储

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

更新

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

降级

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

流程图

Pc_downgrade

<img src="http://www.bo56.com/wp-content/uploads/2015/06/Pc_downgrade.png" alt="Pc_downgrade" width="702" height="351" class="alignnone size-full wp-image-790" /></a></p>

流程描述

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 /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;

部署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/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表示降级
目录
相关文章
|
29天前
|
存储 缓存 Java
Openresty(lua+nginx)-Guava-Redis做多级缓存
Openresty(lua+nginx)-Guava-Redis做多级缓存
33 1
|
29天前
|
缓存 负载均衡 应用服务中间件
如何在 CentOS 7 上为 NGINX 安装开源 HTTP 加速器:Varnish
如何在 CentOS 7 上为 NGINX 安装开源 HTTP 加速器:Varnish
86 1
如何在 CentOS 7 上为 NGINX 安装开源 HTTP 加速器:Varnish
|
8天前
|
应用服务中间件 nginx Windows
windows系统bat批处理 管理nginx启动 nginx脚本管理bat脚本管理生命周期windows一键nginx启动
windows系统bat批处理 管理nginx启动 nginx脚本管理bat脚本管理生命周期windows一键nginx启动
|
16天前
|
应用服务中间件 nginx
蓝易云 - 编写Dockerfile制作Web应用系统nginx镜像
这是一个基本的例子,你可能需要根据自己的应用进行调整。例如,你可能需要添加更多的配置,或者使用不同的Nginx版本。
32 2
|
29天前
|
缓存 应用服务中间件 Linux
Linux系统中基于NGINX的代理缓存配置指南
配置后,NGINX将缓存后端服务器的响应,并根据缓存配置进行有效期控制。这样可以加速页面加载并减轻后端服务器的负担。
29 0
|
29天前
|
应用服务中间件 nginx
M1系统搭建nginx,非homebrew搭建方式(踩坑明细)
M1系统搭建nginx,非homebrew搭建方式(踩坑明细)
46 0
|
29天前
|
应用服务中间件 nginx 网络架构
Windows系统如何修改Nginx配置实现远程访问多个本地站点
Windows系统如何修改Nginx配置实现远程访问多个本地站点
97 0
|
29天前
|
负载均衡 应用服务中间件 nginx
Nginx四层负载均衡在秒杀系统中的应用
Nginx四层负载均衡在秒杀系统中的应用
34 0
|
29天前
|
负载均衡 应用服务中间件 nginx
Nginx负载均衡选择在秒杀系统中的应用
Nginx负载均衡选择在秒杀系统中的应用
52 0
|
29天前
|
应用服务中间件 nginx
4.5.1 Nginx反向代理与系统参数配置conf原理
4.5.1 Nginx反向代理与系统参数配置conf原理