簡體   English   中英

代理 Heroku App 運行 Next.js 和 Prisma Client

[英]Proxy Heroku App Running Next.js and Prisma Client

我正在嘗試使用 QuotaGuard Static IP 來托管 Next.js 應用程序。 Next API 路由正在運行 Prisma,后者又向受保護的 Microsoft SQL 服務器發出直接數據庫請求。

客戶已將我的 IP 列入本地開發白名單,該應用程序運行良好。 但是在 Heroku 上,如果沒有 QuotaGard,您將無法獲得 static IP。

我不相信我沒有正確設置 QuotaGuard 或 server.js 文件。 該應用程序的 rest 工作正常。 這是那些文件:

預期行為

  • 服務器將其 url 代理到 QuotaGuard 提供的一個
  • MS Sql 服務器可以把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/查看實時應用程序

在這種情況下,根據您分享的內容,您很接近,但您需要使用 QuotaGuard QGTunnel 軟件通過 SOCKS 代理訪問 go。

設置它的步驟是:

  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 儀表板登錄。

登錄儀表板后,在右上角的菜單中,go 到設置(齒輪圖標),單擊 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 儀表板中應用程序的概述選項卡上找到此信息。 它通常位於“Dyno 信息”標題下。

  1. 提交並推送您的代碼

確保文件 bin/qgtunnel 已添加到您的存儲庫中。

如果您使用的是透明模式,請確保 vendor/nss_wrapper/libnss_wrapper.so 也已添加到您的存儲庫中。

如果您不使用透明模式,則需要將環境變量 QGTUNNEL_DNSMODE 設置為 DISABLED 以避免在日志中看到錯誤消息。

  1. 如果你有問題...

啟用環境變量 QGTUNNEL_DEBUG=true ,然后在查看日志的同時重新啟動您的應用程序。

很重要

  1. 一切正常后

從儀表板下載您的 QGTunnel 配置作為 .qgtunnel 文件並將其放在項目的根目錄中。 這樣可以防止您的項目在啟動過程中依賴於 QG 網站。

或者,您可以將下載的配置文件的內容放在 QGTUNNEL_CONFIG 環境變量中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM