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 ...
随机推荐
- (最完美)红米手机5的Usb调试模式在哪里打开的教程
就在我们使用安卓手机接通PC的时候,或者使用的有些app比如我们企业营销部门就在使用的app引号精灵,之前老版本就需要开启usb开发者调试模式下使用,现就在新版本不需要了,如果手机没有开启usb开发者 ...
- vue父子组件的传值总结
久违的博客园我又回来了.此篇文章写得是vue父子组件的传值,虽然网上已经有很多了.写此文章的目的就是记录下个人学习的一部分.接下来我们就进入主题吧! 在开发vue项目中,父子组件的传值是避免不掉的. ...
- php(二)使用thinkphp搭建项目
1.创建项目根目录,配置虚拟主机 1.1.创建项目根目录phpDemo01,将thinkphp_3.2.3_full.zip压缩包中ThinkPHP文件夹复制到项目根目录phpDemo01中. 1.2 ...
- K8s+jenkins实现提升效率 —— 一些小记录
尝试下K8s + jenkins的组合,非常方便.在这里记录一下: kubernetes版本: 1.10 + deployment.yaml apiVersion: v1 kind: Service ...
- C语言博客作业05——指针
1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量 1.2.1学习体会 可能因为之前数组那块儿的作业拖得太久了,以至于我觉得指针学的好快,还没反应过来就教完了,然后一开始做题的时候,就是一脸 ...
- [luogu P3065] [USACO12DEC]第一!First!
[luogu P3065] [USACO12DEC]第一!First! 题目描述 Bessie has been playing with strings again. She found that ...
- react .net core 发布 Access-Control-Allow-Origin Cors
本案例用IIS部署 1. 在react上先publish: npm run build 生成了build文件,在此文件里添加web.config,注意httpProtocol是用来跨域的. <? ...
- orace如何创建函数并调用
我们来定义一个oracle的函数 create or replace function 方法名(参数名1 参数类型,参数名2 参数类型,参数名3 参数类型)return 返回类型 is num_C n ...
- 安装pyspider遇到的坑
pyspider是国人写的一款开源爬虫框架,个人觉得这个框架用起来很方便,至于如何方便可以继续看下去. 作者博客:http://blog.binux.me/ 安装pyspider安装pyspider: ...
- 怎样用div做三角形
20181204 用盒子模型做三角形的效果: <div></div> width:0px; height:0px; border:10px solid red; border- ...