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

发布于 2024-11-27 01:26:35 字数 4222 浏览 9 评论 0

通常一个网站数据库挂掉后,后果将是非常严重的。基本上整个网站基本不可用了。对于一些网站来说,当数据库挂掉后,如果能提供基本的浏览服务,也是不错的。本文将尝试使用 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 /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 表示降级。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

梦行七里

暂无简介

文章
评论
26 人气
更多

推荐作者

七七

文章 0 评论 0

囍笑

文章 0 评论 0

盛夏尉蓝

文章 0 评论 0

ゞ花落谁相伴

文章 0 评论 0

Sherlocked

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文