0%

我的个人域名网站从0到1

引入

我的博客一直托管在 GitHub Pages 上。对于单纯的前端页面来说够用了,但如果想放点需要服务器的东西,比如跑个后端服务、存个数据库,还是需要自己有一台云服务器。于是有了这次建站。

现在网站已经稳定运行了快一个月,拥有了主页和几个子项目,它们都跑在我的云服务器上,前后端都是自己开发的。欢迎大家访问 https://tsx.world/

image-20261016135142309

省流版的建站成本和时间线

我的域名、服务器和相关服务都在阿里云上:

项目 规格 价格
域名 .world 后缀,首年 23元
轻量应用服务器 2 核 2G / 40G 系统盘 / 峰值带宽 200Mbps 半年免费!
HTTPS 证书 Let’s Encrypt 免费,自动续期
备案 ICP + 公安备案 0 元(自己办,不找代办)

时间线

日期 事项
8-28 买服务器
9-06 提交 ICP 备案订单
9-15 ICP 备案通过,等了 9 天,
9-19 域名解析 + Nginx + HTTPS + 网站上线,当天提交公安备案
10-10 公安备案通过,去掉国庆假期,等了 2 周,

省流版总结:技术部分用agent半天就能搞定,真正占时间的是两个备案。所以顺序很重要:先提交备案,再搞技术,让等待时间和你的准备工作并行。

接下来是详细介绍。

一、买域名

域名购买的渠道有很多,我选择在阿里云购买,因为可以和我的服务器在一起管理,域名注册等服务阿里云也会提供,比较省心。一般.com和.cn的后缀名比较贵,其他的后缀名比较便宜,所以我选择了 tsx.world ,我的名字缩写加上便宜且有意义的后缀名。第一年仅需23元,第二年104。

image-20261016141457573

买完第一件事是实名认证。国内注册的域名必须实名,不认证域名会被暂停解析。在阿里云控制台下图界面,按流程进行认证,一般一两天就通过了。image-20261016141805160

二、买服务器

阿里云和腾讯云的优惠力度都很大,一台轻量服务器第一年仅需一百元左右,甚至都不用。这方面网上的教程非常多,这里不再赘述。我使用了阿里云的大学生300元无门槛券,免费购买了原价270的2核2G的轻量应用服务器

https://university.aliyun.com/buycenter/?spm=5176.46783215

image-20261016142606231

image-20261016142629948

基本配置:

image-20261016142805352

项目 选择 理由
镜像 Ubuntu 22.04 LTS 长期支持版,资料多
规格 2 核 2G 跑 Nginx + 一两个 Go 服务够用
系统盘 40G 数据库 + 日志 + 快照,够用

三、域名解析

域名解析,就是把域名翻译成 IP 地址。

服务器在网络里的真实地址是一串数字(比如 118.31.60.18),域名只是给它起的一个好记的名字。浏览器里输入 tsx.world 的时候,它并不知道要连哪台机器,会先去问 DNS 服务器”这个域名对应哪个 IP”,拿到答案才能连上你的服务器。

所以买完域名,还要做一步解析:告诉 DNS”tsx.world 指向我的服务器 IP”。不做这一步,域名就是一个没人认识的空名字。

在阿里云云解析 DNS 里加两条 A 记录:

记录类型 主机记录 记录值
A @ 服务器公网 IP
A www 服务器公网 IP

@ 代表裸域名(tsx.world),www 代表 www.tsx.world。两条都加上,两个地址就都能访问。

加完后本地验证一下,可能要等几分钟生效:

1
2
ping tsx.world
# 返回的 IP 应该是你的服务器公网 IP

image-20261016143305568

image-20261016143217066

四、服务器初始配置

4.1 可选:装个 SSH 客户端

服务器上执行的命令,都要先通过 SSH 远程登录到服务器,在它的终端里敲。Windows 自带的 PowerShell 也能连(直接输 ssh root@服务器IP 就行),但每次都要敲一遍 IP,日常维护可以装个专门的 SSH 客户端,能保存连接、双击即连。我用的是 Xshell。当然也可以直接让agent来帮你登录。

下载安装:搜「Xshell」进官网 → 选「家庭/学校免费版」→ 填个邮箱就能下载,安装一路下一步。

装好后新建连接:

  1. 点左上角「新建」,名称随便起(比如 我的服务器)
  2. 在「连接」页填三项:
    • 协议:SSH
    • 主机:你的服务器公网 IP
    • 端口号:22
  3. 点「连接」——第一次会弹「SSH 安全警告」,选「接受并保存」
  4. 输入用户名 root 和密码,回车,就登进服务器了

4.2 SSH 登录与免密配置

命令行方式,PowerShell 里直接连,不装 Xshell 也能用:

1
2
ssh root@你的服务器IP
# 第一次连接会问 yes/no,输 yes 后输入密码

登录成功后配一下免密登录(本机生成密钥对,把公钥装到服务器):

1
2
3
# 本机执行
ssh-keygen -t ed25519 # 一路回车
ssh-copy-id root@服务器IP # 或手动把公钥追加到服务器

⚠️ 我遇到的问题:在 Xshell 里粘贴长命令时,公钥被插入了换行、变成两行写进 authorized_keys,sshd 直接静默忽略——命令显示”安装完成”,但免密登录还是失败。诊断方法:cat -A ~/.ssh/authorized_keys 看有没有异常的 $ 换行符。修复:分段用 echo -n 写入。

配好之后,在本机 ~/.ssh/config 加个别名,以后 ssh 别名 就能连:

1
2
3
4
Host myserver
HostName 服务器IP
User root
IdentityFile ~/.ssh/id_ed25519

4.3 装 Nginx + 放第一个页面

1
2
3
4
5
6
7
# 服务器上执行
apt update && apt install -y nginx
systemctl status nginx # 确认 active

# 把首页文件放到网站目录
# 本机执行(scp 上传):
scp index.html root@服务器IP:/var/www/html/index.html

此时访问 http://tsx.world 就能看到页面了。轻量服务器的防火墙默认放行 80/443 端口,不需要额外配置。

五、HTTPS:一条命令的事

HTTPS 就是给网站的通信加密。

HTTP 协议下,浏览器和服务器之间传输的所有数据都是明文——访客填的表单、输入的密码,在网络上经过的任何节点都能看到、能篡改。HTTPS 会在两端建立一条加密通道,数据在传输途中是加密的,中途被截获也读不出内容。另外,现在浏览器对 HTTP 网站会直接在地址栏标「不安全」,所以 HTTPS 已经是网站的标配。

加密通信需要一张「证书」来证明这个服务器确实是它声称的那个域名。证书以前要花钱买,现在有 Let’s Encrypt 提供免费的,而且能自动续期。我们只需要执行下列命令:

1
2
3
4
5
apt install -y certbot python3-certbot-nginx

certbot --nginx -d tsx.world -d www.tsx.world \
--non-interactive --agree-tos \
--register-unsafely-without-email --redirect

这条命令自动完成三件事:申请证书 → 修改 Nginx 配置(加 443 监听 + 证书路径 + HTTP 301 跳转)→ 安装续期定时任务。完成后浏览器的网址界面就会显示这个网站是安全的。

image-20261016145239822

六、ICP 备案

ICP 备案是什么:ICP 的全称是 Internet Content Provider,直译”网络内容提供商”。国内规定,网站必须向工信部登记”这个网站是谁办的、放在哪台服务器上、叫什么名字”,通过后发一个备案号。实际作用是硬性的:国内服务器上,没备案的域名不能用 80/443 端口对外提供服务——不备案,网站直接访问不了,没有绕过的办法。

网站备案分成 ICP 备案和公安备案:ICP 备案归工信部管,相当于”接入许可”;公安备案归公安部管,是”网络安全责任”登记,网站上线后 30 天内办理,办理时要签一份网络安全责任书。所以顺序是:先办 ICP 备案,再办公安备案,ICP备案通过后网站就能上线。

我实际经历的流程和时间线:

1
2
3
4
9-06  在阿里云提交备案订单(填主体信息、网站信息、上传证件)
9-08 阿里云初审通过,提交管局
9-11 收到工信部短信,完成短信核验
9-15 管局审核通过,收到备案号

整个过程约 9 天,其中大部分是管局审核的排队时间。

管局是什么:管局是各省的通信管理局,工信部在各省的分支机构。备案的最终审核单位就是它。在阿里云提交材料后,阿里云先做初审,再转交管局排队审核,等待时间主要耗在管局这一环,各省管局的处理速度不太一样。

关于ICP备案,阿里云腾讯云等服务商都会有详细的备案流程介绍和指引,此处不再赘述

https://beian.aliyun.com/?spm=5176.30275541.J_ZGek9Blx07Hclc3Ddt9dg.1.19a92f3d84jPH8&scm=20140722.S_card@@%E4%BA%A7%E5%93%81@@3417321.S_new~UND~card.ID_card@@%E4%BA%A7%E5%93%81@@3417321-RL_%E5%A4%87%E6%A1%88-LOC_2024SPSearchCard-OR_ser-PAR1_1a0dfd2617921338496334354e671c-V_4-RE_new6-P0_0-P1_0

image-20261016150110996

填表注意事项:

  1. 备案期间网站不能开:提交后到通过前,域名不能访问,或者只放一个静态占位页。
  2. 服务器所在地按服务器实际地域填。

备案通过后:备案号上墙。

备案通过后会收到工业和信息化部发来的手机短信,告知备案/许可证编号。80f03e18c67bb17357ad9fb24daf0d9b

网站底部需要挂上网站备案号,链接到 https://beian.miit.gov.cn/:image-20261016151607272

https://beian.miit.gov.cn/ 是工信部的备案信息查询系统:任何人都可以在上面输入域名,查到网站的备案号、主办单位、备案时间。备案号必须链接到它,相当于留一个”验证入口”——访客点一下就能核实这个网站确实备过案,而不是随便写的一串编号。

1
<a href="https://beian.miit.gov.cn/" target="_blank">浙ICP备XXXXXXXX号-1</a>

⚠️ 注意:备案号有两个版本——主体备案号(浙ICP备XXXXXXXX号)和网站备案号(带 -1 后缀)。网站底部要挂的是带 -1 的那个,后面公安备案要提供的也是这个,我一开始搞错了,导致公安备案审核不通过。

七、公安备案:上线后 30 天内必须办

公安备案不像之前ICP备案,没有阿里云帮你推进流程,需要自己全程跟进。

平台是全国互联网安全管理服务平台 https://beian.mps.gov.cn要自己注册账号填写。

注意:备案时使用的主体信息中,地址不是户籍地址,而是现居地址!

如果是个人备案的话,是否提供互联网交互服务这里一定要选否,否则过不了审!image-20261016152759296

审核通过后拿到公安备案号,需要在网站首页显著位置挂上备案图标 + 编号:image-20261016151936026

1
2
3
4
<a href="https://beian.mps.gov.cn/" target="_blank">
<img src="gongan.png" alt="公安备案图标">
浙公网安备XXXXXXXXXXXXXX号
</a>

image-20261016152300951

办理公安备案时会签署一份《网络安全责任告知书》:

  1. 网站不再开办 → 5 个工作日内申请撤销备案。别直接扔着不管。
  2. 首页显著位置张贴备案图标。

八、部署工作流

网站上线后要持续更新的话,可以写一个脚本,所有修改都在本地做,改完运行部署脚本上传。

脚本逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env bash
# deploy.sh 核心三步
# 1. 给静态资源换版本号(防止浏览器拿旧缓存)
sed -i "s/?v=[0-9]\{8\}[a-z]/?v=${NEW_VERSION}/g" web/*.html
# 2. 上传整个目录
scp -q -r web/. myserver:/var/www/html/
# 3. 验证:对比本地和线上的文件字节数
for f in "${PAGES[@]}"; do
LOCAL_SIZE=$(wc -c < "web/$f")
READ=$(curl -s -H "Accept-Encoding: identity" -o /dev/null \
-w '%{http_code} %{size_download}' "https://tsx.world/$f")
# 两边字节数一致才算成功
done

配合一个 deploy.bat,现在更新网站就只需要双击一下这个文件,上传完自动校验线上字节数,不一致会报错。

九、一台服务器跑多个项目

建站最初的时候,我只放了个主页,后来陆续加了子项目,都是在同一台服务器上通过 Nginx 路径分流。

Nginx 是一个”Web 服务器”软件,职责是接收访客的请求,把对应的内容返回过去。它主要干两件事:

  • 访客要的是 HTML、图片这类静态文件 → 直接从服务器磁盘上读出来返回
  • 访客要的是 API 数据(需要后端程序现场处理的)→ 把请求转交给后端程序

多项目共存靠的就是它的路径分流能力:同一个域名下,访问 /pingpong/ 走乒乓球项目,访问 /lostfound/ 走失物招领,互不干扰:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 主页
location / {
root /var/www/html;
}

# 乒乓球数据分析:前端静态 + API 反代
location /pingpong/api/ {
proxy_pass http://127.0.0.1:8081/api/; # 后端 Go 服务
}
location /pingpong/ {
root /var/www/html;
}

# 校园失物招领
location /lostfound/api/ {
proxy_pass http://127.0.0.1:8080/api/; # 另一个 Go 服务
}
location /lostfound/ {
alias /opt/lostfound/web/;
}

配置里的 proxy_pass 就是反向代理:后端 Go 程序只监听本机地址(127.0.0.1:8081,外网根本访问不到),Nginx 对外接收请求后替访客转交给后端,再把结果带回来。相当于后端程序躲在 Nginx 后面,由 Nginx 统一对外接待——后端不用直接暴露到公网,更安全,多个服务也能共用一个域名。

每个后端服务用 systemd 托管。systemd 是 Linux 自带的”服务管家”:程序如果直接在终端里跑,窗口一关就停了;交给 systemd 托管后,程序后台常驻、开机自动启动、崩溃了自动拉起。只需要写一个配置文件告诉它”启动哪个程序”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# /etc/systemd/system/myapp.service
[Unit]
Description=My Go backend
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/server -config /opt/myapp/config.yaml
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
1
systemctl enable --now myapp    # 启动 + 设为开机自启

systemctl 是跟这个管家打交道的命令:enable 设为开机自启,--now 表示顺便立刻启动。平时看运行状态用 systemctl status myapp,改完代码重启用 systemctl restart myapp。

结语

网站的建设一点也不难!如果你也在计划建站,希望这篇博客能有所帮助。