OpenResty 反向代理的用法与技巧
Nginx最开始是作为反向代理被熟知的,基于它的OpenResty的自然也是支持反向代理的,下面我们就来看看它的一些基本用法以及在使用过程中的一些技巧。
一、基本用法
在业务环境中,可能会将OpenResty(以后简称OR)作为反向代理,根据不同的location定位到不同的后端,在这样的架构下,对应的反向代理配置可能是这样的:
location /upstream_A {
proxy_pass http://192.168.1.100:8080;
proxy_connect_timeout 2s;
...
}
location /upstream_B {
proxy_pass http://192.168.1.110:8080;
proxy_connect_timeout 2s;
...
}
可以看到这部分的配置和Nginx并没有太大差别,但是这样的配置会有一些问题,比如我们需要切换后端服务器,将upstream_A这个location的流量打到192.168.1.120这个上游地址而不用修改配置或者重启Nginx服务,大部分人可能会选择通过域名的方式去定位上游比如用如下配置:
location /upstream_A {
proxy_pass http://domain_for_upstream_A:8080;
proxy_connect_timeout 2s;
...
}
location /upstream_B {
proxy_pass http://domain_for_upstream_B:8080;
proxy_connect_timeout 2s;
...
}
当需要做_上游切换_的时候,通过修改 /etc/host 文件来将域名定向到新的Ip,但不幸的是,Ngixn并不会使用/etc/host 而是使用命令resolver来指定DNS服务器,那么在OR里面有没有一些高阶的用法可以让上游漂移变得简单呢?答案是肯定的,下面就来看看更加方便的用法,以及里面的坑。
二、进阶用法
上面呢我们讲到如何使用OR(其实就用到了Nginx的配置啦)来完成反向代理,但是由于Ip或者域名写死,而Nginx又不支持host,所以在做上游平滑迁移的时候不是很方便,所以我们可以通过在上游配置中用Nginx变量来代替上游的地址,变可以避免上述问题。
location /internet_prxoy {
internal;
set_by_lua $query_url 'return ngx.unescape_uri(ngx.var.arg_url);' proxy_pass $query_url;
}
location /upstream_A {
content_by_lua '
local redis_op = require "lua.redis_op"
local upstream_addr = redis_op.get_upstream_from_redis() -- 从redis中获取上游地址
local url = 'http://'.. upstream_addr .. '/foo/bar'
local res = ngx.location.capture('/internet_proxy',
{ args = {url = url}}
)
--容错判断
ngx.print(res.body)
';
}
这样,当请求访问到/upstream_A的时候,会在redis当中读取到上游服务器的真实地址并通过/internet_prxoy转发到上游。
看到这里有人可能会问,为什么需要配置一个额外的跳转location,而不直接在set_by_lua阶段访问redis并对Nginx变量进行赋值?
原因是函数get_upstream_from_redis会涉及到redis的访问,而lua-resty-redis使用了ngx.socket.tcp这个函数,这个函数所支持的执行阶段不包括_set_阶段,需要我们需要一次跳转,通过第一次location的content阶段从redis中将数据读取出来,在第二个location的set阶段利用刚才所读取的数据完成反向代理。
需要注意的是如果第一次location,(也就是上述代码中的/upstream_A)的流量非常高,那么可以在redis的访问函数,也就是上述代码中的get_upstream_from_redis()函数中用shared.dict来做一次缓存,减少对redis的访问量也是可行的。
OpenResty 反向代理的用法与技巧的更多相关文章
- Nginx插件之openresty反向代理和日志滚动配置案例
Nginx插件之openresty反向代理和日志滚动配置案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.openresty介绍 1>.Nginx介绍 Nginx是一款 ...
- 详细分析apache httpd反向代理的用法
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- apache httpd反向代理的用法
代理方式有三种:正向代理.透明代理和反向代理 正向代理 httpd通过ProxyRequests指令配置正向代理的功能.例如: ProxyRequests On ProxyVia On <Pro ...
- OpenResty: 反向代理
打开文件 注:我配置的是 443 <--> 8083 以下域名根据自己的修改 请自行重启,测试.
- nginx反向代理-后端服务器组设置
nginx服务器的反向代理时其最常用的重要功能之一,在实际工作中应用广泛,涉及的配置指令也比较多.下面会尽量详细地介绍对应的指令,及其使用状态. 反向代理一般是互联网需要向内网拉取资源,比如访问一个w ...
- openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍
openresty开发系列2--nginx的简单安装,正向.反向代理及常用命令和信号控制介绍 一.nginx的安装下载及编译安装1.Nginx下载:nginx-1.13.0.tar.gz,下载到:/u ...
- nginx的虚拟主机和反向代理和一些技巧应用
前言 nginx是什么,一般用来做反向代理,也可以用来放静态htnl等文件..当然代理tcp协议也没啥问题,但做好是别用哈.性能不咋样. 虚拟主机 什么是虚拟主机? 个人理解,比如一台主机装一个ngi ...
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- 使用Nginx反向代理 让IIS和Tomcat等多个站点一起飞
使用Nginx 让IIS和Tomcat等多个站点一起飞 前言: 养成一个好习惯,解决一个什么问题之后就记下来,毕竟“好记性不如烂笔头”. 这样也能帮助更多的人 不是吗? 最近闲着没事儿瞎搞,自己在写一 ...
随机推荐
- Rhythmbox中文乱码解决办法
今天在网络上找到了一个比较好的解决Rhythmbox中文乱码的问题的方法 进入你的音乐文件夹执行如下代码: mid3iconv -e GBK *.mp3 如果没有提示多试几次,有可能系统会提示: py ...
- 深度模拟java动态代理实现机制系类之三
这里的内容就比较复杂了,要实现的是对任意的接口,对任意指定的方法,以及对任意指定的代理类型进行代理,就更真实的模拟出java虚拟机的动态代理机制 罗列一下这里涉及的类.接口之间的关系,方便大家学习.1 ...
- NSTimer定时器类
NSTimer是Cocoa中比较常用的定时器类,基本操作如下: handleTimer方法可以自行定义.在需要的地方创建timer即可,handleTimer就可以每0.5秒执行一次. - (vo ...
- Linux操作系统启动流程浅析
启动BIOS程序 当电源键按下之后,BIOS(Basic nput Output System)就会由主板上的闪存来运行.BIOS程序会把自己解压缩到系统的内存之中,然后读取CMOS(Compleme ...
- yaf运行错误:Class 'Yaf_Application' not found
提示:致命错误 Yaf_Application 基类没有加载进去 一检查:phpinfo() 里yaf 扩展有没有安装上 扩展也安装进去了 这时在分布式配置文件的重写 也是正确 这时百思不得其解,没办 ...
- MySQL 单表百万数据记录分页性能优化
文章转载自:http://www.cnblogs.com/lyroge/p/3837886.html 背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台 ...
- JDK 动态代理实现原理
一.引言 Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象便能动态生成代理类.代理类会负责将所有方法的调用分派到委托对象上反射执行,在分派执行的过 ...
- .NET SDK和下载
http://blogs.msdn.com/b/dotnet/p/dotnet_sdks.aspx .NET SDK和下载 您可以通过下载.NET框架针对包和软件开发工具包,并使用它们与Visual ...
- Python数据结构——栈、队列的实现(一)
1. 栈 栈(Stack)是限制插入和删除操作只能在一个位置进行的表,该位置是表的末端,称为栈的顶(top).栈的基本操作有PUSH(入栈)和POP(出栈).栈又被称为LIFO(后入先出)表. 1.1 ...
- cadence16.6 如何对齐元件
1.选中Setup-->Application Mode-->Placement Edit mode2.按"CTRL"键,选中需要对齐的所有对象.3.点击右键右,或者在 ...