【问题标题】:How to set up an endpoint for Health check on Next.js?如何在 Next.js 上设置健康检查端点?
【发布时间】:2020-01-17 06:27:15
【问题描述】:

我在 Kubernetes(谷歌云)上部署了一个应用程序。要使部署正常运行,它需要向“/healthz”和“/”返回 200 状态响应。我在我的 Express 服务器上设置了这个作为返回响应的路由,如下所示:

app.use('/healthz', ((_req, res) => {
      logGeneral.info("Health Status check called.");
      res.sendStatus(200);
    }));

但我不知道如何对在 Next.js / React 上运行的前端做同样的事情。不支持 res.send 等命令。

有人知道吗?

谢谢。

【问题讨论】:

  • 您尝试过简单的页面吗?主页,登录?只要它是一个返回 200 的有效 url,它应该可以工作。
  • 我让它在“/”和“/healthz”路由上工作,但这并不好,因为客户端访问“/”基本路由,看到 200 状态代码出现很奇怪而不是网站。
  • 您知道如果您的网站正常运行,它会返回一个 200 HTTP 代码吗?否则,您将无法导航;)
  • Kubernetes 要求我创建 2 个端点,专门用于返回 200 信号。我使用原始帖子中显示的代码为快速服务器执行此操作。但是对于 Next.js,我必须创建 2 个页面,一个索引和一个 Healthz,这样我才能在每个页面上返回一个 200 信号。没有这个,它就行不通。我是不是在这里漏掉了什么,我很困惑哈哈。
  • 健康状态页面用于准备就绪和活跃度探测,两者之一仅在 pod 开始时处于活动状态,liveliness pod 在这里确保您的应用程序仍在响应,以防万一是不是 pod 会重新启动。如果您可以对这些页面进行编码,您可以为这些检查提供任何您想要的路径,但在某些情况下,您不能。一些应用程序没有提供可用的自定义路径,在这种情况下,任何必要的页面都可以用来假设它已经启动。

标签: reactjs kubernetes google-cloud-platform next.js


【解决方案1】:

使用 API 路由是正确的答案。在 /pages/api 中创建一个名为 healthcheck.js 的新文件,其中包含以下内容:

export default function handler(req, res) {
  res.status(200).json({ "status": "ok" })
}

端点将位于 (hostname)/api/healthcheck

【讨论】:

    【解决方案2】:

    我也有类似的要求。我必须在 AWS 上部署我的代码,我需要一个运行状况检查 URL,例如 http://localhost:4000/ping

    我在页面内创建了一个名为 ping/index.js 的文件,其中包含以下内容-

    // health check URL
    function Ping() {
    }
    
    // This gets called on every request
    export async function getServerSideProps(context) {
      context.res.end('pong');
      return { props: { } }
    }
    
    export default Ping;
    

    参考资料-

    1. https://github.com/vercel/next.js/issues/6750
    2. https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering

    【讨论】:

    • API 在未发送 /api/health 响应的情况下解析,这可能会导致请求停止。收到这个
    【解决方案3】:

    如果你必须使用/healthz的根路径,你可以按照这里其他人的建议添加一个API路由;

    // ./pages/api/health.js
    export default function handler(req, res) {
      res.send('OK');
    }
    

    另外你在next.config.js中定义了一个重写,所以/healthz将在内部由/api/health处理;

    /** @type {import('next').NextConfig} */
    module.exports = {
      rewrites: async () => {
        return [
          {
            source: '/healthz',
            destination: '/api/health',
          },
        ];
      },
    };
    

    【讨论】:

      【解决方案4】:

      在 next.js 中使用了 api 路由,这似乎是处理此类情况的正确方法

      https://nextjs.org/docs/api-routes/introduction

      【讨论】:

        【解决方案5】:

        添加到@Koen。回答。

        如果您的应用使用 basePath 运行,例如。 "/abc" 并且您希望从运行状况检查 URL 中排除 basePath,例如。 https://example.com/healthz

        然后下面的代码在 k8/docker 容器中工作。

        // ./pages/api/health.js
        export default function handler(req, res) {
          res.status(200).json({ message: 'Health Check Okay' })
        }
        

        next.config.js

        module.exports = {
         rewrites: async () => {
          return [
           {
             source: '/healthz',
             destination: 'https://example.com/api/healthz', 
             //can write destination: http://localhost:<PORT>/api/healthz to make it ENV independent. 
             basePath: false
           },
          ];
         },
        };
        

        参考:https://nextjs.org/docs/api-reference/next.config.js/rewrites

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-03
          • 1970-01-01
          • 2020-05-29
          • 1970-01-01
          • 2021-12-24
          • 2015-12-31
          • 1970-01-01
          • 2023-03-17
          相关资源
          最近更新 更多