个人网站搭建笔记v1
我的网站搭建之路
前言
这篇笔记旨在完整记录我个人服务器上网站集群的搭建历程。从最初的两个简单网站,到最终形成一个结构清晰、安全可靠、易于管理的多站点平台。这不仅是一份技术档案,也是一次宝贵的实践经历。
一、最终架构总览
经过一系列的规划与调整,我的网站平台最终形成了以一个主域名引导页为门户,两个子域名提供核心内容的服务架构。所有服务均由Nginx统一接入和管理,并通过Cloudflare提供全球加速与安全防护。
-
云服务商: 阿里云 (ECS)
-
CDN & 安全网关: Cloudflare
-
Web服务器: Nginx (反向代理 & 静态服务)
-
进程管理器: PM2 (用于Node.js应用)
-
核心技术: 静态网站、Node.js、Python、Shell脚本
-
部署方式: Git + 自定义自动化部署脚本
架构图示
graph TD A["用户 (Internet)"] --> B["Cloudflare
(DNS, SSL/TLS, CDN, Firewall)"]; B -- "HTTPS (端口 443)" --> C["阿里云服务器 (ECS)"]; subgraph C D["Nginx"] end D -- "czchx.cc" --> E["引导页 (Static)"]; D -- "garden.czchx.cc" --> F["PM2 → http-server"]; D -- "game.czchx.cc" --> G["游戏站 (Static)"];
二、各站点详解
所有网站相关的文件最终都被统一存放在服务器的 /home/czc/web/
目录下,便于集中管理。
1. 主域名引导页 (https://czchx.cc
)
-
角色: 整个平台的门户,引导用户访问不同的子站点。
-
物理路径:
/home/czc/web/landing_page/
-
实现: 一个简洁美观的静态
index.html
页面。 -
Nginx配置 (
/etc/nginx/sites-enabled/czchx.cc.conf
):
* 这是Nginx的默认站点 (default_server
),处理所有未被其他配置捕获的请求,避免域名混淆。
* 将所有HTTP请求 (:80
) 强制301重定向到HTTPS (:443
)。
* 直接提供 /home/czc/web/landing_page/
目录下的静态文件服务。
2. 数字花园 (https://garden.czchx.cc
)
-
角色: 个人知识库,由Markdown源文件构建。
-
物理路径:
* 部署脚本和工具: /home/czc/web/digitalgarden/
* 网站源码: /home/czc/web/digitalgarden/digitalgardendist/
(由Git从GitHub仓库克隆)
-
实现: Obsidian导出的静态HTML网站,由一个Node.js的
http-server
提供后端服务。 -
PM2进程管理:
* 我们使用PM2来守护http-server
进程,确保其稳定运行。
* 启动命令为:pm2 start http-server -- /home/czc/web/digitalgarden/digitalgardendist/ -p 8080 --name digitalgarden
- Nginx配置 (
/etc/nginx/sites-enabled/garden.conf
):
* 监听 garden.czchx.cc
的所有HTTP和HTTPS请求。
* 将HTTP请求重定向到HTTPS。
* 作为反向代理,将所有HTTPS流量安全地转发到本地运行在8080
端口的http-server
服务上。
- 自动化部署 (
czc_d.sh
):
* 这是整个数字花园的灵魂,它实现了"一键部署"。
* 核心流程:
1. 进入项目目录 /home/czc/web/digitalgarden/
。
2. 删除旧的源码,通过git clone
重新拉取最新的笔记产物。
3. 通过ln -sfn
创建文件软链接。
4. 通过pm2 delete
和pm2 start
重启http-server
。
5. 调用Python脚本,自动生成最新的站点地图sitemap.xml
。
- SEO自动化 (
generate_garden_sitemap.py
):
* 一个定制的Python脚本,它会递归扫描所有笔记文件,生成符合规范的sitemap.xml
,并能正确处理URL中的特殊字符。
3. 游戏站 (https://game.czchx.cc
)
-
角色: 在线H5小游戏平台。
-
物理路径:
/home/czc/web/game/
-
实现: 纯粹的静态HTML、CSS、JavaScript网站。
-
Nginx配置 (
/etc/nginx/sites-enabled/game.conf
):
* 配置非常直接,监听game.czchx.cc
的HTTP和HTTPS请求。
* 将HTTP重定向到HTTPS。
* 直接提供/home/czc/web/game/
目录下的静态文件服务。
三、基础设施与安全配置
1. 域名、DNS与SSL/TLS (Cloudflare)
-
DNS解析: 所有域名的DNS解析都在Cloudflare上完成。
A
记录指向我的阿里云服务器IP。 -
SSL/TLS证书:
* 我们采用了Cloudflare的源服务器证书 (Origin Certificate),这是一个免费且安全的方案。
* 证书模式设置为最高安全级别的 "完全(严格)" (Full (Strict))。
* 服务器上,我们将Cloudflare提供的证书和其根证书合并为了一个 fullchain.pem
文件,解决了所有SSL证书链问题。
* 所有证书文件都安全地存放在 /etc/nginx/ssl/czchx.cc/
目录下。
2. 服务器防火墙 (阿里云安全组)
- 安全组是服务器的第一道大门。目前,为方便起见,有一条优先级很高的"允许所有端口"的规则。这虽然保证了服务的可访问性,但也带来了安全隐患。
3. 核心管理工具与脚本
-
初始备份脚本 (
backup.sh
): 项目初期创建,用于将网站文件打包备份。 -
笔记发布管理脚本:
* remove_publish_flag.py
: 用于批量移除笔记中的 dg-publish: true
标签,实现内容的"一键撤回"。
* add_publish_flag.py
: 用于批量添加或修正 dg-publish: true
标签,实现内容的"一键发布"。
四、未来可改进的方向
虽然目前的架构已经非常稳定和高效,但总有追求卓越的空间。
- 实现真正的CI/CD (持续集成/持续部署)
* 现状: 我需要登录服务器,手动运行czc_d.sh
来部署。
* 改进: 使用 GitHub Actions。当我的笔记仓库有新的push
时,可以自动触发一个Action,通过SSH连接到我的服务器并执行部署脚本。这将实现真正的"写完即发布",完全自动化。
- 容器化 (Docker)
* 现状: 应用和服务直接运行在服务器上。
* 改进: 使用 Docker 将数字花园的http-server
应用,甚至Nginx本身都打包成容器。通过docker-compose
来编排它们。
* 优势: 极大地提升了环境的可移植性、隔离性和部署速度。未来迁移服务器会变得像复制几个配置文件一样简单。
- 加强服务器安全
* 现状: 阿里云安全组规则过于宽松。
* 改进: 遵循**"最小权限原则"**。关闭所有不必要的端口,只开放22
(SSH), 80
(HTTP), 443
(HTTPS)等必需端口。对于SSH端口,可以进一步限制只允许特定IP地址访问。
- 建立独立的暂存/测试环境
* 现状: 所有更改直接部署到生产环境。
* 改进: 可以再创建一个staging.garden.czchx.cc
子域名。在部署重大更新前,先部署到这个测试环境进行验证,确认无误后再部署到正式环境。
- 完善的监控与告警
* 现状: 依赖Cloudflare的Analytics和手动检查。
* 改进: 引入UptimeRobot之类的免费服务,对所有站点进行24小时可用性监控,一旦网站宕机,可以立即收到邮件或App通知。
结语
从简单的文件上传,到拥有自动化部署脚本、反向代理、全站HTTPS、CDN加速的规范化网站集群,这个过程中的每一步都充满了挑战和收获。这份文档将作为我未来继续优化和扩展这个平台的基石。