SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-10-15

GitHub能托管网站吗?Pages与VPS的区别

GitHub Pages只能提供HTML、CSS和JavaScript等静态文件,不能运行PHP或后端代码。本文说明静态托管与VPS的边界,以及表单和动态应用应如何部署。

GitHub 能托管您的网站吗?简要回答

GitHub 能托管您的网站吗?如果网站只是一个静态文件目录,可以通过 GitHub Pages 托管。如果网站需要在服务器上运行代码,则不能。GitHub 是 Git 仓库的托管平台,也提供围绕仓库的协作功能:问题、拉取请求、代码审查和权限管理。它会存储您的代码,但不会运行代码。

最后这句话正是所有困惑的根源,也让初学者浪费数周时间。项目位于 GitHub 上,代码就在眼前,测试也已通过,但网站仍未上线,表单也不会保存任何内容。下面的内容将详细解释这句话背后的原因。

GitHub 实际存储的内容

Git 是运行在您自己计算机上的版本控制工具。它会记录文件的每次变更,因此您可以恢复到任意早期状态,并查看谁修改了什么。存储库(repo)是一个项目及其完整历史记录。

GitHub 会在其服务器上保存该存储库的副本,并补充 Git 本身不具备的功能:用于查看代码的网页、用于跟踪工作的议题、用于提议变更的拉取请求,以及用于决定谁可以推送代码的权限控制。这就是该产品的核心。要了解更广泛的内容,请阅读GitHub 是什么以及人们用它做什么;如果您仍然容易混淆这两个名称,请参阅Git 与 GitHub 的区别,了解如何区分工具和服务。GitHub 也不是存放存储库的唯一选择,因为Gitea、Forgejo 及其他自托管 Git 服务器可以在您控制的硬件上完成相同的工作。

GitHub Pages 会提供什么,不会提供什么

GitHub Pages 会从存储库的一个分支获取文件,并将其发布到公共 URL。GitHub 的文档将其称为静态网站托管服务,可直接从存储库提供 HTML、CSS 和 JavaScript 文件。静态表示服务器会原样返回每个文件。它读取字节并发送这些字节。您编写的任何代码都不会在连接的 GitHub 一侧执行。

要启用它,请先推送文件,然后在 github.com 上打开存储库,进入 Settings,再打开 Pages 部分。选择要发布的分支和目录,可以选择存储库根目录或 /docs。

git init
git add index.html style.css
git commit -m "First version of the site"
git branch -M main
git remote add origin https://github.com/YOUR-NAME/YOUR-REPO.git
git push -u origin main

首次构建完成后,网站位于 https://YOUR-NAME.github.io/YOUR-REPO/。有一种存储库名称的行为不同:名为 YOUR-NAME.github.io 的存储库会发布到 https://YOUR-NAME.github.io/,URL 后面不带路径。如果 URL 返回内容为“There isn't a GitHub Pages site here.”的页面,说明构建尚未完成,或者 Pages 指向的分支或目录中没有 index.html。

下面通过一个示例说明这条规则。提交一个名为 save.php 的文件,并在其中写入任意 PHP 代码,然后请求该文件:

curl https://YOUR-NAME.github.io/YOUR-REPO/save.php

您会逐字符收到自己的 PHP 源代码。Pages 返回了该文件,因为它只负责返回文件。该 URL 背后没有 PHP 解释器,因此代码没有运行的位置。.py 文件的行为相同,其他语言也是如此。

为什么大学项目中的表单无法正常工作

保存数据的功能由两部分组成。浏览器端是 HTML 和 JavaScript,Pages 可以正常提供这部分内容。服务器端接收提交内容,并将其写入一个生命周期超过本次请求的位置。Pages 没有服务器端,因此,提交到 /save.php 的表单会到达一个文件服务器,而该服务器唯一的行为就是返回文件。任何内容都不会被写入,访问者只能看到空白页面,或在浏览器的网络面板中看到请求失败。

有两种常见的变通方法,但都存在需要了解的限制。将条目保存在 localStorage 中,只会将其存储在一台设备上的一个浏览器中。因此,教师打开同一个链接时会看到空列表,因为教师的浏览器使用的是独立存储。将数据库地址和密码写入 JavaScript 确实可以让页面正常工作,但也会公开该密码:Pages 提供的每个文件都可以被任何人下载,而且同一个文件还存在于公共仓库中。在后续提交中删除它也无法撤销这一点,因为更早的提交仍会在历史记录中保留该密码。

托管表单服务和后端平台可以填补这一空缺,对于课程项目来说,这是合理的选择。但应明确其含义:运行中的代码已经转移到其他人的服务器上。GitHub 仍然只是在存储源代码。

GitHub Actions 的用途是什么(如果它不负责托管)

Actions 是 CI,即持续集成。仓库发生事件时(例如 push 或 pull request),GitHub 会启动一台临时机器,在上面为您运行命令。

name: build
on: push
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-node@v7
        with:
          node-version: 24
      - run: npm ci
      - run: npm test

这台机器称为 runner。GitHub 会为此任务创建它,并在任务结束后销毁它。因此,npm start 的最后一个步骤不会托管任何内容。只要您的进程在前台运行,任务就会一直占用 runner。随后工作流达到时间限制,进程被终止。在此期间,互联网上的访问者无法访问该进程。步骤失败时,日志会以 Process completed with exit code 1 结尾;几秒后,这台机器也会被销毁。

Actions 真正擅长的是处理应用周边的工作。它可以构建网站所需的静态文件,运行 Vite 或 Jekyll 构建,并将输出发布到 Pages。它还会在每个 pull request 上运行测试,从而在变更合并前发现问题。此外,它可以连接到您拥有的服务器并在那里部署应用。下一节将介绍这一点。

适用于您可能构建的项目的判断标准

  • 作品集或简历网站,无论是手写还是使用静态网站生成器生成:可以。这正是 Pages 的适用场景。
  • 没有后端的 React 或 Vue 应用:可以。构建步骤会生成静态文件。请先将基础路径设置为 /YOUR-REPO/,否则构建后的页面会在域名根路径请求 /assets/index.js,但该路径不存在,浏览器控制台会充满 404 错误。
  • 项目文档,包括在构建时生成搜索索引的文档网站:可以。
  • 联系表单或任何需要存储记录的页面:不可以。必须有组件接收提交内容并保存记录。
  • 使用用户名和密码登录:不可以。验证密码需要运行访问者无法读取的代码,而 Pages 提供的每个文件都可被访问者读取。
  • 供移动应用调用的小型 API(应用程序编程接口):不可以。API 是持续运行并响应请求的程序,而 Pages 没有正在运行的程序。
  • 任何需要 API 密钥的功能,例如支付服务或 AI 模型:不可以,因为密钥会存放在整个互联网都能下载的文件中。
  • 按计划刷新的数据页面:有限度地可以。Actions 工作流可以每晚运行,获取数据,提交更新后的 JSON 文件,然后由 Pages 提供该文件。页面本身仍是静态的,数据的新旧程度取决于上次运行时间。

另一种方案:运行应用的服务器

项目需要运行代码的那一刻,就需要一台持续开机并运行代码的计算机。通常的选择是 VPS(虚拟专用服务器):租用一台物理机的一部分资源,按月付费,拥有独立的 Linux 安装、独立的 IP 地址,以及供您使用的 root 访问权限。您的应用会作为服务运行,并在系统启动时自动启动;Nginx 等 Web 服务器在前端监听 80 和 443 端口,数据库则运行在同一台服务器上或另一台服务器上。VPS 入门介绍服务器本身,人们实际在 VPS 上运行的各种服务则帮助您了解其适用范围。

您的代码仓库无需迁移。GitHub 仍然是代码存放和代码审查的地方,服务器从中拉取代码。最简单的部署方式是在服务器上执行 git pull,然后重启服务。更进一步,可以使用 Actions 工作流:测试通过后,工作流通过 SSH(安全 Shell)连接服务器,并代您完成同样的操作。这就是 CI 与真实主机结合的方式。您需要接手的是 Pages 默默处理的部分:系统更新、防火墙、备份以及 TLS(传输层安全)证书。使用 Gunicorn 和 Nginx 部署 Django 的完整示例从头到尾展示了这种架构,托管服务与非托管服务的选择则决定了多少维护工作仍由您负责。

GitHub Pages 限制及查询位置

免费计划的限制数值会变化,因此应查看 GitHub 官方页面,不要盲信文章中的数值,包括本文中的数值。截至 September 2026,GitHub Pages 限制页面列出的已发布站点大小上限为 1 GB,软带宽限制为每月 100 GB。该页面还说明,经典构建路径的软限制为每小时 10 次构建。

同一页面还规定了一项比任何数值都更重要的规则。Pages 不适用于为在线业务或电子商务站点提供免费 Web 托管,且其中的站点不应处理密码或银行卡号等敏感交易。Actions 使用时长是单独的配额,公共仓库和私有仓库的计费方式不同;GitHub 在其 Actions 计费页面中对此进行了说明。在根据任一限制进行规划前,请先查看这两个页面。

FAQ

我可以在 GitHub Pages 上托管 Node.js 或 Python 应用吗?

不可以。Pages 会原样返回存储的文件,因此,为 Node 编写的 .js 文件或 .py 文件会以文本形式发送到浏览器,而不会被执行。使用 curl 请求它时,返回的是您自己的源代码。运行服务器端代码需要一台持续运行的机器,例如 VPS,或一个代您运行应用的平台。GitHub Actions 也无法填补这一空缺,因为作业结束后,其 runner 会立即被删除。

为什么我的 GitHub Pages 网站显示“There isn't a GitHub Pages site here.”?

当 URL 存在,但其下没有发布任何内容时,就会显示此页面。常见原因是构建尚未完成,或者 Pages 指向的分支或文件夹中没有 index.html。打开 Settings,然后打开 Pages,确认选中的分支和文件夹。确认文件名使用小写的 index.html,因为 URL 区分大小写。如果工作流负责构建网站,请确认最近一次运行已成功完成。

GitHub Pages 网站可以将数据保存到数据库吗?

不能单独完成。页面可以在浏览器中通过 JavaScript 调用外部服务,许多学生确实这样做;但该服务的凭据会存放在任何人都能从公开仓库下载的文件中。数据重要时,应让连接数据库的代码运行在您控制的服务器上,同时将仓库保留在 GitHub 上。

GitHub Pages 足以托管作品集网站吗?

可以。作品集属于静态内容,这是 Pages 最适合处理的场景。您可以获得一个启用 HTTPS 的公网 URL,并在每次推送后重新构建。自定义域名也可以使用:将 DNS 记录指向 GitHub,然后在 Pages 设置中配置该域名。只有在添加了必须运行的功能后,才需要迁移到服务器,例如用于保存收到消息的联系表单。