Openresty 进行路由系统设计
1、系统基础设计图为:

用户通过Http访问Openresty(Nginx + Lua), 其中Nginx虚拟主机中配置文件进行Lua脚本加载。
LUA通过nginx内置变量或者http请求中变量来区分不同集群,使用LUA脚本从redis中获取所属集群。
然后通过反向代理到对应集群。
2、 Openresty配置
Nginx主配置文件:
user nginx;
worker_processes ;
pid logs/nginx.pid; worker_rlimit_nofile ; events {
use epoll;
worker_connections ;
} http {
lua_package_path "/usr/local/openresty/lualib/resty/lrucache/?.lua;;"; # 加载lua自定义模块。
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] $request $http_host '
'$status $body_bytes_sent $http_referer '
'"$http_user_agent" $http_x_forwarded_for '
'$upstream_addr $upstream_status $upstream_cache_status '
'$upstream_response_time $request_time';
access_log logs/access.log main;
error_log logs/error.log;
sendfile on;
tcp_nopush on;
max_ranges ;
keepalive_timeout ;
gzip on;
gzip_min_length 1k;
gzip_buffers 16k;
gzip_comp_level ;
gzip_types application/x-www-form-urlencoded application/pdf text/plain application/x-javascript application/javascript text/css application/xml application/json;
client_max_body_size 22m;
client_body_buffer_size 1024k;
client_header_buffer_size 1024k;
underscores_in_headers on; location /status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
include /data/work/conf/conf.d/*/*.conf;
虚拟主机的配置:
server {
listen ;
server_name 域名;
access_log logs/access_80.log main;
error_log logs/error_80.log;
location / {
resolver DNS的IP地址 valid=; 如果配置文件中使用了域名,需要此配置,不然无法解析DNS。
set $url ''; 定义变量
set $upstream_port ''; 变量赋值
rewrite_by_lua_file lua/get_upstream_url.lua; 加载lua脚本
proxy_pass http://$url$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header connection "keep-alive";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout ;
proxy_send_timeout ;
proxy_connect_timeout ;
proxy_temp_file_write_size 10240k;
}
}
lua 脚本
local localCache = require("mycache") 本地缓存配置
local localRes, err = localCache.get(ngx.var.host)
if localRes ~= nil then
ngx.var.url = localRes .. ":" .. ngx.var.upstream_port
return
else
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout()
local ok, err = red:connect("redis地址", )
if not ok then
ngx.log(ngx.ERR, "failed to connect: ", err)
return
end
local res, err = red:hget("hosts", ngx.var.host)
if not res then
ngx.log(ngx.ERR, "failed to get host: ", err)
return
end
if res == ngx.null then
ngx.log(ngx.ERR, "host not found.")
ngx.var.url = "异常网址"
return
else
localCache.set(ngx.var.host, res)
ngx.var.url = res .. ":" .. ngx.var.upstream_port
end
local ok, err = red:set_keepalive(, )
if not ok then
ngx.log(ngx.ERR, "failed to set keepalive: ", err)
return
end
end
自定义本地缓存的lua模块脚本
local _M = {}
local lrucache = require "resty.lrucache"
local c, err = lrucache.new()
if not c then
return error("failed to create the cache: " .. (err or "unknown"))
end
function _M.get(host)
local key = c:get(host)
return key
end
function _M.set(host, key)
c:set(host, key, )
local res = c:get(host)
end
return _M
Openresty 进行路由系统设计的更多相关文章
- Openresty 进行限流的方法
1.使用Openresty进行限流, 使用漏桶原理进行设计 和路由系统设计类似. LUA脚本去通过变量去redis取值,从redis中得到队列的大小.漏和桶的大小. 然后通过比较,队列大小与漏和桶进行 ...
- 一种轻量的openresty路由设计
在使用openresty开发接口的过程会发现一个问题,那就是接口的地址问题怎么解决,最好一个接口地址对应一个lua文件,也可以在nginx.conf 配置中使用content_by_lua 来编写接口 ...
- 基于 OpenResty 的动态服务路由方案
2019 年 5 月 11 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙武汉站,又拍云首席布道师在活动上做了< 基于 OpenResty ...
- lua-resty-r3 高性能 OpenResty 路由实现
大家下午好!首先做下自我介绍,我于 2014 年加入奇虎 360,后与温铭结识,当时他正在基于 OpenResty 做天擎服务端,用于提供 API 服务.2015 年我们一起写了< OpenRe ...
- openresty 前端开发序
还记得第一次尝试前后端分离的时候,是使用nginx + react 构建的spa应用,后端是java,主要处理业务逻辑逻辑部分,返回json数据,在nginx里面配置好html + js纯静态文件,再 ...
- Ngnix技术研究系列2-基于Redis实现动态路由
上篇博文我们写了个引子: Ngnix技术研究系列1-通过应用场景看Nginx的反向代理 发现了新大陆,OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台 ...
- Nginx-动态路由升级版
前几篇文章我们介绍了Nginx的配置.OpenResty安装配置.基于Redis的动态路由以及Nginx的监控. Nginx-OpenResty安装配置 Nginx配置详解 Nginx技术研究系列1- ...
- vue轮播组件及去掉路由#
最近公司要我去实现vue知识的系统讲解,总结一番,大致需要7节课,今天大致说一下我们使用vue需要学会的基本技能.vue是一个渐进性视图渲染框架,使用vue核心是数据出发,数据一般是我们前台从后台获取 ...
- OpenResty 在又拍云容器平台中的应用
大家好,我是又拍云叶靖,今天主要分享 OpenResty 在又拍云容器平台中的应用.目前又拍云有很多产品,其中很多都使用了 OpenResty 技术,比如又拍云的 CDN .网关都是基于 OpenRe ...
随机推荐
- java代理通俗简单解析
1 代理 1.1 代理的概念和作用 代理的概念很好理解,就像黄牛代替票务公司给你提供票,经纪人代理艺人和别人谈合作.Java的代理是指实现类作为代理类的属性对象, ...
- 雷林鹏分享:YAF路由问题
这2天休年假,在家宅着学习研究了YAF框架,用YAF做过APP接口的项目,但是没有用来做过WEB方面的应用.趁着这2天在家想把博客用YAF进行一下改版,目的也想进一步学习一下YAF. 在这过程中遇到不 ...
- java中的JSON数据转换方法fastjson
1 maven工程引入fastjson <?xml version="1.0" encoding="UTF-8"?> <project xml ...
- discuzX3.4安装之后,没有任何样式怎么办?
问题:最近在做论坛,想着直接用现成的论坛,但是在安装完成之后,竟然一点样式的都没有,如图: 解决方案: 登录后台->工具->更新缓存
- php国家或者编码英文字母排序
1.直接复制传入需要排序的字符,然后可以把返回的数据当key,传送给前台function getFirstCharter($str){ if(empty($str)){return '';} $fch ...
- nodejs常见问题
Js 基础问题 与前端 Js 不同, 后端是直面服务器的, 更加偏向内存方面. [Basic] 类型判断 [Basic] 作用域 [Basic] 引用传递 [Basic] 内存释放 ...
- 下载网站js css img 资源
- Linux桌面系统常用软件和笔记(更新)
(一).下文涉及到的环境 manjaro.deepin.Arch等 有些可以通用 有些不可以通用 (二).常用软件下载 一.桌面美化软件 1.桌面壁纸下载软件: varirety 下载方式:可以在多个 ...
- VNPY - windows 安装踩坑记录
twisted requires PyHamcrest>=, which is not ins grin requires argparse>=1.1, which is not inst ...
- 性能测试遭遇TPS抖动问题
目前性能测试组正在对独立秒杀进行性能压测,性能抖动特别厉害. 由于独立秒杀的接口大多数是经过volicity渲染过的页面和数据的整合,所以在压测的时候有很多volicity的错误.初步判定,感觉是vo ...