OpenResty 反向代理的用法与技巧
发布日期:2022-03-15 04:11:18 浏览次数:49 分类:技术文章

本文共 1952 字,大约阅读时间需要 6 分钟。

最开始是作为反向代理被熟知的,基于它的的自然也是支持反向代理的,下面我们就来看看它的一些基本用法以及在使用过程中的一些技巧。

一、基本用法


在业务环境中,可能会将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的访问,而使用了这个函数,这个函数所支持的执行阶段不包括_set_阶段,需要我们需要一次跳转,通过第一次location的content阶段从redis中将数据读取出来,在第二个location的set阶段利用刚才所读取的数据完成反向代理。

需要注意的是如果第一次location,(也就是上述代码中的/upstream_A)的流量非常高,那么可以在redis的访问函数,也就是上述代码中的get_upstream_from_redis()函数中用shared.dict来做一次缓存,减少对redis的访问量也是可行的。

  •  
  •  
  •  

转载于:https://www.cnblogs.com/archoncap/p/5045051.html

转载地址:https://blog.csdn.net/weixin_30536513/article/details/99796679 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:BZOJ 1798: [Ahoi2009]Seq 维护序列seq
下一篇:PHP7中php.ini、php-fpm和www.conf的配置

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年03月04日 20时01分41秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

ad19 导出step 没有pcb_几款主流PCB软件哪个最好用,你用过几款? 2021-06-24
json mysql 字段 默认值_Newtonsoft.Json 六个超简单又实用的特性,值得一试 【上篇】... 2021-06-24
ocdma相干非相干_《Acconeer 60GHz脉冲相干雷达芯片:A111》 2021-06-24
修改表格字体颜色_Excel技巧:Excel如何修改字体颜色 2021-06-24
native react 变颜色 点击_React Native主动更改StackNavigator标头颜色 2021-06-24
prism项目搭建 wpf_WPF MVVM使用prism4.1搭建 2021-06-24
python发微信红包群_用Python实现微信自动化抢红包,再也不用担心抢不到红包了... 2021-06-24
python中func自定义函数_Python函数之自定义函数&作用域&闭包 2021-06-24
wget连接指定端口_端口通不通 telnet wget ssh 2021-06-24
eureka 调用服务_Spring Cloud微服务架构从入门到会用(二)—服务注册中心Eureka... 2021-06-24
easyexcel 工具类_问了个在阿里的同学,他们常用的15款开发者工具! 2021-06-24
mysql统计结果大于0时返回true_mysql表查询练习 2021-06-24
c语言对结构体排序中间变量,求助:c语言怎么实现结构体的排序? 总是弄不对啊... 2021-06-24
c语言宏定义只能在最前面吗,C语言宏定义注意事项 2021-06-24
android悬浮窗服务卡死,Android 悬浮窗兼容问题谈 2021-06-24
表格相关的html语言,HTML标记语言——表格标记 2021-06-24
web聊天界面html,PC端Web聊天界面+代码分享(HTML+CSS) 2021-06-24
cmake qt 添加路径 项目_CMake配置Qt工程 2021-06-24
使用python开发的软件协议_WEB开发——Python WSGI协议详解 2021-06-24
冰点下载器手机版apk_冰点文库下载器 2021-06-24