`
chaoslawful
  • 浏览: 198437 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

用ngx_lua实现简单的网页编码转换网关

阅读更多

借助 nginx proxy 模块我们可以给 ngx_lua 很方便地实现非阻塞 HTTP 客户端功能,即使用一个被 proxy 模块处理的内部 location 作为 HTTP client stub,然后通过 ngx_lua 中的 location.capture 接口调用它访问外部 URL。当然为了能解析外部域名,还需要指定 nginx 的 resolver 地址以开启 proxy 模块的域名解析功能。

 

下面就是一个简单的网页编码转换网关的 nginx 配置(需要事先安装 lua-iconv 模块):

http {
    ...
    # 指定域名解析服务器地址
    resolver 127.0.0.1;
    ...
    server {
        ...
        # http client stub
        location /http_client {
            internal;
            proxy_pass $arg_url;
        }
        location /web_iconv {
            content_by_lua '
                local from, to, url = ngx.var.arg_f, ngx.var.arg_t, ngx.var.arg_u
                local capture = ngx.location.capture
                local print = ngx.print
                local iconv = require("iconv")
                local cd = iconv.new(to or "utf8", from or "gbk")
                local res = capture("/http_client?url=" .. url)
                local ostr, err = cd:iconv(res.body)
                print(ostr)
            ';
        }
        ...
    }
    ...
}

 测试一下吧:

$ curl 'http://localhost/web_iconv?f=gbk&t=utf8&u=http://www.baidu.com/'

 当然,由于 nginx proxy 模块仅支持 HTTP/1.0 协议,因此在负载很高的情况下(例如访问 REST API)效率并不高。后续我们将开发支持 HTTP/1.1 协议的代理模块,实现 keep-alive 和 pipelining 等 HTTP/1.1 高级特性,以便在 ngx_lua 中方便地进行高效率的外部 HTTP 协议访问。

 

Update: nginx proxy 模块在目标 url 不含路径时会默认使用父请求的路径,故在之前的例子里,如果 参数 u 是 http://www.baidu.com 而不是 http://www.baidu.com/,则 proxy 模块实际去请求的 url 将是 http://www.baidu.com/web_iconv?f=gbk&t=utf8&u=http://www.baidu.com ,显然这并非我们期望的结果。因此目前如果要借用 proxy 模块作为 http client,就必须显式指明目标 url 的路径。切记!

 

0
0
分享到:
评论

相关推荐

    ngx_lua_module-windows-1.1.2.0

    ngx_lua_module是一款强大的扩展模块,专为Nginx服务器设计,允许在Nginx配置文件中直接嵌入Lua脚本,极大地增强了Nginx的功能和灵活性。这个"ngx_lua_module-windows-1.1.2.0"是该模块的一个Windows版本,适应于...

    ngx_lua资源

    使用这个软件包,开发者可以在 Windows 环境下搭建 ngx_lua 开发和运行环境。 在实际应用中,ngx_lua 可以用于实现以下功能: 1. 动态路由:通过 Lua 脚本实现动态的 URL 重写和分发,提高灵活性。 2. 认证和授权...

    ngx_lua内幕

    最终,ngx_lua实现了Proactor模式,使得开发者可以按自然逻辑顺序编写代码,同时自动获得高并发服务能力。 性能对比 在性能测试中,通过配置Nginx的worker_processes和worker_connections参数来调整工作线程和连接...

    ngx_lua_waf-master.zip_lua_nearly11h_nginx_ngx_lua_waf

    ngx_lua_waf是一个基于Nginx的Web应用防火墙,其核心是利用了Nginx的ngx_lua模块,通过Lua脚本实现灵活且强大的安全防护功能。ngx_lua_waf项目名称中的“master”通常指的是该项目的主分支或最新版本。"nearly11h...

    Using ngx_lua in UPYUN 2.pdf

    根据提供的文件内容,这篇文档主要围绕在UPYUN云平台上使用ngx_lua模块与Nginx结合进行编程和配置的详细指南。下面将详细梳理这些知识点。 ### 标题知识点 - **ngx_lua**: 这是Nginx的一个模块,它允许Nginx执行Lua...

    Using ngx_lua in UPYUN 2.zip

    UPYUN 是一家提供云存储和内容分发服务的公司,它们的平台支持使用 ngx_lua 进行自定义处理,从而提高服务性能和灵活性。 在"Using ngx_lua in UPYUN 2"中,我们将探讨如何利用 ngx_lua 实现 UPYUN 平台上的高效能 ...

    lua-upstream-nginx-module, Nginx C 模块将Lua向ngx_lua公开,用于 Nginx upstreams.zip

    lua-upstream-nginx-module, Nginx C 模块将Lua向ngx_lua公开,用于 Nginx upstreams 电子邮件名称ngx_http_lua_upstream - Nginx MODULE,用于向 Nginx upstreams公开Lua到 ngx_lua目录NAME状态概要说明函数get_...

    lua & ngx_lua 的介绍与应用

    上段时间使用ngx_lua效果还真不错 lua这门语言让人耳目一新,跟一般的脚本语言如php,perl不同,lua被称为一种嵌入式的语言,当然lua也可以单独的进行编程,但如果你这么做的话,那么lua只是一片浮云,当然了,lua...

    ngx_lua 在又拍云的应用:日志收集及其他 - 又拍云系统开发工程师 - 张聪

    此次主要跟大家分享的就是我们团队在这整个转换过程中的一些心得体会,以及在 NGINX 上基于 ngx_lua 的一些有趣的功能,特别地,会着重介绍下我们是如果利用 ngx_lua 的灵活性来动态收集日志进行数据聚合分析的。

    第08篇:Bypass ngx_lua_waf SQL注入防御(多姿势)1

    本文将详细介绍三种独特的绕过ngx_lua_waf SQL注入防御的方法,并提供具体的实现细节。 #### 0x01 环境搭建 在深入讨论具体的绕过技术之前,我们需要构建一个能够运行ngx_lua_waf的环境。可以通过GitHub获取源码并...

    Nginx-ngx_lua模块原理和内置函数.docx

    - **rewrite_by_lua / rewrite_by_lua_file / access_by_lua / access_by_lua_file / header_filter_by_lua / header_filter_by_lua_file / body_filter_by_lua / body_filter_by_lua_file:** - 这些指令用于处理...

    ngx_stream_ssl_preread_module调研.docx

    NGX_STREAM_SSL_PREREAD_MODULE 是一个基于流媒体(Stream)实现的 SSL/TLS 协议 ClientHello 消息提取模块,主要用于提取 SNI(Server Name Indicate)或者 ALPN(Application Layer Protocol Negotiation,应用层...

    第三篇:Bypass ngx_lua_waf SQL注入防御(多姿势)1

    ### Bypass ngx_lua_waf SQL注入防御方法解析 #### 0x00 前言 ngx_lua_waf是一款基于ngx_lua的Web应用防火墙,以其高性能和轻量级著称。它内置了一系列针对常见攻击手段(如SQL注入)的防御规则。然而,任何安全...

    lua-nginx-module-0.10.13

    ngx_lua_shared_dict则提供了在不同Lua VM之间共享数据的机制,适用于实现缓存和计数器等功能。 三、Lua-Nginx-Module的使用 3.1 安装与配置 安装lua-nginx-module通常涉及编译Nginx源码,并在编译时添加lua-nginx...

    Centos 7 64 +[nginx+ngx_lua 模块] 支持WAF防护功能

    - 下载并安装LuaJIT 2.1,这是一个高性能的Lua解释器,用于实现ngx_lua模块中的Lua脚本执行。 - 下载ngx_devel_kit(NDK),这是一个开发工具包,允许Nginx与第三方模块交互。 - 下载lua-nginx-module,这是一个...

    lua-resty-test, 在Openresty上,基于ngx_lua的测试框架.zip

    lua-resty-test, 在Openresty上,基于ngx_lua的测试框架 电子邮件名称基于Openresty的lua-resty-test Ngx_lua测试框架#Description 这里Lua库是测试ngx_lua源或者它的他服务器( tcp或者 udp )的测试框架:...

    lua-resty-consul, 库与ngx_lua中的consul接口的接口.zip

    lua-resty-consul, 库与ngx_lua中的consul接口的接口 lua-resty-consul库与ngx_lua中的consul接口的接口目录概述依赖项方法新插件 。get_decodedget_json_decoded把了删除get_client_body_reader

    lua-resty-redis:基于cosocket API的ngx_lua的Lua Redis客户端驱动程序

    姓名lua-resty-redis-基于cosocket API的ngx_lua的Lua Redis客户端驱动程序目录状态该库被认为可以投入生产。描述这个Lua库是ngx_lua nginx模块的Redis客户端驱动程序: 这个Lua库利用了ngx_lua的cosocket API,可...

Global site tag (gtag.js) - Google Analytics