首页 > 其他分享 >关于服务器端渲染的 Web 应用的 504 错误问题

关于服务器端渲染的 Web 应用的 504 错误问题

时间:2023-02-05 21:33:50浏览次数:45  
标签:Web 服务器端 js 000 504 SSR block 请求

除非客户在 SSR 中添加了用于显式发送 504 的自定义逻辑,否则 504 不会来自 SSR。

在默认的 Spartacus/SSR 中,没有显式发送 504 的逻辑。 默认情况下它只发送 200 或 500(仅在 APP_INITIALIZER 失败的情况下)。

我们在浏览器里看到的这个 504 错误:

An error occurred.

Sorry, the page you are looking for is currently unavailable.

这个错误消息是由 nginx 生成的,并发送 504(网关超时),根据 MDN,这意味着:

504 Gateway Timeout 服务器错误响应代码表示服务器在充当网关或代理时,没有及时从上游服务器(the upstream server)获得完成请求所需的响应。

在这种情况下,上游服务器是 node.js 服务器。node.js 根本没有响应,于是 nginx 网关向客户端发回 504 错误码。

如果 Node.js 响应速度过慢,Nginx 就会直接将客户端发送过来的请求通过 504 错误码响应。

在某些特殊的场景下,有问题的请求在 Dynatrace 中实际上是不可见的。

个人的猜测是 Dynatrace 只有 在请求完成时才记录了该项目。所以那些永远不会完成的永远不会被 Dynatrace 记录。

例如,某些请求逻辑进入了无限循环(在 Java 代码中),导致线程从未结束,该请求从未记录在 Dynatrace 中。

下面这段代码可以模拟 Node.js 主线程被 block 的场景:

export class AppComponent {
  constructor(protected location: Location) {}

  ngOnInit() {
    const url = this.location.path();
    const shouldBlock = url.endsWith('?block-main-thread-super-long');
    console.log({ url, shouldBlock });
    if (shouldBlock) {
      this.blockMainThreadSuperLong();
    }
  }

  blockMainThreadSuperLong() {
    const SUPER_BIG_BUMER = 1_000_000_000_000_000;
    for (let i = 0; i < SUPER_BIG_BUMER; i++) {
      // do nothing, just looping to simulate a slow operation
    }
  }
}

运行命令行 curl http://localhost:4200/electronics-spa/?block-main-thread-super-long,不会收到任何响应,因为主线程被 block 住了。

再发送其他请求 curl http://localhost:4200,也收不到任何回应,这也是预料中的结果,因为主线程被 block 了。

下面代码是模拟 Node.js SSR 不再响应任何请求的场景:

// server.ts
  
  /*...*/

  let neverSendResponsesAnymore = false;

  // All regular routes use the Universal engine
  server.get('*', (req, res) => {
    if (req.url.endsWith('?never-send-responses-anymore')) {
      neverSendResponsesAnymore = true;
    }

    if (neverSendResponsesAnymore) {
      return;
    }

    res.render(indexHtml, {
      req,
      providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }],
    });
  });

下面这段高亮代码会导致 SSR 不响应客户端请求:

这两段代码均来自我的同事 Kris.

标签:Web,服务器端,js,000,504,SSR,block,请求
From: https://blog.51cto.com/jerrywangsap/6038461

相关文章

  • 《Flask Web开发》-第一章-安装
    Flask是小型框架,涉及为可扩展的框架Flask有三个主要依赖:路由、调试和Web服务器网关接口使用虚拟环境来安装flask。虚拟环境是python解释器的一个私有副本,在虚拟环境中可以安......
  • 第五届“强网”拟态防御国际精英挑战赛初赛——Web Misc
    之前团队参加了第五届“强网”拟态防御国际精英挑战赛初赛,又是收获满满的一次,和全国很多大佬们一块同台竞争,最重要的是,通过比赛我们学到了很多新的方法和技能,下面让我们一块......
  • WebAPI_DAY5
    滚动事件当页面进行滚动时触发目的:页面滚动到某个区域后做一些处理,比如固定导航栏,比如返回顶部事件名:scrollwindow.addEventListener('scroll',function(){})监听某......
  • web 前端 UI 库
     2022年比较火的web前端UI库名称简介iViewiView是一套基于Vue.js的开源UI组件库,主要服务于PC界面的中后台产品。iView的组件还是比较齐全的,更新......
  • webpack-cnblog
    1.webpack定义用于现代JavaScript的静态模块打包工具解决的问题模块依赖代码编写less转cssts转js开发效率热加载项目优化压缩,打包2.load......
  • IDEA/WebStrom Deepin/UOS桌面图标创建
    IDEA[DesktopEntry]Categories=Developer;Comment=IntelliJIDEAExec=/home/xxx/app/idea-IU-221.5080.210/bin/idea.shIcon=/home/xxx/app/idea-IU-221.5080.210/b......
  • 第六十六章 使用 Web 服务监控 IRIS - IRIS 对 WS-Monitoring 的支持概述
    第六十六章使用Web服务监控IRIS-IRIS对WS-Monitoring的支持概述本附录介绍并简要描述了如何使用IRIS®数据平台支持WS-Management规范,它使能够通过SOAP远......
  • WebSocket服务器
    //创建websocket服务器 ws_server.php//https://wiki.swoole.com/wiki/page/479.html//创建websocket服务器对象,监听0.0.0.0:9502端口$ws=newswoole_websocket_se......
  • ASP.NET Core Web API 中控制器操作的返回类型
    ASP.NETCoreWebAPI中控制器操作的返回类型ASP.NETCore为WebAPI控制器操作返回类型提供以下选项:特定类型IActionResultActionResult<T>HttpResults特定类......
  • webbench安装及压力测试web
    一、webbench简介Webbench是知名的网站压力测试工具,它是由Lionbridge公司开发。WebBench是用于对WWW或代理服务器进行基准测试的非常简单的工具。使用fork()模拟多......