目前所有静态资源除了 html 已上传到 OSS,并做了 CDN,有个疑问:如何去访问 HTML 文件
两个本质上还是远程访问的形式,或者有没有其他更好的方式
1
anyxchachapoly 2021-08-31 00:51:40 +08:00
我没看懂这和 k8s 有啥子关系,
还有, ”有没有更好的方式“ 这 depends on 需求啊 |
2
ss098 2021-08-31 00:53:07 +08:00
为什么要把 HTML 资源留在 K8S 上,一起传到 CDN 上啊。
|
4
ss098 2021-08-31 01:23:58 +08:00
现在你用反向代理解决的话(很有可能实际上)也是禁用缓存,放在 CDN 上速度不会更差的。
|
5
sekfung OP @ss098 #4 这样的话,源站域名还得 proxy_pass 一次 CDN,中间还涉及 TLS 连接,首页渲染相对来说会比较慢吧,这样真的会比较好吗?
|
6
yompc 2021-08-31 01:36:39 +08:00 via iPhone
我静态资源和 html 全部放到容器里面,然后设置除了 /api 路径不缓存其他全部缓存,更新前端的时候用 API 调用 CDN 提供商的接口清除 CDN 缓存
|
7
sekfung OP @anyxchachapoly #1 是没太大联系,主要是不知道 代理和前端项目 在不同 pod 之间,如何去访问
|
8
snachx 2021-08-31 01:40:08 +08:00 via iPhone
如果是单页应用或者真实 html 比较少情况,一般设置 html 文件不缓存,这样重新 build 之后浏览器能及时获得最新的资源
既然不缓存,你放固定数据中心就看用户到数据中心的网络状况,放 cdn 就看 cdn 回源 oss 的网络状况,一般用同一家 cdn 和 oss 的话,还是 cdn 总体来说更优吧 |
10
snachx 2021-08-31 01:45:15 +08:00 via iPhone
@sekfung 没太明白你说的代理和前端项目在不同 pod 之间如何访问的意思,抛开 cdn 不谈,你前端项目难道不是 webpack 编译过之后扔一个 nginx pod 里面吗?为什么还要 node server 呢
|
11
sekfung OP @snachx nginx pod 是独立的,换句话说我并不会为每个每个前端项目都启动一个 nginx pod,或者是扔到 nginx pod 挂载的 volume
|
12
snachx 2021-08-31 01:59:20 +08:00 via iPhone
@sekfung 一个前端一个 nginx pod 是挺常见的做法吧,反正对外都是 ingress 来转,一个 nginx 也就占一点点资源,代码推送自动编译构建成镜像触发重新部署就更新了
|
13
raptium 2021-08-31 07:10:44 +08:00 via iPhone
html 也传到 oss,设置 header 不让缓存,这就可以了吧。
|
14
kinboy 2021-08-31 07:53:07 +08:00 via Android
前端有什么使用 K8S 的必要性 2 吗?还是为了使用而使用?
|
15
Ariver 2021-08-31 08:03:46 +08:00
我们先不谈 k8s,就说部署的时候,前端项目是应该部署到一个 node 环境中去,还是一个 nginx 中。
|
16
steptodream 2021-08-31 08:08:59 +08:00
热炒一个概念 然后其他人干啥都使劲往上靠 就像热门词内卷一样
|
17
chendy 2021-08-31 08:25:54 +08:00
全部 oss+cdn,对 html 配置不缓存
|
18
eudore 2021-08-31 08:39:46 +08:00
ci 将前端项目源码编程成 dist,将 dist 放到 nginx 基础镜像编译项目镜像,镜像发布就完事了。在 html 里面直接写 cdn 的地址,cdn 回源配置 oss,静态资源使用 ossbrowser 直接上传进去。
关于 nodeserver 方式,非必要不推荐,nodeserver 和 dist 的镜像体积、资源消耗、启动速度都是天壤之别,dist+nginx 方式快速启动 超低资源消耗。 |
19
yangyaofei 2021-08-31 08:45:29 +08:00 via Android
@eudore 直接放 volume 里面和后端放一起,nginx 都省了
|
20
cheng6563 2021-08-31 09:22:22 +08:00
我司是直接把 HTML 丢到个 alpine 镜像里存着。
部署 pod 时用一个 initContainers 把文件复制到 nginx 的页面目录去 |
21
arischow 2021-08-31 09:26:02 +08:00 via iPhone
nginx + s3fs pod
实际发布是 s3 copy 实际对外访问是通过 CDN |
22
liaoberlin 2021-08-31 09:35:02 +08:00
前端静态资源部署没必要上 k8s 的,应该打包完之后直接丢到静态资源服务器上(一台 /集群)且不缓存,然后再一份上传到 OSS, 然后域名访问静态资源服务器的 html 文件,html 中通过 CDN 访问其他的静态资源。 如果通过 nginx 二次 proxy_pass 到 CDN 的话,需要经过二次 DNS 解析,有时候慢的一逼
|
23
duan602728596 2021-08-31 09:35:28 +08:00
基本上是启动 node server 的方式,css 、部分 js 、图片等上传到 cdn 。
node server 不仅仅作为静态资源服务器,还要提供接口代理的能力,毕竟接口的提供方来自好几个部门,有一些跨域、http (项目是 https 的)的问题,全部交给 http-proxy 来解决。 |
24
Illusionary 2021-08-31 09:58:11 +08:00
我们是前端打包成镜像,跟后端一样部署到 k8s,没上什么 oss
|
25
shunia 2021-08-31 10:09:47 +08:00
资源都能上 cdn 了,那 html 文件的“工程化”是要做什么?为了什么目的?
|
26
fkdog 2021-08-31 11:09:02 +08:00
前端 index.html 需要 nginx 等工具进行配合的吧, 把 /*下的所有请求通过 try_files 都定向到 index.html 上, 这样就能让 js 进行动态路由.
如果没有 nginx 支持, 直接请求 url 可能会报 404 错误. 不知道现在 cdn 支不支持这类 try_files 操作, 如果支持的话, 那么其实没必要另外用 k8s 了. 虽然缓存可能会滞后一点, 但是也不是滞后的很长时间, 毕竟更新过程中如果用户已经打开了页面, 那么你及时刷新了 html, 但是这部分用户用的可能依然是旧版本, 意义并不是很大. 针对缓存这种情况, 最好是后端接口先发, 能兼容旧的前端请求. 这样能保证新旧版本用户都能正常使用. 其次如果你真的有实时刷新 html 缓存的需求, 其实一般的 cdn 服务商都有 api 接口刷新缓存的. |
27
duan602728596 2021-08-31 13:24:18 +08:00
前端项目使用 k8s 通过 CI/CD 来编译和部署项目,而且一旦线上发布的代码有问题,可以先及时回滚到旧版本,然后修复上线。
前端有一些文件,比如 web-worker 和 wasm 文件不适合上 cdn 。所以也不推荐 html 上 cdn 。 |
28
nicholasxuu 2021-08-31 13:24:43 +08:00
如果需要 nodejs 层,k8s 放 nodejs 服务。
如果前端不用 hashrouter,k8s 放 nginx 服务,因为 cdn 一般不能处理"复杂"路由的 proxy 。 如果前端用 hashrouter,没必要 k8s 了,全放 cdn 就行了。发布代码的时候调用 sdk 刷新一下 cdn 缓存。 |
29
markgor 2021-08-31 14:13:03 +08:00
OSS 开两个,
1 个资源文件 1 个 HTML,oss 开启 html,开启版本号管理。 静态的请求都是:CDN->OSS. API 的请求->api 网关(开跨域) |