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_proxy {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的访问量也是可行的。

本文出自https://segmentfault.com/a/1190000004128807

转载于:https://blog.51cto.com/lookingdream/2112751

OpenResty中使用反向代理相关推荐

  1. Ceryx —— 基于 OpenResty 的动态反向代理

    Ceryx 是基于 NGINX OpenResty 的动态反向代理,带有一个 API. 代理 Ceryx 使用 NGINX OpenResty 为了基于请求主机进行路由请求.这个路由是使用 NGINX ...

  2. 容器化单页面应用中Nginx反向代理与Kubernetes部署

    在<容器化单页面应用中RESTful API的访问>一文中,我介绍了一个在容器化环境中单页面应用访问后端服务的完整案例.这里我将继续使用这个案例,介绍一下容器化单页面应用部署的另一个场景: ...

  3. 如何在JAVA项目中实现反向代理功能?

    前言(什么是反向代理) 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet ...

  4. Openresty实现反向代理

    使用openresty缓存功能 openresty是什么? OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lu ...

  5. Nginx反向代理负载均衡虚拟主机动静分离UrlRewrite防盗链

    文章目录 1. Nginx简介 1.1 Nginx背景 1.2 Nginx的优点 1.3 Nginx的功能特性及常用功能 2.Nginx安装 2.1 下载上传解压 1.2 安装 3.nginx核心概念 ...

  6. 正向代理和反向代理??

    (5 条消息)正向代理 反向代理 本质区别? - 知乎 https://www.zhihu.com/question/36412304/answer/76804314 正向代理,只用于代理内部网络对I ...

  7. nginx反向代理、负载均衡、动态请求

    NGINX 反向代理 我想通过上一章如何测试Nginx的高性能,想必大家对于NGINX作为一个高性能的web服务器毫无异议:但是NGINX的功能绝不局限于简单的web服务器,NGINX在互联网扮演的角 ...

  8. yum 代理_教你如何在5分钟轻松部署nginx反向代理

    反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源.同时,用户不需要知道目标服务器的地址,也无须在用户端 ...

  9. 【前端词典】如何向老板解释反向代理

    [前端词典]如何向老板解释反向代理 前言 现在看到的这篇文章是修改后的第三个版本. 由于我家老板看过之后,对这篇文章的评价是:写的不错,语句是通顺的,排版是可以的,但反向代理是什么还是不清楚?所以我就 ...

最新文章

  1. iOS-c语言小练习01
  2. drive数据集_运动想象,脑电情绪等公开数据集汇总
  3. LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用
  4. http 长连接 短连接
  5. iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架
  6. MessageBox 弹框
  7. Python爬虫淘宝商品详情页价格、类似数据
  8. rust开发环境_Rust 环境搭建
  9. controller属于哪一层_从数字一到十,在人们心中哪一个数字最为吉利?有什么原因?...
  10. springboot 项目中在普通类中调用dao层的mapper 出现空指针异常
  11. 中国大学慕课计算机操作系统答案,计算机操作系统
  12. 第一次结对作业:原型设计
  13. 我奋斗了18年不是为了和你一起喝咖啡。
  14. 爬虫爬取B站视频封面
  15. 最近比较火的palywright了解一下?
  16. 阿里云服务器云数据库免费体验(Java Web详细实例)
  17. mongodb的安装与配置
  18. Hadoop3.2.1 【 YARN 】源码分析 : LinuxContainerExecutor 浅析 [ 一 ]
  19. 基础:cin与char*的相关问题
  20. mysql 更新 自我_ClickOnce DIY全自动更新下载升级的自我实现

热门文章

  1. c++ 模糊搜索 正则表达式_c++使用正则表达式提取关键字的方法
  2. c语言 link找不到函数,link失败,找不到库函数'sqrtf',math.h的头文件已经包含...
  3. git status怎么操作_Git 基本操作
  4. eclipse查看git地址_在 IntelliJ IDEA 中使用 Git,太方便了
  5. count和distinct如何一起使用_轻松玩转乐高积木:教你如何使用颗粒分离器
  6. delphi trichviewedit 设置一行的段落_HTML中的文本与段落(3)
  7. 计算机辅助设计试题 李明,计算机辅助设计B李明及答案.doc
  8. html设置布局颜色设置,css布局中置背景颜色
  9. 利用JAVA获取远程文件及使用断点续传 供学习者使用
  10. Spring中父子容器的实现实例