Ubuntu 22.04 + Nginx 部署单文件 2048:一次不依赖构建工具的静态站点实践

举报
yd_291384559 发表于 2026/10/21 18:49:03 2026/10/21
【摘要】 用一个纯单文件 2048 做例子,记录从目录权限、Nginx 配置、安全组放行到 curl 验证的完整部署过程,并给出 403/404 的排查思路。

为什么用单文件做静态站点

2048 是一个很适合练手的静态页面:规则简单、交互明确,而且完全可以写成一个 index.html,把 CSS 和 JavaScript 全部内联,不依赖 npm、Vite 或任何构建工具。这样部署时只需要一个文件,特别适合用来验证“云服务器 + Nginx + 安全组”这条最基础的静态站点链路。

本文用一个纯单文件的 2048 做例子,记录在 Ubuntu 22.04 上把页面托管到 Nginx 的完整过程。页面本身已在本地浏览器中验证过方向键、WASD、合并计分和最高分记录;下面重点讲部署和排错。

环境与前提

  • 一台 Ubuntu 22.04 的云服务器,已绑定弹性公网 IP,能通过 SSH 登录。
  • 服务器上已安装 Nginx;没有的话执行 sudo apt update && sudo apt install -y nginx。
  • 云平台安全组放行 TCP 80;SSH 22 只对你的出口 IP 放行,不要图省事开放 0.0.0.0/0。
  • 下面的命令默认用有 sudo 权限的普通用户执行。

第一步:准备站点目录

不要把网站文件放在 /root 或当前用户的家目录里。Nginx 的 worker 进程通常以 www-data 身份运行,家目录权限过严会导致 403。使用标准的 /var/www 目录:

sudo mkdir -p /var/www/2048
sudo chown -R "$USER":"$USER" /var/www/2048
sudo chmod 755 /var/www /var/www/2048

把准备好的 index.html 上传到 /var/www/2048/index.html。可以用 scp,也可以直接在服务器上创建:

scp index.html ubuntu@<服务器公网IP>:/var/www/2048/index.html
ssh ubuntu@<服务器公网IP> "ls -l /var/www/2048/index.html"

这个 2048 的核心逻辑集中在一次滑动合并里,思路是把一行数字压紧、相邻相同就合并,再补零:

function slideLine(line) {
  const values = line.filter(Boolean);
  const result = [];
  let gained = 0;
  for (let i = 0; i < values.length; i++) {
    if (values[i] === values[i + 1]) {
      const merged = values[i] * 2;
      result.push(merged);
      gained += merged;
      i++;
    } else {
      result.push(values[i]);
    }
  }
  while (result.length < 4) result.push(0);
  return { result, gained };
}

四个方向只需要把行或列取出、按方向反转后复用同一个函数,再把结果写回棋盘。完整页面就是一个 HTML 文件,没有额外的静态资源请求。

第二步:配置 Nginx

Ubuntu 的 Nginx 默认使用 sites-available / sites-enabled 结构。新建一个站点配置:

sudo tee /etc/nginx/sites-available/2048 > /dev/null <<'EOF'
server {
    listen 80;
    server_name <你的公网IP>;

    root /var/www/2048;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    access_log /var/log/nginx/2048.access.log;
    error_log  /var/log/nginx/2048.error.log;
}
EOF

把 <你的公网IP> 换成服务器的弹性公网 IP。启用站点并检查配置:

sudo ln -sf /etc/nginx/sites-available/2048 /etc/nginx/sites-enabled/2048
sudo nginx -t
sudo systemctl reload nginx

如果 nginx -t 提示默认站点已经占用了 default_server,可以移除默认站点,或者不要写 default_server,直接用公网 IP 作为 server_name 来匹配请求。

第三步:放行安全组和系统防火墙

云服务器上“服务起来了但公网访问不了”,最常见的原因是安全组。控制台入方向规则至少需要:

  • TCP 80,源地址 0.0.0.0/0(静态站点对公网开放)。
  • TCP 22,源地址只填自己的出口 IP/32,用于 SSH 维护。

如果系统启用了 ufw,还要在系统层面放行:

sudo ufw status
sudo ufw allow 80/tcp
sudo ufw allow from <你的出口IP> to any port 22 proto tcp

不需要为了这次部署额外购买负载均衡、域名或证书;用公网 IP 直接访问即可。若后续要绑定域名并启用 HTTPS,再考虑证书和备案问题。

第四步:验证

先在服务器本机验证 Nginx 是否真的在监听 80:

ss -lntp | grep ':80'
curl -I http://127.0.0.1/

然后从公网验证:

curl -I http://<你的公网IP>/
curl -s http://<你的公网IP>/ | head -n 5

期望看到 HTTP/1.1 200 OK 和页面的 HTML 开头。浏览器打开公网 IP,方向键或 WASD 能移动方块、相同数字能合并、得分会增加,就说明静态站点链路已经通了。

常见问题

403 Forbidden

通常是权限问题。Nginx 需要对路径有执行权限、对文件有读权限:

namei -l /var/www/2048/index.html
sudo chmod 755 /var/www /var/www/2048
sudo chmod 644 /var/www/2048/index.html

如果站点目录在 /root 或 /home/xxx 下,父目录的 700 权限会直接把 www-data 挡在外面,建议直接迁到 /var/www。

404 Not Found

先确认 root 指向的目录和文件真实存在,再看实际生效的配置:

sudo nginx -T | grep -n "root\|server_name"
ls -l /var/www/2048/index.html

改完配置一定要先 sudo nginx -t 再 reload,避免把错误配置带上线。

连接超时或 Connection refused

按“安全组 → 系统防火墙 → 服务监听”的顺序排查:控制台入方向是否有 80、ufw status 是否放行、ss -lntp 是否有进程监听 80。三者缺一不可。

清理

如果只是做实验,验证完可以按下面的顺序移除站点,避免留下无用的配置和目录:

sudo rm -f /etc/nginx/sites-enabled/2048
sudo rm -f /etc/nginx/sites-available/2048
sudo nginx -t && sudo systemctl reload nginx
sudo rm -rf /var/www/2048

如果服务器是临时实验环境,记得在云控制台释放 ECS 和弹性公网 IP;如果是自己的长期服务器,只删除站点配置即可,不必动系统自带的 Nginx。

小结

单文件静态页面的部署链路很短:目录权限、Nginx 的 root 与 try_files、安全组 80、最后用 curl -I 做一次端到端验证。把这条链路跑通之后,再上域名、HTTPS、缓存和 gzip 都是在这个基础上叠加。对于 2048 这类纯前端小游戏,一台 1 核 1G 的服务器已经足够,重点是把权限和网络入口收窄到最小。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。