前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >云上Nodejs同构服务端渲染容灾

云上Nodejs同构服务端渲染容灾

原创
作者头像
easonxie
修改2021-07-12 00:03:53
9830
修改2021-07-12 00:03:53
举报

业务上云后,不只是RS上云,接入层也换成了云上的CLB,这里记录下业务上云后,服务端渲染容灾相关的问题解决。

背景

我们的项目是一个同构的nodejs服务端渲染项目,服务使用镜像部署,支持直接返回nodejs服务端渲染的html,也支持返回静态html资源,用户在客户端浏览器发起请求获取数据,然后再渲染页面。绝大多数情况下,我们的nodejs服务正常运行,提供服务端渲染完成的html,但是少数情况下需要返回静态的html资源(nodejs服务出现异常,镜像发布异常等等)。

解决方案

我们的服务需要通过接入层把流量接入到我们实际部署的镜像里面。在接入层配置合适的容灾规则是比较合理的。目前绝大多数的接入层都是基于nginx改造的,或者兼容nginx的配置语法(例如腾讯云的CLB)。先不考虑云上接入层,看看纯nginx接入流量我们怎么处理这样的问题。

 proxy_intercept_errors on; #注意要开启这个配置
 
 # 拦截nodejs服务端渲染的异常,转发到静态资源服务器上去。
 error_page 500 501 502 503 504 404 @static_file;
 location @static_file {
     proxy_pass  http://staticservers;
 }

但是上云之后,腾讯云的CLB是不支持配置@开头的location的,那如何满足我们的容灾需求呢??

云上配置

腾讯云的CLB上,只能使用一些技巧来满足我们的容灾需求。这里用nginx配置简单说明下,下面是clb的配置。保证后端的node服务异常的时候,转发到static_file的集群里面去。

 proxy_intercept_errors on; #注意要开启这个配置
 server{
       listen 80;
       server_name myhost.com;
       location /pages {
         proxy_pass  http://pagesnodeserver;
         # 拦截nodejs服务端渲染的异常,转发到/static_file路径上去
         error_page 500 501 502 503 504 404 = 200 /static_file;
       }
 
       location /static_file {
         proxy_set_header Path $request_uri; // 关键,把路径透传到header里带给/static_file集群
         proxy_pass  http://staticservers;
       }
 }

这里注意的是,我们是把请求转发到了/static_file, static_file对应的后端服务拿到的请求path也是static_file,没法正确的响应请求。这里有几种办法,把真实的请求url传递给后端服务,例如把真实的请求通过proxy_set_header的方式,添加到header里去,然后后端通过header里面的路径去转发(注意:如果使用 proxy_set_header 自定义header,则上层的Header配置将不会继承,包括HOST、IP等重要信息将会丢失,解决办法就是需要的header都得添加一次)。下面看看后端如何配置。

server{
      listen 80;
      server_name myhost.com;
      add_header 'File-From' 'Back-Server';
      # 从header拿到path, 转发请求到真实的路径上去
      location /static_file {
         proxy_pass http://127.0.0.1:8888$http_path ;
      }
}

server{
      listen 8888;
      server_name myhost.com;
      location / {
          root  /vdata/qlive.qq.com/htdocs/;
      }
}

小结

云上的接入层配置应该会慢慢支持@开头的location配置,目前暂时先用这个小技巧解决nodejs同构服务端渲染的容灾需求,有什么更好的解决办法,欢迎评论区一起交流下。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 解决方案
  • 云上配置
  • 小结
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档