业务上云后,不只是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 删除。