Proxy Heroku App Running Next.js and Prisma Client



我正在尝试使用QuotaGuard静态ip来托管Next.js应用程序。Next API路由运行Prisma,而Prisma反过来直接向受保护的Microsoft SQL Server发出db请求。

客户端已将我的IP列入白名单,用于本地开发,应用程序工作正常。但是在Heroku上,如果没有QuotaGard,你就无法获得静态IP。

我不相信我正确地设置了QuotaGuard或server.js文件。应用程序的其余部分运行良好。以下是这些文件:

:

  • 服务器将其url代理到QuotaGuard
  • 提供的url
  • MS Sql Server可以将IP加入白名单
  • Next.js server.js使用'http-proxy-middleware'来代理请求

实际行为:

  • 应用程序主页只显示"这是一个代理服务器">
  • QuotaGuard仪表板没有显示任何请求
  • prisma客户端无法连接(connection refused)
// server.js
//  BASICALLY A COMBO OF THESE TWO OPTIONS:
//  - https://quotaguard.freshdesk.com/support/solutions/articles/5000013744-getting-started-with-node-js-standard-http-library-quotaguard
//  - https://medium.com/bb-tutorials-and-thoughts/next-js-how-to-proxy-to-backend-server-987174737331
const express = require('express')
const { parse } = require('url')
const next = require('next')
const { createProxyMiddleware } = require('http-proxy-middleware')
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
// proxy middleware options
const options = {
target: process.env.QUOTAGUARDSTATIC_URL, // target host
changeOrigin: true, // needed for virtual hosted sites
ws: true, // proxy websockets
}
app.prepare()
.then(() => {
const server = express()
if (!dev) {
server.use('*', createProxyMiddleware({ ...options  }))
}
server.all('*', (req, res) => {
const parsedUrl = parse(req.url, true)
return handle(req, res, parsedUrl)
})
server.listen(process.env.PORT, (err) => {
if (err) throw err
console.log(`> Ready on http://localhost:${process.env.PORT}`)
})
})
.catch((err) => {
console.log('Error:::::', err)
})

您可以在https://planes-planner-staging.herokuapp.com/

看到实时应用程序

在这种情况下,根据您共享的内容,您很接近了,但是您需要使用QuotaGuard QGTunnel软件来使用SOCKS代理。

设置步骤如下:

  1. 将QGTunnel下载到项目根目录
curl https://s3.amazonaws.com/quotaguard/qgtunnel-latest.tar.gz | tar xz
  1. 登录QuotaGuard仪表板并设置隧道

由于您正在使用Heroku,因此您可以使用Heroku CLI使用以下命令登录到仪表板:

heroku addons:open quotaguardstatic  

或者,如果你愿意,你可以从Heroku仪表板通过点击QuotaGuard Static在你的应用程序的资源选项卡。

一旦你登录到仪表板,在右上方的菜单中,去设置(齿轮图标),点击QGTunnel配置,然后创建隧道。

Remote Destination: tcp://hostname.for.your.server.com:1433 
Local Port: 1433
Transparent: true
Encrypted: false

此设置假设远程mssql服务器位于hostname.for.your.server.com并且在端口1433上侦听。这通常是默认端口。

本地端口是QGTunnel要监听的端口号。

在本例中,我们将其设置为5432,但如果您有另一个进程使用1433,则可能需要更改它(即:1434)。

透明模式允许QGTunnel将hostname.for.your.server.com的DNS覆盖到127.0.0.1,从而将流量重定向到QGTunnel软件。这意味着您可以连接到hostname.for.your.server.com或127.0.0.1来通过隧道连接。

加密模式可以用于端到端加密数据,但是如果你的协议已经加密了,那么你不需要花时间设置它。

  1. 更改代码以通过隧道连接

使用透明模式并匹配本地和远程端口,您应该不需要更改代码。您也可以连接到127.0.0.1:1433。

如果没有透明模式,您将需要连接到127.0.0.1:1433。

  1. 修改启动代码

更改启动应用程序的代码。在Heroku中,这是通过配置文件完成的。基本上,你只需要在启动代码前加上"bin/qgtunnel"。

对于先前的Procfile:

web: your-application your arguments

你现在需要:

web: bin/qgtunnel your-application your arguments  

如果您没有Procfile,那么Heroku将根据您正在使用的框架或语言使用默认设置来代替Procfile。您通常可以在Heroku的仪表板中的应用程序的Overview选项卡上找到这些信息。通常在"动态信息"的标题下。

  1. 提交并推送你的代码

确保将bin/qgtunnel文件添加到存储库中。

如果你使用的是透明模式,请确保vendor/nss_wrapper/libnss_wrapper。因此也被添加到您的存储库中。

如果您不使用透明模式,您将需要将环境变量QGTUNNEL_DNSMODE设置为DISABLED,以避免在日志中看到错误消息。

  1. 如果你有问题…

启用环境变量QGTUNNEL_DEBUG=true,然后在查看日志的同时重新启动应用程序。

非常重要
  1. 一切正常运行后

以. QGTunnel文件的形式从仪表板下载QGTunnel配置,并将其放在项目的根目录中。这可以防止您的项目在启动期间依赖于QG网站。

或者您可以将下载的配置文件的内容放在QGTUNNEL_CONFIG环境变量中。