0

我正在尝试使用 QuotaGuard 静态 IP 来托管 Next.js 应用程序。Next API 路由正在运行 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 客户端无法连接(连接被拒绝)
// 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/

4

1 回答 1

0

在这种情况下,根据您共享的内容,您很接近,但您需要使用 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  

或者,如果您愿意,您可以通过单击应用程序资源选项卡上的 QuotaGuard Static 从 Heroku 仪表板登录。

登录仪表板后,在右上角的菜单中,转到设置(齿轮图标),单击 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 中,这是通过 Procfile 完成的。基本上你只需要在你的启动代码前加上“bin/qgtunnel”。

因此,对于以前的 Procfile:

    web: your-application your arguments

你现在想要:

    web: bin/qgtunnel your-application your arguments  

如果您没有 Procfile,则 Heroku 会根据您使用的框架或语言使用默认设置代替 Procfile。您通常可以在 Heroku 仪表板中应用程序的概览选项卡上找到此信息。它通常位于“测功机信息”标题下。

  1. 提交并推送您的代码

确保文件 bin/qgtunnel 已添加到您的存储库中。

如果您使用透明模式,请确保 vendor/nss_wrapper/libnss_wrapper.so 也添加到您的存储库中。

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

  1. 如果你有问题...

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

很重要

  1. 一切正常后

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

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

于 2021-09-29T21:37:49.317 回答