+86 189 8218 1436 周一至五 10:00-22:00

部署静态网站到 GCP Cloud Storage 小白教程

TL;DR:用 GCP Cloud Storage 托管静态网站,不用 VM 和 SSH;跟着创建存储桶、上传文件、开放读取并验证页面。

开始前你需要准备

做部署静态网站到 GCP Cloud Storage前,备齐这几样,后面点鼠标就行。

先有可登录的 GCP 账号、已建项目和结算账号。没绑结算,桶根本建不出来,这是最常见的坑。费用很少,但去结算里设个 10 元预算提醒更安心,免得忘删大文件。

  • 文件:index.html、404.html、CSS、JS、图片。坑:首页必须叫 index.html,Index.html 会 404;先理好 css/ 目录,传后原样保留。
  • 权限:要能建桶、传对象、设 IAM。自建项目自带 Owner 最稳;公司账号先要「Storage Admin」,否则半路 403 会懵。
  • 工具可选:本文以控制台为主,不装也行。想批量传再装 gcloud,先跑下面两行验环境,别直接 cp 传错桶:
gcloud --version || echo "未安装可跳过"
gsutil help cp || echo "批量用法稍后查"

定心丸:不用 VM、不用 SSH、不配 Linux 服务器,别搜 Nginx。只有绑自家域名才多备 DNS 管理权限,默认地址练手可跳过。

整体思路

部署静态网站到 GCP Cloud Storage,说白了就是放一堆固定文件:index.html、CSS、图片、JS。Cloud Storage 不跑程序,只把文件当对象存进“桶”,再用公开网址给浏览器读取。整体按这个顺序最稳:创建存储桶、上传文件、设置主页和错误页、开放读取权限、用官方默认地址验证。先跑通官方默认地址(它自带 https),再考虑自定义域名、给域名配 HTTPS、缓存和访问日志;全程不用维护服务器。

为什么这样?首页和 404 页只是告诉 Cloud Storage“目录该拿哪个对象”,不是服务器路由;公开权限只给读,不给写。小白常踩的坑是桶名全球唯一,别照抄示例或用中文空格;首页没放桶根目录;忘记处理公开访问阻止。下面命令假设已装 Cloud SDK 并登录选过项目,可整段复制执行:

P=$(gcloud config get-value project 2>/dev/null); B=gcpok-$P-$(date +%s); echo '<h1>Hi</h1>' > index.html; echo 404 > 404.html; gsutil mb -l asia-east1 gs://$B; gsutil cp index.html 404.html gs://$B/; gsutil web set -m index.html -e 404.html gs://$B; gsutil pap set unspecified gs://$B; gsutil iam ch allUsers:objectViewer gs://$B; echo https://storage.googleapis.com/$B/index.html

打开输出的网址能看到 Hi 就算通。之后要换自己的域名,再补证书、缓存和日志。安全边界要清楚:桶里只放可公开内容,绝不放密钥、私钥、数据库备份或后台脚本。

详细步骤一:创建存储桶和整理文件

进 GCP 控制台,点「Cloud Storage > 存储桶 > 创建」。先核对项目别选错,再填全球唯一桶名,如 gcpok-com-2024;重名会报错,第一坑。

区域就近挑(国内选 asia-east1),存储类别选 Standard:读多写少,够用了。访问控制勾统一存储桶级访问,免得逐文件改权限。「强制禁止公开访问」别勾(除非组织策略要求),后面要给 allUsers 只读,勾了谁都打不开。

本地摆整齐,直接执行:

mkdir -p css js images && touch index.html

index.html 留根目录,CSS、JS、图片进子目录;页面尽量用相对路径如 ./css/style.css,别写 C:... 或带域名绝对路径——本地正常、一传全裂,也是坑。传了才对得上。

详细步骤二:上传文件并配置网站入口

想顺利部署静态网站到 GCP Cloud Storage,这步最关键。打开存储桶,把 index.html、404.html 和 css、图片等资源文件直接拖进上传区。小白常图省事只传 zip,或把文件全平铺:桶不会自动解压,也不猜相对路径,务必保持本地目录层级,否则首页空白、样式全丢。

文件多别点到手酸,换成自己的路径后批量传:

gcloud storage cp -r ./网站目录/* gs://你的存储桶名

再配入口:在「网站配置」填主页面 index.html、错误页 404.html。访问根路径才会自动开首页,输错地址也有友好提示,而不是冷冰冰的 XML 报错。控制台找不到入口(界面改版常有)就用命令补,老工具也行:

gcloud storage buckets update gs://你的存储桶名 --web-main-page-suffix=index.html --web-error-page=404.html
gsutil web set -m index.html -e 404.html gs://你的存储桶名

最后最易忘:文件默认私有。在「权限」加 allUsers,角色只选 Storage Object Viewer。别顺手勾写入或管理权限,只给读取就够——既让网友看得到,又防陌生人乱改内容。为啥这么小心?公开桶一旦能写,分分钟被塞垃圾。稍等十几秒,用分配的地址试开吧。

详细步骤三:设置访问地址与可选域名

先用 https://storage.googleapis.com/你的存储桶名/index.html 访问,这是自带证书、最稳妥的 HTTPS 默认地址,不会弹「不安全」。

设过「网站主页面」后,也可用 http://你的存储桶名.storage.googleapis.com/,根目录自动返回 index.html。它是 HTTP,别误以为有证书,提示不安全属正常。

绑域名有坑:桶名通常要和域名一致,否则不认。加 CNAME 把 www 指向 c.storage.googleapis.com 即可,但这只走 HTTP;要 HTTPS 请配「负载均衡 + 托管证书」,别给 CNAME 直接套 SSL。

再设缓存,免得改完看不到新版。整段复制进 Cloud Shell,按提示输桶名即可:

read -p "输入你的桶名并回车: " BUCKET
gsutil setmeta -h "Cache-Control:no-cache, max-age=300" "gs://${BUCKET}/index.html"
gsutil setmeta -h "Cache-Control:public, max-age=31536000" "gs://${BUCKET}/**/*.css" "gs://${BUCKET}/**/*.png"

HTML 是入口,短缓存才看得到更新;图片和 CSS 不常变,长缓存更快。若仍是旧页,别狂刷新,换新文件名(如 style.v2.css)或清浏览器缓存即可。

验证结果

先别急着改代码,按“访客视角”走一遍。用浏览器打开静态网站入口,或 https://storage.googleapis.com/桶名/index.html 这类 HTTPS 默认地址;首页能显示后,链接、图片、CSS、JS 都正常才算数。按 F12 看 Network,没有红色 404/403 才算完整。这样做是因为首页成功不代表资源路径正确,大小写、浏览器缓存和把 index.html 写进目录,都是小白常踩的坑。

read -r -p "请输入静态网站入口根地址(不要带 index.html):" SITE_URL
SITE_URL="${SITE_URL%/}"
curl -I "$SITE_URL/"
curl -I "$SITE_URL/__not_exist_check__/"
read -r -p "粘贴 Network 里任意一个 CSS/JS/图片地址:" ASSET_URL
curl -I "$ASSET_URL"

第一条应看到状态码 200 和 Content-Type: text/html;资源也应是 200,类型像 text/css、text/javascript 或 image/...。响应头能快速看出服务器说法;类型若是 application/octet-stream,多半上传时没带对。用静态网站入口加 /__not_exist_check__/ 应显示 404.html;命令里它返回 404 也正常。用无痕窗口或未登录账号确认访客无需登录,应直接看到首页;跳出 Google 登录就是权限没放对。到控制台“存储桶→权限”确认 allUsers 只有读取,没有公开写入或管理权限,否则别人可能改你的站。

read -r -p "请输入绑定域名,如 www.example.com;没绑定直接回车:" DOMAIN
if [ -n "$DOMAIN" ]; then
  nslookup "$DOMAIN"
  curl -I "http://$DOMAIN"
  curl -IL "https://$DOMAIN"
fi

如果绑了域名,还要确认 DNS 解析指到负载均衡或 CNAME、GCP 控制台证书状态为可用、浏览器小锁不报不安全;http 最好 301/308 跳到 https,自定义地址最终也能打开。DNS 未生效、证书还在创建、只配了根域名没配 www,都容易让你误以为部署失败。

常见坑与解决办法

部署静态网站到 GCP Cloud Storage 出错别慌,按六条查。先把桶名 my-site-123 换成自己的,下面两行能直接复制执行:

gsutil iam ch allUsers:objectViewer gs://my-site-123
gsutil -h "Content-Type:text/html" cp index.html gs://my-site-123/
  • 403 / 404:多半是对象没公开、Index.html 大小写不符或路径写错。跑第一行补 allUsers 权限,并确认主页真叫 index.html;权限没生效,刷新再多次也白搭。
  • 显示源码或被下载:扩展名或 Content-Type 不对,跑第二行重传;要从 https://storage.googleapis.com/ 网页地址打开,别点控制台里的对象链接,那个常触发下载。
  • 自定义域名 HTTPS 报错:原生 CNAME 不托管证书。先用默认 HTTPS 地址验证,要绑自己的域名得改走负载均衡配证书。
  • 组织策略拦住公开:公司账号常开「公开访问防护」,自己改不动,找管理员调;急用就改私有对象加签名网址。
  • 改了文件却没变化:不是没传成功,是缓存。等传播、按 Ctrl+F5 清浏览器缓存,给 CSS/JS 加 ?v=2 版本号强制拉新。
  • 费用异常:查对象容量、出站流量和请求次数,设预算提醒与生命周期规则删旧版;图片被外链刷流量最容易被忽略。

常见问题(FAQ)

部署静态网站到 GCP Cloud Storage 需要 VM 吗?

不需要。它用对象存储托管文件,免装 Linux、免 SSH,也不用维护服务器。

可以用自己的域名并启用 HTTPS 吗?

可以,但建议用负载均衡和托管证书;CNAME 直连通常只适合 HTTP 验证。

网站文件会被所有人看到吗?

公开读取的对象会。只上传可公开内容,密钥、备份和后台文件不要放进存储桶。

为什么访问首页还是 403?

多半是对象未授权给 allUsers,或组织策略阻止公开访问;先查权限再查路径。

适合动态网站吗?

不适合。PHP、数据库和登录态需要后端;静态页面可配合 API 使用。

不想自己折腾 GCP?我们提供云平台代维护、上云迁移与账单代付服务,一对一技术支持。

查看代维服务 →

发表评论