通过nodejs、njs脚本语言扩展nginx

Extend nginx via nodejs, njs script language

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

ECMAScript 5.1 (strict mode) with some ECMAScript 6 and later extensions

扩展 nginx。作为用例

Complex access control and security checks in njs before a request reaches an upstream server

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

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

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

Javascript 的

is a 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)
    }
)

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