从零搭建个人网站的完整指南

很多人觉得搭一个属于自己的网站很难,其实核心只有三步:域名 → 服务器 → 部署文件。如果用免费托管,连服务器都能省掉。

这篇以你正在看的这个博客为例,把完整流程记一遍,包括我实际踩到的坑。

先想清楚:你需要哪种方案?

不是所有人都需要买服务器。先看这张对比,再决定往下走哪条路:

方案成本需要备案适合谁
云服务器 + Nginx域名 + 服务器,每年百元级需要(大陆服务器)想顺便练 Linux,以后可能跑后端
GitHub Pages免费不需要纯静态,不在意国内访问速度
Cloudflare Pages免费不需要纯静态,想要全球 CDN
对象存储 + CDN按流量算,通常每月几块钱需要(绑自有域名)静态站,但要国内速度

我选的是第一种,纯粹因为想借这个机会把 Linux 和 Nginx 练熟。如果你只想让站点尽快上线,直接跳到最后一节看免费托管。

第一步:准备域名

域名是网站的地址,比如 example.com。可以在阿里云、腾讯云、Cloudflare 等平台注册,.com 一般一年几十元。

两个容易忽略的点:

  • 必须实名认证。国内注册商买的域名不做实名认证,解析不会生效,而且认证有几小时到一天的审核时间。
  • 别贪便宜选生僻后缀。有些后缀首年一块钱,续费却要几百;也有部分后缀在国内无法备案。

第二步:备案(大陆服务器绕不开)

这一步最耗时间,也最容易被教程跳过:如果服务器在中国大陆,域名必须先完成 ICP 备案,否则 80 端口会被拦,域名根本访问不了。

  1. 在服务器厂商的备案控制台提交(阿里云、腾讯云都有专门入口),资料包括身份证、域名证书、服务器实例。
  2. 等待审核,通常 1–20 个工作日,期间会有电话核验。
  3. 备案号下来后,必须放在网站页脚,并链接到 beian.miit.gov.cn。
  4. ICP 备案通过后 30 日内,再办公安备案,同样把编号挂在页脚。
顺序很重要:先买服务器 → 再备案 → 最后解析域名。反过来做,你会对着一个打不开的域名排查半天网络问题。

用 GitHub Pages、Cloudflare Pages 这类境外托管则不需要备案,代价是国内访问速度不稳定。

第三步:准备服务器

云服务器就是一台 24 小时在线的机器。以阿里云为例:

  1. 买一台轻量应用服务器或 ECS,静态站选最低配完全够用(1 核 2G 绰绰有余)。
  2. 系统选 Ubuntu 22.04 LTS,资料多、命令通用。
  3. 在控制台的安全组里放行 80(HTTP)和 443(HTTPS)。
安全组是云服务器的"外层防火墙",和系统里的 ufw 是两套东西。不放行 80,别人就是访问不到你的网站——这是新手最常踩的坑,而且没有任何报错提示。

第四步:安装 Nginx 并部署

SSH 登录服务器后安装 Nginx:

# Ubuntu / Debian
sudo apt update
sudo apt install -y nginx

# 启动并设置开机自启
sudo systemctl enable --now nginx

此时访问服务器公网 IP,应该能看到 Nginx 的欢迎页。看不到就回去检查安全组。

接着把网站文件传上去。第一次可以用 scp:

scp -r ./* root@你的服务器IP:/var/www/html/

但日常更新我更推荐 rsync——它只传有变化的文件,还能顺手删掉服务器上已经不存在的文件:

rsync -avz --delete \
  --exclude '.git' --exclude 'README.md' \
  ./ root@你的服务器IP:/var/www/html/

注意 --delete 会让服务器目录和本地保持完全一致,用之前确认路径没写错。

第五步:写一份像样的 Nginx 配置

默认配置能跑,但缓存策略不合理:要么全都不缓存,要么把 HTML 也缓存住,导致你改了文章、用户却看到旧版本。我用的配置大致是这样:

server {
    listen 80;
    server_name example.com www.example.com;

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

    # 静态资源带指纹或很少变,缓存一年
    location ~* \.(css|js|png|jpg|jpeg|svg|ico|woff2)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # HTML 不缓存,保证文章更新后立刻可见
    location ~* \.html$ {
        add_header Cache-Control "no-cache";
    }

    # 开启压缩
    gzip on;
    gzip_types text/css application/javascript image/svg+xml;
}

改完别忘了先检查语法再重载,-t 这一步能帮你避免把线上站点弄挂:

sudo nginx -t && sudo systemctl reload nginx

第六步:解析域名与 HTTPS

在域名控制台加一条 A 记录,主机记录填 @(根域名)和 www,记录值填服务器公网 IP。几分钟生效后就能用域名访问了。

然后用 Certbot 申请免费证书,开启 HTTPS:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Certbot 会自动改好 Nginx 配置并配置 80 跳 443。证书 90 天到期,它会装一个定时任务自动续期,装完顺手确认一下:

systemctl list-timers | grep certbot
sudo certbot renew --dry-run

我踩过的坑

  • 安全组没放行 80/443。页面一直转圈,没有任何报错。排查顺序:安全组 → 系统防火墙 → Nginx 是否在跑。
  • 域名没实名认证。解析配了也不生效,白排查半天。
  • 备案没下来就急着解析。大陆服务器上 80 端口被直接拦掉。
  • 文件权限不对导致 403。上传后执行 sudo chown -R www-data:www-data /var/www/html。
  • 改了文件浏览器还是旧的。先用无痕窗口确认是不是缓存,再去调 Cache-Control。

不想折腾服务器?

纯静态站完全可以免费托管,把仓库推上去就自动部署:

  • GitHub Pages:仓库设置里开启即可,适合放源码的项目。
  • Cloudflare Pages:连上仓库就能自动构建部署,全球 CDN,免费额度很宽松。

两者都不需要备案,但国内访问速度不保证。如果主要读者在国内,还是大陆服务器或"对象存储 + CDN"更稳。

小结

  • 静态网站不需要复杂运行环境,一个 Nginx 就够。
  • 更新文章 = 本地改文件 + rsync 同步,十几秒的事。
  • 最费时间的不是技术,是备案——想上线的话尽早提交。

这个博客就是按这套流程跑起来的。有问题欢迎邮件交流~