我正在尝试使用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代理。
设置步骤如下:
- 将QGTunnel下载到项目根目录
curl https://s3.amazonaws.com/quotaguard/qgtunnel-latest.tar.gz | tar xz
- 登录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来通过隧道连接。
加密模式可以用于端到端加密数据,但是如果你的协议已经加密了,那么你不需要花时间设置它。
- 更改代码以通过隧道连接
使用透明模式并匹配本地和远程端口,您应该不需要更改代码。您也可以连接到127.0.0.1:1433。
如果没有透明模式,您将需要连接到127.0.0.1:1433。
- 修改启动代码
更改启动应用程序的代码。在Heroku中,这是通过配置文件完成的。基本上,你只需要在启动代码前加上"bin/qgtunnel"。
对于先前的Procfile:
web: your-application your arguments
你现在需要:
web: bin/qgtunnel your-application your arguments
如果您没有Procfile,那么Heroku将根据您正在使用的框架或语言使用默认设置来代替Procfile。您通常可以在Heroku的仪表板中的应用程序的Overview选项卡上找到这些信息。通常在"动态信息"的标题下。
- 提交并推送你的代码
确保将bin/qgtunnel文件添加到存储库中。
如果你使用的是透明模式,请确保vendor/nss_wrapper/libnss_wrapper。因此也被添加到您的存储库中。
如果您不使用透明模式,您将需要将环境变量QGTUNNEL_DNSMODE设置为DISABLED,以避免在日志中看到错误消息。
- 如果你有问题…
启用环境变量QGTUNNEL_DEBUG=true,然后在查看日志的同时重新启动应用程序。
非常重要- 一切正常运行后
以. QGTunnel文件的形式从仪表板下载QGTunnel配置,并将其放在项目的根目录中。这可以防止您的项目在启动期间依赖于QG网站。
或者您可以将下载的配置文件的内容放在QGTUNNEL_CONFIG环境变量中。