华为云 OBS 静态网站托管实战:从零搭建个人博客,附 7 个必踩的坑
华为云 OBS 静态网站托管实战:从零搭建个人博客,附 7 个必踩的坑
摘要:个人博客就是一堆静态文件,用 OBS 静态网站托管最省事。本文手把手走完建桶、上传、配置公共读、开启静态托管、绑定自定义域名与 HTTPS 的完整流程,并集中拆解"权限不级联、HTML 被强制下载、默认端点没有 HTTPS、缓存不刷新"等 7 个高频坑点,帮你少走弯路。
一、为什么用 OBS 来"托管"个人博客
个人博客本质是"一堆静态文件":HTML、CSS、JavaScript 和图片。它不需要数据库,也不需要后端逻辑。用云服务器 ECS 跑 Nginx 当然可以,但你会为"养一台机器"付出不少隐形成本:系统补丁、安全加固、带宽、以及 7×24 的运维。
华为云 OBS(对象存储服务)的"静态网站托管"把这些都省了:
- 不需要服务器,上传文件即上线;
- 按实际用量付费(存储 + 请求 + 流量),没有闲置成本;
- 天生高可用、可弹性扩容,不怕突发流量;
- 配合 CDN 后,访问速度与 HTTPS 一步到位。
代价是:OBS 的默认端点不是一个完整的网站托管服务,它有几个反直觉的限制,新手最容易在这里踩坑。本文先把完整流程走一遍,再集中讲坑。
二、动手前的准备
- 一个已完成实名认证的华为云账号;
- 本地准备好站点文件,最简单的就是
index.html,进阶可用 Hexo / Hugo 生成的静态站点; - 一个已备案的域名(可选,但强烈建议)。国内区域绑定自定义域名需要完成 ICP 备案。
提示:如果只是想先体验,可以跳过域名,用 OBS 提供的默认域名访问;但它有几个限制(见第八节),不适合长期对外发布。
三、Step 1:创建存储桶(Bucket)
登录华为云控制台 → 对象存储服务 OBS → 创建桶。
要点:
- 区域(Region):选离你和你读者都近的区域,例如
cn-north-4(华北-北京四)。区域创建后不可更改。 - 桶名称:全局唯一(全球 OBS 用户共用命名空间),只能用小写字母、数字和连字符,3~63 个字符,不能以连字符开头或结尾,不能是 IP 形式。建议用
blogs-20261029这种带时间戳的名字。 - 存储类别:博客是访问频繁的小文件,选"标准"即可。
- 桶策略:先保持"私有",权限我们在 Step 3 单独、精确地放开。
【建议配图:创建桶页面,标注区域 / 桶名 / 存储类别】
四、Step 2:上传站点文件
进入桶 → 对象 → 上传对象,把 index.html、css/、js/、images/ 等全部传上去。
命令行方式(obsutil / KooCLI OBS 语法):
# 上传整个目录到桶根目录:-r 递归,-f 免交互,-flat 不保留本地目录名前缀
hcloud OBS cp dist/ obs://blogs-20261029/ -r -f -flat
两个容易吃亏的细节:
- 目录上传会带上前缀:不加
-flat时,dist/index.html会上传成blogs-20261029/dist/index.html,导致首页 404。用-flat,或先预览键名再传。 - 必须加
-f:否则大批量上传或覆盖时会卡在Please input (y/n)的交互提示上,脚本和自动化场景会直接挂起。
上传完成后,桶里的文件应位于根目录,即 index.html 在 obs://blogs-20261029/index.html。
五、Step 3:把内容设为"匿名可读"(桶级 + 对象级)
这是第一个大坑:桶的 ACL 不会级联到对象。
如果你只把桶设置成公共读,浏览器访问 index.html 仍会得到 403 AccessDenied。OBS 的权限是三层结构(IAM > 桶策略 > ACL,最严格者生效),并且对象拥有自己独立的 ACL。
所以两层都要做:
# 1) 桶级
hcloud OBS chattri obs://blogs-20261029 -acl=public-read
# 2) 对象级(对象 ACL 不会继承桶 ACL,必须单独设置)
hcloud OBS chattri obs://blogs-20261029/ -r -f -acl=public-read
控制台做法:桶 → 权限管理 → 桶 ACL 设为"公共读";再全选对象 → 对象 ACL 设为"公共读"。
安全提醒:public-read 意味着任何拿到链接的人都能读取文件。博客这种本就公开的内容没问题,但千万不要把存放敏感数据的桶设为公共读。
六、Step 4:开启静态网站托管
桶 → 基础配置 → 静态网站托管 → 配置:
- 默认首页(IndexDocument):填
index.html。 - 默认错误页(ErrorDocument):填
404.html;如果是 SPA(Vue Router / React Router),错误页也填index.html,让前端路由接管。
保存后,OBS 会给你一个静态网站托管访问域名:
http://<桶名>.obs-website.<区域>.myhuaweicloud.com
例如:http://blogs-20261029.obs-website.cn-north-4.myhuaweicloud.com
注意:这个 obs-website 域名和普通对象域名 https://<桶名>.obs.<区域>.myhuaweicloud.com 是两个不同的域名,用途不同——前者用于网站访问,后者用于直接取对象。
【建议配图:静态网站托管配置页,标注默认首页 / 错误页】
七、Step 5:验证访问
curl -I http://blogs-20261029.obs-website.cn-north-4.myhuaweicloud.com/index.html
一个常见的"诈尸"现象:刚配置完用网站域名访问会返回 404 NoSuchWebsiteConfiguration。这不是配置失败,而是网站端点有约 1 分钟的最终一致性延迟。可以先用对象地址 https://<桶名>.obs.<区域>.myhuaweicloud.com/index.html 确认文件本身没问题,再轮询网站域名直到返回 200。
八、Step 6:自定义域名 + HTTPS(这一步几乎绕不开)
如果你真要把博客对外发布,只靠 OBS 默认域名是不够的,原因有三:
- 默认静态托管端点不支持 HTTPS,只有 HTTP,浏览器会提示"不安全",对 SEO 也不友好;
- 2022 年 1 月 1 日之后创建的桶,通过 OBS 端点访问 HTML 会被强制注入
Content-Disposition: attachment——结果是浏览器直接下载页面,而不是渲染。这是 OBS 的策略行为,和对象元数据无关,网站端点和对象端点都躲不掉; - 默认域名难记,也不利于品牌。
所以推荐路径是:自定义域名 + 华为云 CDN 加速。CDN 一次性解决 HTTPS、渲染(inline 响应头)和缓存加速三个问题。
操作步骤(以控制台为例,菜单名称以实际界面为准):
-
域名备案:绑定国内节点的域名需要完成 ICP 备案。
-
进入 CDN 控制台 → 域名管理 → 添加域名:
- 加速域名:
blog.example.com; - 源站类型:选择 OBS 桶域名(回源到你的静态网站托管域名);
- 配置 CNAME:把域名解析 CNAME 指向 CDN 分配给你的加速域名。
- 加速域名:
-
配置 HTTPS:在 CDN 域名管理中开启 HTTPS,选择华为云证书管理服务(CCM)里已签发的证书(可用免费证书)。
-
关键一步——加响应头让 HTML 在线渲染:CDN 域名管理 → 高级设置 → HTTP header 配置,添加响应头:
Content-Disposition: inline这一步正是上面第 2 条"网页被下载"的官方解法。
-
回到 OBS,把自定义域名也绑定到桶(桶 → 域名管理 → 自定义域名),保持一致。
完成后访问 https://blog.example.com,应该看到正常渲染的博客首页,地址栏出现锁头图标。
九、7 个高频坑与解法(速查)
| # | 现象 | 根因 | 解法 |
|---|---|---|---|
| 1 | 访问对象返回 403 AccessDenied | 只设了桶 ACL,对象 ACL 仍为私有;ACL 不级联 | 桶级 + 对象级都设 public-read |
| 2 | 首页 404 / 路径多一层目录名 | 目录上传保留了本地文件夹前缀 | 上传加 -flat,先 -dryRun 预览键名 |
| 3 | 刚配置完访问网站域名返回 404 | 网站端点最终一致,约 1 分钟 | 等一会,先用对象地址验证文件 |
| 4 | 浏览器直接下载 HTML 而不是打开 | 2022 年后创建的桶被强制加 Content-Disposition: attachment |
绑定自定义域名 + CDN,配置响应头 Content-Disposition: inline |
| 5 | 地址栏没有 HTTPS / 提示不安全 | OBS 默认静态托管端点不支持 HTTPS | 自定义域名 + CDN 配置证书 |
| 6 | 更新文件后浏览器仍是旧页面 | CDN / 浏览器缓存未失效 | CDN 刷新缓存,或给资源加 ?v=版本号 |
| 7 | 上传脚本卡住不动 | obsutil 遇覆盖或批量操作会交互询问 | 命令一律加 -f,如 cp ... -f |
十、成本与安全建议
成本:OBS 按存储容量、请求次数和公网流出流量计费。个人博客文件通常很小,存储费几乎可以忽略,主要的钱花在下行流量上。加上 CDN 后流量走 CDN,通常更省也更快,但 CDN 有独立计费,建议在费用中心设置预算告警。
安全:
- 只对确实需要公开的内容设置
public-read; - 全程使用 HTTPS,避免内容被篡改;
- AK/SK 属于账号级凭据,绝不写进前端代码或桶策略,建议用 IAM 子用户并最小授权;
- 可开启桶访问日志,便于审计。
十一、小结
用 OBS 静态网站托管个人博客,本质上是"把运维成本换成对产品限制的理解成本"。流程并不复杂:建桶 → 传文件 → 桶与对象双层公共读 → 开静态托管 → 自定义域名 + CDN 上 HTTPS 与 inline 头。真正绊住人的,几乎都是第八、九节那几个反直觉的限制。
如果正要开工,记住一条排障顺序:先用对象地址确认文件没问题,再用网站域名确认托管配置,最后用自定义域名跑通 HTTPS 与渲染。一层层排,问题就永远在你脚下。
- 点赞
- 收藏
- 关注作者
评论(0)