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 ...
随机推荐
- python pyqt绘制直方图
# -*- coding: utf-8 -*- """ In this example we draw two different kinds of histogram. ...
- 小程序分享进入H5动态网页
在要分享的界面加上这段代码 onShareAppMessage: function (options) { var that = this; // var return_url = that.data ...
- [Ubuntu] 运行.AppImage格式文件
右键Properties, Permissions勾选Allow executing file as program,如图
- CF #552(div3)F 背包问题
题目链接:http://codeforces.com/contest/1154/problem/F 题意:一个商店有n个物品,每个物品只能买一次,同时有m种优惠,即一次买够x件后,这x件中最便宜的k件 ...
- 关于分布式版本控制系统Git与集中式版本控制系统SVN的区别
我觉得最最主要的区别就是:分布式Git主要是在本地有各个历史版本,在不联网的时候,也可以更新到最新版本和查看过去的版本,而集中式SVN是所有人都将版本上传到中央服务器,当出现断网情况的时候,用户只有一 ...
- angular配置路由/子页面+vue配置路由/子页面
1.在vue.js中组件可以复用,然后最近配置了几个子页面 在 这个文件中配置路由,子页面的配置跟其他一样,只不过path不同. routes: [ { path: '/', ...
- 按照分层设计理念,完成《XXX需求征集系统》的概念结构设计
按照分层设计理念,完成<XXX需求征集系统>的概念结构设计. 1.概要架构-初步设计 有关<XXX需求征集系统>的鲁棒图如下: 2.概要架构之高层分割 切系统为系统: 高层功能 ...
- CodeIgniter框架解析
转载于:https://www.cnblogs.com/xiaoxiaoqingyi/p/6901654.html 转载仅为以后自己学习. 业余花了点时间看看CodeIgniter框架(简称CI),C ...
- 浏览器中打开PDF链接
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 软件工程wc项目,基于py
###WC项目文件链接:https://github.com/ILTHEW/wc.git 个人项目:WC 实践是理论的基础和验证标准,希望读者贯彻"做中学"的思想,动手实现下面的项 ...