2019独角兽企业重金招聘Python工程师标准>>>

以前用tengine自带了session_sticky,现在换成openresty,没有现成的,nginx-sticky-module 太老, 编译有点问题,于是自己写了一个,废话不多说,直接看代码

lua/balancer.lua


local balancer = require "ngx.balancer"
local upstream = require "ngx.upstream"local upstream_name = 'backend'local srvs = upstream.get_servers(upstream_name)function get_server()local cache = ngx.shared.cachelocal key = "req_index"local index = cache:get(key)if index == nil or index > #srvs thenindex = 1cache:set(key, index)endcache:incr(key, 1)return index
endfunction is_down(server)local down = falselocal perrs = upstream.get_primary_peers(upstream_name)for i = 1, #perrs dolocal peer = perrs[i]if server == peer.name and peer.down == true thendown = trueendendreturn down
end----------------------------local route = ngx.var.cookie_routelocal serverif route thenfor k, v in pairs(srvs) doif ngx.md5(v.name) == route thenserver = v.addrendendif is_down(server) thenroute = nilend
endif not route thenfor i = 1, #srvs doif not server or is_down(server) thenserver = srvs[get_server()].addrendendngx.header["Set-Cookie"] = 'route=' .. ngx.md5(server) .. '; path=/;'
endlocal index = string.find(server, ':')
local host = string.sub(server, 1, index - 1)
local port = string.sub(server, index + 1)
balancer.set_current_peer(host, tonumber(port))

nginx.conf

lua_shared_dict cache 1m;
upstream backend {server 192.168.0.2:8080;server 192.168.0.3:8080; balancer_by_lua_file lua/balancer.lua;
} server {listen 80;server_name    localhost;location / {proxy_pass http://backend;...}}# 健康检查
lua_shared_dict healthcheck 1m;
lua_socket_log_errors off;
init_worker_by_lua_block {local hc = require "resty.upstream.healthcheck"local ok, err = hc.spawn_checker{shm = "healthcheck",  -- defined by "lua_shared_dict"upstream = "backend", -- defined by "upstream"type = "http",http_req = "GET / HTTP/1.0\r\nHost: localhost\r\n\r\n",-- raw HTTP request for checkinginterval = 2000,  -- run the check cycle every 2 sectimeout = 1000,   -- 1 sec is the timeout for network operationsfall = 3,  -- # of successive failures before turning a peer downrise = 2,  -- # of successive successes before turning a peer upvalid_statuses = {200, 302},  -- a list valid HTTP status codeconcurrency = 10,  -- concurrency level for test requests}if not ok thenngx.log(ngx.ERR, "failed to spawn health checker: ", err)returnend}

主要是利用ngx.upstreamngx.balancer 这两个模块,动态获取upstream,以及设置返回的上游名单,然后写到cookie里面,这里有判断后端是否down掉,如果down掉的话,则获取下一个,后端的状态通过resty.upstream.healthcheck模块健康检查来实现,以此为模型可以写更复杂的负载均衡逻辑

我这里比较简单,嫌丑了

转载于:https://my.oschina.net/362228416/blog/916042

用lua 实现一个 nginx 负载均衡相关推荐

  1. Nginx负载均衡配置策略

    转自:http://www.freeoa.net/osuport/cluster/nginx-load-equilibrium-configuration-strategy_1652.html Ngi ...

  2. Nginx负载均衡原理与实战

    Nginx 负载均衡原理与实践 本篇摘自<亿级流量网站架构核心技术>第二章 Nginx 负载均衡与反向代理 部分内容. 当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩 ...

  3. Nginx负载均衡的详细配置及使用案例

    Nginx负载均衡的详细配置及使用案例详解 感谢看过这一些列博文和评论的小伙伴, 我把自己所看到的学到的拿到这里来分享是想和大家一起学习进步, 想听听园友给出的意见, 也是对自己学习过程的一个总结.  ...

  4. 【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍

    简介 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应 ...

  5. Nginx负载均衡集群介绍

    第1章 集群介绍 1.1 集群简介 1.1.1 什么是集群 简单说,集群就是一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行 ...

  6. [ 总结 ] nginx 负载均衡 及 缓存

    操作系统:centos6.4 x64 前端使用nginx做反向代理,后端服务器为:apache + php + mysql 1. nginx负载均衡. nginx编译安装(编译安装前面的文章已经写过) ...

  7. docker初体验:docker部署nginx负载均衡集群

    Docker 是一个用于开发,交付和运行应用程序的开放平台.Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件.今天来为大家演示一下docker部署nginx负载均衡集群 环境 ce ...

  8. Nginx负载均衡:分布式/热备Web Server的搭建

    Nginx是一款轻量级的Web server/反向代理server及电子邮件(IMAP/POP3)代理server.并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开 ...

  9. Nginx负载均衡与配置Nginx的ssl

    2019独角兽企业重金招聘Python工程师标准>>> Nginx负载均衡 什么是负载均衡? 负载均衡就是,把请求均衡地分发到后端的各个机器上面. 比如,A B C D 四台WEB服 ...

最新文章

  1. 日志切割清理工具 Log-Cutter
  2. sublime text3输入中文的问题.
  3. 会计期间变式OB52
  4. 把SAP Cloud for Customer嵌入到IFrame里
  5. Python学习笔记:利用Pyforest导入本地已安装的库
  6. 《深入理解分布式事务》第五章 强一致性分布式解决方案
  7. php中pdo连接数据库,PHP使用PDO连接数据库
  8. mangle 打标签冲突
  9. c++卸载工具_IIS修复IIS出现错误后如何完全卸载重装
  10. matlab重叠图像块拼接,在matlab中拼接图像时如何正确混合?
  11. div搜索框与按钮不在一行_这款漫画资源搜索软件,堪称二次元迷的必备神器!...
  12. Python学习-第三天-面向对象编程基础
  13. IMX6Q获取序列号方法
  14. Http gzip 处理
  15. 手机计算机如何用科学计算法,手机计算器开根号怎么按(万能科学计算器在线使用方法)...
  16. html怎么创建页面书签链接,如何:在“设计”视图中为 Web 窗体页插入 HTML 超链接和书签...
  17. python爬取58同城二手房信息_动手写爬虫(2):爬取58同城二手物品信息
  18. 【联想电脑升级网卡】BIOS 无线网卡白名单限制解决办法——不用刷BIOS,不用修改白名单,只需简单升级即可
  19. openwrt手工配置pptpd
  20. PCB设计——Altium Dsigner18之PCB与原理图交互式布局设计

热门文章

  1. Apache反向代理
  2. python随机数不重复_Python产生一个数值范围内的不重复的随机数的实现方法
  3. 基于java web的服装销售系统
  4. Blender图解教程:整体移动/旋转带IK控制器的角色并保持其姿势不变的正确方法
  5. 对着爬虫网页HTML学习Python正则表达式
  6. 《SaltStack技术入门与实践》—— Renderer组件
  7. 二十二:访问者模式(伪动态双分配)
  8. Arduino之读取DHT11数字温湿度传感器并串口显示
  9. html-3 文字阴影
  10. 394.3公里 京津城际铁路创世界运营铁路最高时速