nginx OpenResty lua resty http 代理网关从无到有搭建

OpenResty(nginx+lua+resty-http)实现访问鉴权 OpenResty 是一个基于 Nginx 和 LuaJIT 的动态 web 平台。它通过在 Nginx 中集成 LuaJIT,允许在 Nginx 服务器上运行 Lua 脚本,增加了 Nginx 的灵活性和可扩展性。首先下载并解压原版Nginx带有可以很方便的将Nginx注册为系统服务。下面我复制原版Nginx中的和文件 到 新解压的目录中。然后修改文件为如下内容:-- 服务名 --> < id > nginx 阅读详情

一、背景说明
准备在项目中基于nginx、OpenResty搭建一个简易网关,实现同一域名根据不同cookie代理不同docker功能,降低前端、移动端多业务线并行测试联调成本。简单来说就是服务端有多个测试环境docker分别部署不同业务需求代码,通过在前端、移动端种植cookie(存放服务端测试环境docker IP地址)方式让其具有可选择服务端测试环境能力,大大降低联调环境配置成本。具体cookie的解析逻辑在nginx中使用lua实现。

二、lua中读写header、cookie 代码

---获取请求header
local reqHeaders = ngx.req.get_headers();
---获取请求cookie
local reqCookie = reqHeaders["cookie"];
--读取cookie值
local pcip = ngx.var.cookie_pcip;
pcip=reqCookie["pcip"];
--设置赋值cookie
ngx.header['Set-Cookie']={"pcip=127.0.0.1;domain=.timer.com;path=/" }

注:在nginx.header['Set-Cookie'] 时遇到一个问题,一次性种植多个cookie时,会出现无法一次性全部种植成功的情况,需要多次请求种植方能全部种植成功,在实战中请慎用。尤其在ngx.say()方法调用之前种植cookie出现无法一次种植成功现象几率大,在ngx.print()方法调用之前种植cookie也会如此。
其他辅助代码:

--获取请求URI
local requestUri = ngx.var.request_uri;
--获取请求域名
local requestHost = ngx.var.host;
----获取请求方法类型GET POST
local reqType= ngx.var.request_method;
--打印日志
ngx.log(ngx.ERR, ',requestHost:'..requestHost);
--反馈客户端信息
ngx.print("反馈输出纯文本");
ngx.say("反馈输出页面");

三、lua 脚本中嵌入 resty.http 文件,在lua中借助于resty.http代理http请求
resty.http (http.lua和http_headers.lua)文件下载地址:https://github.com/ledgetech/lua-resty-http/tree/master/lib/resty

--引入resty.http文件
package.path = package.path..';/export/Instances/timer/lua/resty/?.lua;'
local myHttp = require "http"
---Get 请求
local function http_get(url,headerParm,timeout)
    local httpc = myHttp.new();
    timeout = timeout or 30000;
    httpc:set_timeout(timeout)
    local res, err_ = httpc:request_uri(url, {
        method = "GET",
        keepalive=false,
        headers = headerParm;
    })
    httpc:set_keepalive(5000, 100);
    ---httpc:close();
    return res,err_;
end
---Post 请求
local function http_post(url,headerParm,body,timeout)
    local httpc = myHttp.new();
    timeout = timeout or 30000;
    httpc:set_timeout(timeout);
    local res, err_ = httpc:request_uri(url, {
        method = "POST",
        body = body,
        keepalive=false,
        headers =  headerParm;
    })
    httpc:set_keepalive(5000, 100)
    ---httpc:close();
    return res,err_;
end

在lua脚本中根据请求类型代理Http请求:

---请求路径
local reqUrl ="代理的请求URL地址";
----请求类型
local reqType= ngx.var.request_method;
--读取reqResult返回结果中的header 信息,赋值给nginx的Response header中
local function setResHeader(res)
    if(res ~= nil)then
        for k,v in pairs(res.headers) do
            ngx.header[k]=v;
        end
    end
end

if reqType == 'POST' then
    ngx.req.read_body();
    local reqBody = ngx.req.get_body_data();
    local reqResult,reqErr = http_post(reqUrl,reqHeaders,reqBody,30000);
    ngx.status = reqResult.status;
    setResHeader(reqResult);
    if(reqResult.status==200) then
        --返回200 code码时直接将结果返回
        ngx.say(reqResult.body);
        return ;
    elseif(reqResult.status==302) then
        --返回302 重定向时 需要将重定向url 赋值到response 的header.Location中
        ngx.header.Location=reqResult.headers.location;
        return ;
    else
        --报错处理
        if reqErr == nil then
            reqErr="";
        end
        ngx.say(reqResult.status..":"..reqErr);
        return ;
    end
else
    local reqResult,reqErr = http_get(reqUrl,reqHeaders,30000);
    ngx.status = reqResult.status;
    setResHeader(reqResult);
    if(reqResult.status==200) then
        ngx.say(reqResult.body);
        return ;
    elseif(reqResult.status==302) then
        ngx.header.Location=reqResult.headers.location;
        return ;
    else
        if reqErr == nil then
            reqErr="";
        end
        ngx.say(reqResult.status..":"..reqErr);
        return ;
    end
end

四、nginx 引入lua脚本

server {
    listen          80;
    server_name     www.timer.com;
    access_log      /export/servers/nginx/logs/nginx_access.log realaddr;
    error_log       /export/Logs/nginx_errr.log warn;
	
    root /export/Instances/timer/runtime/;
  
    index index.html;
    charset utf-8;
	
    location / {
	  #default_type 'text/html';   返回HTML页面
      default_type 'application/json'; #返回Json文本
      charset utf-8;  
      lua_code_cache off;
      #加载引入lua脚本
      content_by_lua_file /export/Instances/timer/runtime/lua/gateway.lua;
    }
}

注:使用access_by_lua_file加载lua脚本会出现间接性404问题:https://blog.youkuaiyun.com/TimerBin/article/details/103850392
五、其他资料
resty-http帮助文档: https://github.com/ledgetech/lua-resty-http#request

OpenResty实战指南:利用lua-resty-http模块高效发起HTTPS请求 本文详细介绍了如何在OpenResty中使用lua-resty-http模块高效发起HTTPS请求,包括模块安装、基础配置、SSL/TLS设置、性能优化及常见问题解决方案。通过实战示例展示如何实现高性能的HTTP/HTTPS通信,适用于微服务架构和第三方API集成。 阅读详情

相关推荐

OpenResty从入门到精通21-带你玩转时间、正则表达式等常用API

学完今天这节课后,OpenResty 中常用的 Lua API 我们就都介绍过了,不知道你是否都清楚了呢?最后,留一个思考题给你:在ngx.now的示例中,为什么在没有 yield 操作的时候,它的值不会修改呢?欢迎留言分享你的看法,也欢迎你把这篇文章分享出去,我们一起交流,一起进步。

fegus的博客 1047

Nginx Lua 开发 - resty.http 库的使用

resty.http 是用于访问外部 Http 资源,外部 web 服务,RESTFul 等的轻量级 http 库。 一、安装 resty.http 库 git clone https://github.com/ledgetech/lua-resty-http.git cd lua-resty-http/lib/resty # 直接拷贝文件到 openresty 的 lualib cp...

潘广宇的博客 9537

自建API代理网关实现低成本稳定接入大模型

大模型API接入本质是协议兼容、流量调度与成本治理的系统工程。其核心原理在于通过轻量级代理层统一OpenAI/Claude/Gemini等异构接口,实现请求路由、token级计费、错误码标准化与网络熔断。该方案的技术价值在于规避境外支付、DNS污染和合规风险,显著提升服务可用率与首字响应确定性。典型应用场景包括教育SaaS客服系统、AI写作工具及合同审查平台等对稳定性与成本敏感的生产环境。本文聚焦基于Nginx+Lua+Redis的自建代理网关实践,覆盖协议转换、流式透传与错误映射等关键环节。

weixin_33766805的博客 329

【openresty】引用第三方resty库 --- resty.http

OpenResty 引用第三方 resty 库,只需要将该库的 lua 文件拷贝到 resty 目录下即可。 > cd /usr/local/openresty/lualib/resty/ > curl -o http_connect.lua https://raw.githubusercontent.com/ledgetech/lua-resty-http/master/lib/resty/http_connect.lua > curl -o http_headers.lua h

be5yond的博客 2708

掌握resty.http与lcurl库:Lua网络编程利器

本文深入探讨了resty.http和lcurl这两个库在Lua语言中的应用,前者提供轻量级的HTTP通信功能,后者则封装libcurl,为Lua带来强大的网络访问能力。通过实例和详细讲解,读者可以学习如何在Lua项目中有效地使用这两个库进行网络请求、代理操作和文件上传等操作。

weixin_35671843的博客 398

ESP8266 + MQTT :如何实现 LED 灯的远程控制

MQTT 是轻量级的、灵活的物联网消息交换和数据传递协议,致力于为 IoT 开发人员实现灵活性与硬件/网络资源的平衡。 NodeMCU 是一个开源的物联网平台。它使用 Lua 语言编程。该平台基于eLua开源项目,底层使用ESP8266 sdk 0.9.5版本。 在此项目中我们将实现 NodeMCU(ESP8266) 与 EMQ X Cloud 运营和维护的免费公共 MQTT 服务器远程控制 LED 灯,并使用 Arduino IDE 来对 NodeMCU ESP8266 进行编程。 EMQ X Cloud

emqx_broker的博客 3357

OpenResty使用Lua大全(六)OpenResty发送http请求

ngx.location.capture 方法就是发起http的请求,但是它只能请求 内部服务,不能直接请求外部服务。编辑nginx.conf配置文件,配置一下路由,定义有个两个服务请求 商品服务请求和订单服务请求。可很多时候我们会要求商品请求 是不对外暴露的,也就是用户无法直接访问商品服务请求。刚才我们请求外部请求,是写死了q=iphone,那我们用capture传参。不能直接发起外部请求,我们需要通过内部请求中用反向代理请求发起外部请求。—>这种数据截断的原因只可能是因为子请求发生了不可恢复的错误,

秃了也弱了 4081

合成生物学中试:花钱只是开始,烧钱才是常态

2026年合成生物学行业面临严峻产业化挑战:多家企业终止发酵项目或延期投产,显示从实验室到工厂的转化困境。核心问题并非基因合成成本,而是工艺放大难题——67%项目在中试阶段因工艺问题失败。AI辅助无法替代工程经验,菌株-配方-工艺的三元适配需要长期数据积累。中试成本惊人,涉及设备折旧、原料消耗和稀缺工艺人才,而行业普遍回避讨论这些工程现实,导致认知偏差。建议创业者提前布局中试,将其视为核心竞争力而非简单成本项。合成生物学的真正瓶颈在于工程化能力,这需要时间沉淀而非技术叙事。

AIexander的博客 942

lua使用resty.http做nginx反向代理(https请求,docker容器化部署集群),一个域名多项目转发

【代码】lua使用resty.http。

qq_34631220的博客 1397

Python实战:5分钟搞定VCF文件中每个样本的SNP统计(附bcftools安装指南)

本文介绍了三种高效统计VCF文件中每个样本SNP数量的Python方法,包括原生解析、结合bcftools的推荐方案以及使用PyVCF3专业库。特别推荐bcftools结合Python的方法,适用于中大型VCF文件,显著提升处理效率。文章还提供了bcftools安装指南和进阶统计技巧,帮助生物信息学分析人员快速完成SNP统计任务。

weixin_30555125的博客 494

U3d WebGL使用ToLua

首先我们在编辑器模式下加入Tolua插件,然后配置修改到在编辑器模式下能够正常的运行。 同个U3d 插件Build出WebGL的工程,运行的时候你会发现(有些需要把这个WebGL工程放在一个HttpServer下面,直接本地访问index.html会被拒绝,让你使用http的格式)。 当要加载完的时候会出现 To use dlopen, you need to use Emscripten'...

qq_35267906的博客 2946

module 'resty.http' not found

没有引入第三方模块resty: 解决: 1、下载第三方模块依赖:https://github.com/ledgetech/lua-resty-http 2、将lua-resty-http/lib/resty下的两个文件http.lua和http_headers.lua拷贝到/usr/local/openresty/lualib/resty目录下(目标路径根据 个人安装的o...

ckx178的博客 5321

【Unity】Pico VR 开发实战:从环境搭建到交互实现

本文是一份详细的Unity Pico VR开发实战指南,涵盖从环境搭建到核心交互实现的全流程。详细讲解了如何集成Pico Unity Integration SDK与XR Interaction Toolkit,配置开发环境,并重点解析了手柄输入处理、射线交互以及VR UI操作三大核心模块的代码实现与优化技巧,帮助开发者快速上手Pico VR应用开发。

rice5的博客 1173

【openresty】 module ‘resty.http‘ not found

2、将lua-resty-http/lib/resty下的两个文件http.lua和http_headers.lua拷贝到/usr/local/openresty/lualib/resty目录下(目标路径根据 个人安装的openresty路径为准,这里是默认安装路径)3、重启项目,检查错误日志。

Layman的博客 1569

14、5G物理层的灵活解决方案:广义频分复用(GFDM)

广义频分复用(GFDM)作为一种高度灵活的5G物理层多载波调制方案,能够满足多样化应用场景的需求,包括高吞吐量的比特管道通信、低功耗高连接数的物联网、超低延迟的触觉互联网以及广覆盖的无线区域网。通过参数化配置,GFDM可适配LTE资源网格,实现与现有系统的兼容与共存。其支持多种解调方式、干扰消除技术、OQAM映射及预编码机制,兼具低带外发射、高频谱效率和强鲁棒性。GFDM还能统一描述OFDM、FBMC、FTN等多种经典与先进波形,成为5G及未来通信系统中极具潜力的通用波形框架。

gold8的专栏 108

通用、可复用的 AI Skill 开发基本流程

-----name:唯一标识符(建议用领域-功能格式):自然语言描述触发条件(AI 依赖此判断是否激活)tags(可选):便于分类和搜索version:支持后续迭代步骤输出物1. 定范围触发场景描述2. 写元数据name3. 填内容结构化 Markdown 文件4. 做验证可运行 + 符合规范5. 去集成放入对应 IDE 目录6. 持续维护跟进框架更新通过这套流程,你不仅可以开发(Hooks 最佳实践)(原生 WebGL 优化)(Pandas/Numpy 高效写法)

lpfasd123的博客 722

resty-http库爬虫程序代码示例

然后,它执行了一个HTTP GET请求,获取了网页内容,并将获取的网页内容打印出来。这就是整个爬虫程序的完整代码。这个程序首先导入了需要的库,包括resty.http和io。接着,它创建了一个客户端,并设置了客户端的服务器。-- 执行HTTP GET请求,获取网页内容。-- 设置HTTP客户端的。-- 打印获取的网页内容。-- 创建一个客户端。

weixin_73725158的博客 889

FM20S用户手册-PL端案例开发手册

为便于演示,本次操作直接将led_flash案例中的 "led_flash_fm20s\constraints\constrs_1Ved_flash_fm20s.fdc"文件全部代码拷贝至编辑 界面,并点击保存按钮。引脚约束请查看案例工程"led_flash\project\led_flash_fm20s\constraints\constrs_1\"目 录下的led_flash_fm20sfdc。(4)弹出如下界面,在界面配置Select device forthe project"内容,如下图。

创龙,嵌入式一体化解决方案商 400

使用了lua-resty-http库进行 爬虫

总结起来,lua-resty-http是一个方便的HTTP客户端库,可以在Lua中进行HTTP请求和响应的处理。通过引入lua-resty-http库,创建HTTP客户端实例,发送HTTP请求并处理HTTP响应,可以实现简单的爬虫功能。总结起来,lua-resty-http是一个方便的HTTP客户端库,可以在Lua中进行HTTP请求和响应的处理。通过引入lua-resty-http库,创建HTTP客户端实例,发送HTTP请求并处理HTTP响应,可以实现简单的爬虫功能。– 打印HTTP响应状态码和内容。

D0126_的博客 1717

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

OpenResty概述

OpenResty®是一个基于Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。 OpenResty®通过汇聚各种设计精良的Nginx模块(主要由 OpenResty 团队自主开发),从而将Nginx有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动Nginx支持的各种 C 以及 ...

诚的博客 931

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

nginx lua语言实现插件-HTTP请求服务端校验的代码片段

local zhttp = require "resty.http" local _M = {} _M.__index = _M function _M.http_post_client(url, body, timeout) local httpc = zhttp.new() timeout = timeout or 30000 httpc:set_timeout(timeout) local res, err_ = httpc:request_uri(url, { met...

fj56355113的专栏 530

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

openresty之http

使用过程 1.下载resty.http 库 2.将lib/resty文件夹下的http.lua 和http_headers.lua两个文件复制到 openresty的lualib/resty 目录下 常见报错 1. no resolver defined to resolve 解决办法 在location标签下添加 resolver 8.8.8.8; 2. unable to get local issuer certificate 解决办法 //关闭ssl检验 ssl_verify =false

4141

lua-resty-http 使用教程

**lua-resty-http** 是一个用于OpenResty(基于ngx_lua的扩展)的Lua HTTP客户端库。它提供了HTTP 1.0和1.1的支持,包括SSL/TLS加密、响应体的流式处理以优化内存使用、简单的单次请求接口、chunked和非chunked传输编码、连接复用、请求管道化以及响应尾部处理等功能。 ## 2. 项目快速启动 ### 安装 在你的OpenResty环境...

gitblog_00537的博客 828

nginx openresty lua-resty-http 使用的一些问题记录

今天使用 openresty + lua-resty-http 遇到的一些问题记录,感觉最难排查的就是 http 请求卡住了,因为问题比较特异,所以记录一下

小狼碎碎念的博客 1827

lua-resty-http 与 lua-resty-http2 对比:如何选择适合的HTTP客户端

在OpenResty/ngx_lua开发中,选择合适的HTTP客户端对于构建高性能服务至关重要。lua-resty-http作为一款成熟的HTTP客户端驱动,已广泛应用于各类生产环境。本文将深入对比lua-resty-http与lua-resty-http2的核心差异,助你快速掌握两者的适用场景与选型策略。 ## 核心功能对比:基础能力与协议支持 ### lua-resty-http:轻量稳定

gitblog_00978的博客 999

开源项目教程:lua-resty-http

lua-resty-http 是一个专为 OpenResty / ngx_lua 设计的 Lua HTTP 客户端库。该库支持 HTTP 1.0 和 1.1 协议,以及 SSL 加密连接,提供了响应体流式处理接口以确保内存使用的可预测性。此外,它还支持简单的单次请求接口,无需手动建立连接步骤,适用于那些想要简便操作的场景。特性包括分块编码传输、非分块编码、长连接复用、管道(Pipelining)及...

gitblog_00971的博客 870
上一篇: 使用ForkJoinPool线程池调用 jdk 1.8 并行流parallelStream
下一篇: 基于Spring IOC容器实现工具类静态方法调用的三种方式
TimerBin
博客等级 码龄12年 54粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值