用lua 实现一个 nginx 负载均衡
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.upstream
、ngx.balancer
这两个模块,动态获取upstream,以及设置返回的上游名单,然后写到cookie里面,这里有判断后端是否down掉,如果down掉的话,则获取下一个,后端的状态通过resty.upstream.healthcheck
模块健康检查来实现,以此为模型可以写更复杂的负载均衡逻辑
我这里比较简单,嫌丑了
转载于:https://my.oschina.net/362228416/blog/916042
用lua 实现一个 nginx 负载均衡相关推荐
- Nginx负载均衡配置策略
转自:http://www.freeoa.net/osuport/cluster/nginx-load-equilibrium-configuration-strategy_1652.html Ngi ...
- Nginx负载均衡原理与实战
Nginx 负载均衡原理与实践 本篇摘自<亿级流量网站架构核心技术>第二章 Nginx 负载均衡与反向代理 部分内容. 当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩 ...
- Nginx负载均衡的详细配置及使用案例
Nginx负载均衡的详细配置及使用案例详解 感谢看过这一些列博文和评论的小伙伴, 我把自己所看到的学到的拿到这里来分享是想和大家一起学习进步, 想听听园友给出的意见, 也是对自己学习过程的一个总结. ...
- 【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍
简介 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应 ...
- Nginx负载均衡集群介绍
第1章 集群介绍 1.1 集群简介 1.1.1 什么是集群 简单说,集群就是一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行 ...
- [ 总结 ] nginx 负载均衡 及 缓存
操作系统:centos6.4 x64 前端使用nginx做反向代理,后端服务器为:apache + php + mysql 1. nginx负载均衡. nginx编译安装(编译安装前面的文章已经写过) ...
- docker初体验:docker部署nginx负载均衡集群
Docker 是一个用于开发,交付和运行应用程序的开放平台.Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件.今天来为大家演示一下docker部署nginx负载均衡集群 环境 ce ...
- Nginx负载均衡:分布式/热备Web Server的搭建
Nginx是一款轻量级的Web server/反向代理server及电子邮件(IMAP/POP3)代理server.并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开 ...
- Nginx负载均衡与配置Nginx的ssl
2019独角兽企业重金招聘Python工程师标准>>> Nginx负载均衡 什么是负载均衡? 负载均衡就是,把请求均衡地分发到后端的各个机器上面. 比如,A B C D 四台WEB服 ...
最新文章
- 日志切割清理工具 Log-Cutter
- sublime text3输入中文的问题.
- 会计期间变式OB52
- 把SAP Cloud for Customer嵌入到IFrame里
- Python学习笔记:利用Pyforest导入本地已安装的库
- 《深入理解分布式事务》第五章 强一致性分布式解决方案
- php中pdo连接数据库,PHP使用PDO连接数据库
- mangle 打标签冲突
- c++卸载工具_IIS修复IIS出现错误后如何完全卸载重装
- matlab重叠图像块拼接,在matlab中拼接图像时如何正确混合?
- div搜索框与按钮不在一行_这款漫画资源搜索软件,堪称二次元迷的必备神器!...
- Python学习-第三天-面向对象编程基础
- IMX6Q获取序列号方法
- Http gzip 处理
- 手机计算机如何用科学计算法,手机计算器开根号怎么按(万能科学计算器在线使用方法)...
- html怎么创建页面书签链接,如何:在“设计”视图中为 Web 窗体页插入 HTML 超链接和书签...
- python爬取58同城二手房信息_动手写爬虫(2):爬取58同城二手物品信息
- 【联想电脑升级网卡】BIOS 无线网卡白名单限制解决办法——不用刷BIOS,不用修改白名单,只需简单升级即可
- openwrt手工配置pptpd
- PCB设计——Altium Dsigner18之PCB与原理图交互式布局设计