问题描述
我在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等“节点内部”起作用吗?
解决方法
njs 是 Javascript 的 subset,目前缺乏任何直接与外部进程接口的方式,但是可以向 本地 路由发出子请求,这些路由又可以代理其他服务。我在研究类似要求时偶然发现了您的问题,并在此处发布了一个简单示例:
最有效的解决方案意味着围绕您的数据库连接创建一个瘦包装器并将其部署为独立的网络服务,然后设置一个内部路由来反向代理连接:
location /internal-service {
internal;
proxy_pass http://<hostname>:<port>;
}
然后您的 njs
脚本可以通过调用:
response.subrequest(
'/internal-service',{
method: 'GET',},serviceResponse => {
// some logic...
response.return(200)
}
)
可能还有其他解决方法,但这种方法目前似乎是最可靠的。不幸的是,它确实使开发自包含模块变得困难 - 我怀疑这就是为什么没有真正可用的可重用包的原因之一。