首页 > 解决方案 > 通过nodejs、njs脚本语言扩展nginx

问题描述

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

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

扩展 nginx。作为用例

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

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

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

仅适用于外部库还是适用于“节点内部”,如 net、dgram 等?

标签: node.jsnginxnjs

解决方案


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

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

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

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

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

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


推荐阅读