从零搭建网站(一):域名服务器篇

基于旧硬件与 Cloudflare Tunnel Dashboard 模式的建站实践

本文记录如何利用闲置笔记本电脑,在无公网 IP 的家庭网络环境下,通过 Cloudflare 隧道技术(Cloudflare Tunnel)的远程管理模式,实现多业务并发(Web 博客 + 音乐服务器)的公网部署,并详细解决 Web 服务器的权限冲突与自动化配置问题。


一、 核心资产与环境准备

1. 域名采购与解析托管

  • 域名:cbsbm.cn(原注册商为聚名网)。
  • DNS 迁移:为获得更好的自动化支持,需将解析权移交给 Cloudflare。在原注册商后台将 DNS 服务器修改为 Cloudflare 提供的地址(如 alec.ns.cloudflare.com),等待全球生效。

2. 硬件环境

  • 设备:废弃旧笔记本(具备功耗低、自带备用电池等天然 UPS 优势)。
  • 系统:Ubuntu / Xubuntu。

3. 软件栈

  • Apache2 (监听端口 8888):负责托管 Hexo 静态博客。
  • Navidrome (监听端口 4533):负责个人音乐流媒体服务。
  • Cloudflared:Cloudflare Tunnel 官方客户端,作为内网与公网的加密桥梁。

二、 本地 Web 服务配置 (Apache2)

为了将 Hexo 生成的静态文件通过隧道发布,需配置 Apache 监听非标准端口并准确指向项目路径。

1. 修改监听端口

编辑 /etc/apache2/ports.conf,添加:

1
2
Listen 8888

2. 配置虚拟主机

编辑 /etc/apache2/sites-available/000-default.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<VirtualHost *:8888>
ServerAdmin webmaster@localhost
# Hexo 生成的静态文件路径
DocumentRoot /home/sky/my-blog/public
DirectoryIndex index.html

<Directory /home/sky/my-blog/public>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>


三、 权限共治:sky 用户与 www-data 组的完美配合

在 Linux 环境下,Hexo 部署脚本(sky 用户)和 Apache 进程(www-data 用户)常因权限冲突导致页面 403。通过以下步骤实现“共治”:

1. 设置归属权

将博客根目录的所有者设为 sky,所属组设为 Web 服务组 www-data:

1
2
sudo chown -R sky:www-data /home/sky/my-blog

2. 细化权限位 (775)

确保所有者和组均拥有读、写、执行权限,其他人仅限读取:

1
2
sudo chmod -R 775 /home/sky/my-blog

3. 设置 GID 标志(核心技巧)

为了让未来 Hexo 重新生成(Delete & Recreate)的文件自动继承 www-data 组属性,防止权限丢失,执行:

1
2
sudo chmod g+s /home/sky/my-blog


四、 Cloudflare Tunnel 远程模式配置

传统的 YAML 配置文件模式较为繁琐。通过 Cloudflare Zero Trust 仪表盘(Dashboard)配置隧道,可以实现云端实时动态路由。

1. 客户端安装与 Token 部署

在控制台创建隧道并获得 Token 后,在本地执行:

1
2
3
4
5
6
7
8
# 下载并安装官方软件包
curl -L 'https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb' -o cloudflared.deb
sudo dpkg -i cloudflared.deb

# 将 cloudflared 注册为系统级服务并关联 Token
# 注意:此命令会自动创建 systemd 服务并配置自启
sudo cloudflared service install YOUR_REMOTE_TOKEN_HERE

2. 系统服务微调 (Systemd)

若需手动调整,编辑 /etc/systemd/system/cloudflared.service:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=cloudflared
After=network-online.target
Wants=network-online.target

[Service]
TimeoutStartSec=0
Type=notify
ExecStart=/usr/bin/cloudflared --no-autoupdate tunnel run --token YOUR_REMOTE_TOKEN_HERE
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

执行 sudo systemctl daemon-reload 确保配置生效。

3. 云端路由配置 (Public Hostname)

登录 Cloudflare Zero Trust,进入 Networks -> Tunnels,点击对应隧道的 Configure,切换到 Public Hostname (公共主机名) 选项卡:

  • 博客业务 (cbsbm.cn):

  • Domain: cbsbm.cn

  • Service: HTTP://localhost:8888

  • 音乐业务 (music.cbsbm.cn):

  • Subdomain: music

  • Domain: cbsbm.cn

  • Service: HTTP://localhost:4533


五、 总结与展望

通过上述方案,我们构建了一个高可用的家庭服务器环境:

  1. 极简运维:无需繁琐的端口转发(Port Forwarding),路由修改云端即时生效。
  2. 安全加固:隐藏了家庭真实的公网 IP,且利用 Cloudflare WAF 抵御潜在攻击。
  3. 多业务共存:利用 Apache 虚拟主机与隧道子域名,让多项服务在同一台物理设备上各司其职。