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

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


  1. sudo yum install pcre pcre-devel

其次,安装varnish。


  1. ./configure --prefix=/home/varnish
  2. make
  3. sudo -u admin make install
  4. sudo -u admin mkdir -p /home/varnish/vcache/
  5. sudo chown admin:admin -R /home/varnish
  6. sudo -u admin touch /home/varnish/vcache/varnish_cache.data
  7. sudo chmod 777 /home/varnish/vcache/varnish_cache.data

再次,修改varnish配置文件和部署相关脚本。点击下载文件压缩包。配置文件名为default.vcl。

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


  1. sudo /home/admin/varnish/sbin/varnishctl start

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


  1. $ /home/varnish/bin/varnishlog
  2. 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目录下。 确保目录下有如下几个个脚本。


  1. pc_get_downgrade_data.lua
  2. init.lua
  3. pc_status_stat.lua
  4. pc_get_status.lua
  5. pc_set_satus.lua

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

修改nginx配置文件

首先,在http域增加


  1. init_by_lua_file 'lua/init.lua';
  2. lua_shared_dict pc_status 1m;
  3. lua_shared_dict pc_auto_status 1m;
  4. #varnish config
  5. upstream varnish{
  6. server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=5s;
  7. }

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


  1. location @php {
  2. include fastcgi_params;
  3. }
  4. location @var {
  5. proxy_pass http://varnish$str_params;
  6. }
  7. location ~* ^(.+\.php)(.*)$ {
  8. #check downgrade status, then get data from varnish
  9. set $str_params $uri;
  10. content_by_lua_file lua/pc_get_downgrade_data.lua;
  11. }
  12. location /hl_get_auto_status {
  13. if ($white_ip = 0) {
  14. return 403;
  15. }
  16. content_by_lua_file lua/pc_get_auto_status.lua;
  17. }
  18. location /hl_get_status {
  19. if ($white_ip = 0) {
  20. return 403;
  21. }
  22. content_by_lua_file lua/pc_get_status.lua;
  23. }
  24. location /hl_set_status {
  25. if ($white_ip = 0) {
  26. return 403;
  27. }
  28. content_by_lua_file lua/pc_set_status.lua;
  29. }
  30. 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降级

设置降级:


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

恢复正常:


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

查看降级状态:


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

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


原文发布时间为:2015-06-25


本文来自合作伙伴“Linux中国”

时间: 2024-09-15 13:34:47

使用 varnish + nginx + lua 搭建网站的降级系统的相关文章

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

前言 通常一个网站数据库挂掉后,后果将是非常严重的.基本上整个网站基本不可用了.对于一些网站来说,当数据库挂掉后,如果能提供基本的浏览服务,也是不错的.本文将尝试使用varnish + nginx + lua 搭建网站降级系统来实现整个目标. 降级目标 降级方案的目标是,当网站出现致命故障时(如出现500错误,不能提供服务),可以把缓存的页面数据展现给用户.从而提供基本的浏览服务. 1.只提供基本的浏览服务 2.浏览的数据都是非登录状态下的数据 3.支持手动和自动降级.自动降级是当后端返回500

使用nginx lua实现网站统计中的数据收集

网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析.百度统计和腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于javascript的.本文将简要分析这种数据收集的原理,并一步一步实际搭建一个实际的数据收集系统. 数据收集原理分析 简单来说,网站统计分析工具需要收集到用户浏览目标网站的行为(如打开某网页.点击某按钮.将商品加入购物车等)及行为附加数据(如某下单行为产生的订单金额等).早期的网站统计往往只收集一种用户行

openresty(nginx lua)统计域名状态码、平均响应时间和流量的例子

背景   之前我们统计域名状态码.平均响应时间和流量的方法是:在每台机器添加一个定时脚本,来获取每个域名最近一分钟的访问日志到临时文件.然后zabbix再对这个一分钟日志临时文件作相关统计.一直运行良好,最近发现某台服务器突然负载增高.使用iotop查看发现获取最近一分钟日志的脚本占用的IO特别高.停止这个定时任务之后恢复正常.于是就打算使用nginx lua来替换目前的方法.新的方法具有统计时占用资源少,实时的特点. 为什么是OpenResty? OpenResty允许开发人员使用lua编程语

【nginx+lua高性能web应用开发(一):环境搭建】

1,官方网站: http://openresty.org/ 作者很NB,国人开发的. 2,安装nginx+lua环境 直接从openresty下载源代码进行编译安装,已经包括了一个最新的nginx代码. 我使用的是64bit的centos搭建环境的. 首先按照所需要的lib库.(lib必须安装否则编译出现问题) yum -y install gcc gcc-c++ autoconf make pcre-devel openssl openssl-devel wget http://openres

Nginx+SSL搭建 HTTPS 网站_nginx

一.HTTPS 是什么? 根据维基百科的解释: 复制代码 代码如下: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定.HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输.HTTPS不应与在RFC 2660中定义的安全超文本传输协议(S-HTTP)相混. HTTPS 目前已经是所有注重隐私和安全的网站的首选,随着技术的不断发展,H

用Nginx + Lua(OpenResty)开发高性能Web应用

在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开发主要是以C/C++模块的形式进行,整体学习和开发成本偏高;如果有一种简单的语言来实现Web应用的开发,那么Nginx绝对是把好的瑞士军刀;目前Nginx团队也开始意识到这个问题,开发了nginxScript:可以在Nginx中使用JavaScript进行动态配置一些变量和动态脚本执行;而目前市面上

【转】使用Nginx+Lua(OpenResty)开发高性能Web应用

在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛.Nginx的高性能是大家公认的,而Nginx开发主要是以C/C++模块的形式进行,整体学习和开发成本偏高:如果有一种简单的语言来实现Web应用的开发,那么Nginx绝对是把好的瑞士军刀:目前Nginx团队也开始意识到这个问题,开发了nginxScript:可以在Nginx中使用JavaScript进行动态配置一些变量和动态脚本执行:而目前市面上

Symfony2+nginx的搭建过程总结

最近在试着用nginx+symfony搭建公司的网站,由于nginx不支持pathinfo模式,所以必须修改nginx(我使用的是nginx1.5.1)的配置文件/etc/nginx/config.d/default.conf以使其在逻辑上支持url逻辑路径到物理路径的映射,以下为我的default.conf文件内容: server { listen 80; server_name localhost; location / { root /usr/share/nginx/html/symfon

十年建站老司机带你十分钟搭建网站

本文概要: 1. 域名 + 域名注册 + 域名备案 + 域名解析绑定 2. 服务器 + 虚拟主机 + windows服务器 + linux服务器 3. CMS建站系统 4. 总结 在如今互联网发展迅速猛进的大环境下,网站已经成为一个企业不可缺少的网络媒介.但网站开发行业鱼龙混杂,质量参差不齐,价格更是跨越区间大.尤其对于那些在建站方面不懂的小白来说,很容易被人坑,所以作为在网站开发行业摸爬滚打多年的草根老司机,通过本文向大家分享建站的经验与心得,避免不必要的弯路和成本损耗. Come on! 小