现在每个前端项目,都要弄个 nginx 容器,把 dist 放进去,我想到一个用 oss 部署静态网站的方案
1 、k8s 创建一个 Service ,类型为 ExternalName ,把 oss-data 指向 oss 的地址,我用的是腾讯 cos ,地址就是 nginx-static-xxxx.cos.ap-shanghai.myqcloud.com ,这个 bucket 设置为公有读私有写
2 、把 dist 目录上传到 nginx-static-xxxx/test/目录下
3 、创建一个 ingress 规则,把 oss-data 的 80 端口映射为一个域名 test.mydomain.com ,如下
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^/$ /index.html redirect;
nginx.ingress.kubernetes.io/rewrite-target: /test/$1
nginx.ingress.kubernetes.io/upstream-vhost: nginx-static-xxxx.cos.ap-shanghai.myqcloud.com
name: www
namespace: test
spec:
ingressClassName: nginx
rules:
- host: test.mydomain.com
http:
paths:
- backend:
service:
name: oss-data
port:
number: 80
path: /(.*)
pathType: Prefix
就是用户访问 test.domain.com/index.html ,会转发到后端的 oss-data/test/index.html ,传给 cos 的则是 nginx-static-xxxx.cos.ap-shanghai.myqcloud.com/test/index.html rewrite /$ 是为了保证访问 test.domain.com 的时候 cos 不会报告 404 错误
这样,以后,每次发布新项目,只需要把 dist 目录同步到 cos 这个 bucket 的某个目录中,然后创建一个 ingress 规则映射到新域名即可。
如果是全静态网站这种方案没有问题。但是对于 vue 的路由就有点问题,比如 url 里的路由信息,比如/login?...,在 vue 里会跳转,但是 ingress 把这个请求转到 cos 上,就会出现 404 。在 nginx 里,是使用 try_files 来保证直接/login 跳转到 index.html 的 。
但是在 ingress 里,try_files 和 rewrite 规则有些冲突,try_files 是查找本地文件,rewrite-target 是把数据传到后端服务,类似于(proxy_pass)的规则。
所以除了把/login 之类的特殊处理,是否还有其它方法?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.