在华为云 AI 开发者空间用 Nginx 部署静态站点,并用隧道映射到公网
为什么要在 DevSpace 里跑 nginx
AI 开发者空间(DevSpace)本质上是一台带 Web 终端的 Linux 容器,能装包、能起进程、能开端口。 把静态站点放进去,最省事的做法就是 nginx 反向托管一个目录 —— 不写后端、不用构建工具,改完文件 reload 一下就能看到效果。
下面这套流程我在华为云的 DevSpace 里完整跑通过一次,最终得到一个公网可访问的地址,并用状态码、标题、内容 md5 三重校验确认了"页面上线"这件事是真的。
第一步:确认容器环境
uname -a
cat /etc/os-release | head -3
which nginx || echo "nginx 未安装"
容器里通常没有 nginx,先装:
# Debian/Ubuntu 系
sudo apt-get update && sudo apt-get install -y nginx
# 确认版本与默认站点
nginx -v
ls /etc/nginx/conf.d/
装完之后 nginx 一般会自己起在 80 端口。建议先改到自己要用的端口,避免和容器里已有服务冲突。
第二步:准备站点目录
mkdir -p /workspace/site
cat > /workspace/site/index.html <<'EOF'
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>DevSpace 静态站点</title>
</head>
<body>
<h1>Hello from DevSpace</h1>
</body>
</html>
EOF
关键点:目录要放在容器内持久化的位置(一般是 /workspace),不要放在 /tmp 或家目录下的临时路径,否则容器重建后站点就没了。
第三步:配置 server 块
cat | sudo tee /etc/nginx/conf.d/site.conf <<'EOF'
server {
listen 8080;
server_name _;
root /workspace/site;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
EOF
# 语法检查 + 生效
sudo nginx -t
sudo nginx -s reload
nginx -t 这一步不要省。它能在 reload 之前把语法错误直接指到行号,比 reload 之后发现服务挂了要好得多。
本机验证:
curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/
返回 200 说明 nginx 这一层已经通了,问题(如果有)就只剩端口对外暴露。
第四步:把容器端口映射到公网
DevSpace 提供了隧道能力,可以把容器里的某个端口映射成一个公网 HTTPS 地址。在控制台里为目标端口创建一条隧道后,会拿到类似 https://xxxx-8080.tunnel.example.com 的地址。
拿到地址之后第一件事是自测,而不是直接发给别人:
URL="https://xxxx-8080.tunnel.example.com"
curl -sS -o /dev/null -w "status=%{http_code} time=%{time_total}s\n" "$URL"
curl -sS "$URL" | grep -o "<title>.*</title>"
第五步:用 md5 证明"看到的就是我放的那份"
状态码 200 只能说明有响应,不能说明内容对。真正可靠的校验是比哈希:
# 本地文件的 md5
md5sum /workspace/site/index.html
# 线上内容的 md5
curl -sS "$URL" | md5sum
两个 md5 一致,才算"部署成功"。这一步在多环境、有 CDN、有缓存的场景里尤其值得做 —— 它能立刻区分"配置错了"和"缓存没刷新"。
四个亲测踩过的坑
- 端口选到已被占用的:容器里可能已经有服务监听 80。用
ss -lntp看一眼,再决定 nginx listen 哪个端口。 - 隧道有效期内没人管:隧道是有生命周期的,到期或控制台重启后映射会失效,表现为公网 404 而容器里
curl 127.0.0.1依然 200。先分层排查,别一上来就怀疑 nginx 配置。 - root 指向挂载点之外:
root路径写错一个字符,nginx 返回的是 403 或 404,而不是报错。用nginx -T打印最终生效配置核对路径最稳。 - 只在浏览器里 Ctrl+F5:浏览器缓存会让"改了没生效"看起来像部署失败。先
curl拿到原始响应,再谈缓存。
小结
整套下来只有四件事:装 nginx、放文件、配 server 块、映射端口。真正决定成功率的不是命令本身,而是分层验证:先在容器内 curl 本机端口,再 curl 隧道地址,最后比对 md5。每一层都有明确的判断依据,出问题就能立刻定位到是哪一层断的。
- 点赞
- 收藏
- 关注作者
评论(0)