【问题标题】:Extend nginx via nodejs, njs script language通过nodejs、njs脚本语言扩展nginx
【发布时间】:2021-01-01 23:13:56
【问题描述】:

我在 nginx 文档中找到了可以使用的部分

ECMAScript 5.1(严格模式)和一些 ECMAScript 6 及更高版本的扩展

扩展 nginx。作为用例

在请求到达上游服务器之前在 njs 中进行复杂的访问控制和安全检查

https://nginx.org/en/docs/njs/

我不知道我是否能够连接到数据库并执行与 node.js 中类似的操作。甚至在 nginx 进程中“运行”节点。但是我认为我的卡不好,因为目前只有两个模块,它们没有提供网络套接字之类的功能,但是,有一个部分“使用带有 njs 的节点模块”:https://nginx.org/en/docs/njs/node_modules.html

仅可与外部库或“节点内部”(如 net、dgram 等)一起使用?

【问题讨论】:

    标签: node.js nginx njs


    【解决方案1】:

    是 Javascript 的 subset,目前缺乏任何直接与外部进程交互的方法,但是可以向 local 路由发出子请求,进而代理其他服务。我在研究类似要求时偶然发现了您的问题,并在此处发布了一个简单的示例:

    最接近解决方案的方法实际上是围绕您的数据库连接创建一个瘦包装器,并将其部署为独立的 Web 服务,然后设置一个内部路由来反向代理连接:

    location /internal-service {
        internal;
        proxy_pass http://<hostname>:<port>;
    }
    

    然后您的njs 脚本可以通过调用:

    response.subrequest(
        '/internal-service', 
        {
            method: 'GET',
        },
        serviceResponse => {
            // some logic... 
            response.return(200)
        }
    )
    

    可能还有其他解决方法,但这种方法似乎是目前最可靠的。不幸的是,它确实使开发自包含模块变得困难——我怀疑这是没有任何可重用包可用的原因之一。

    【讨论】:

    • 仅在 nginx 配置文件中定义的位置块或完整的外部 url 上运行子请求,例如 http://127.0.0.1:4500?
    • 我也测试过,subrequest 不能调用完全限定的地址,它只能看到本地路由 - 所以必须在你的 nginx 配置中定义一个中间代理路由(位于相同的server 块),无论代理服务是在本地、不同端口还是远程运行。
    猜你喜欢
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多