在树莓派 Zero 上完全运行于 RAM 中提供网站服务
摘要
本教程介绍如何在树莓派 Zero v1.3 上使用 Alpine Linux 搭建无磁盘网站,系统完全启动至其 512MB RAM 中。详细说明了所需硬件、操作系统配置、轻量级 Web 服务器以及将 TLS 终止卸载到外部 VPS 的方法。
<p><a href="https://lobste.rs/s/fsueos/serving_website_on_raspberry_pi_zero">评论</a></p>
查看缓存全文
缓存时间: 2026/05/08 14:29
# 在树莓派 Zero 上纯内存运行网站
来源:https://btxx.org/posts/memory/ 2026-05-08
我的微型站点 zero.btxx.org (https://zero.btxx.org/) 正通过一台运行 Alpine Linux 的 Raspberry Pi Zero v1.3 向公网提供服务。最棒的是?它无磁盘运行,完全在内存中运行!
树莓派 Zero 和它旁边的两台备用 Pi
我的树莓派 Zero 安静地运行在冷存储室中(还有两台额外的 Pi 提供精神支持)。
为 zero.btxx.org (https://zero.btxx.org/) 提供服务
更令人印象深刻的是,Pi Zero 只有 **512MB 总内存**,其中约 **40MB** 被 Alpine Linux 占用。但由于如今 RAM 既丰富又便宜,我们可以……哦,好吧。总之,活在这个时代真好!如果你也有兴趣用 Pi Zero 运行自己的网站,请跟着下面的步骤来!
- (本地的)硬件 (https://btxx.org/posts/memory/#the-local-hardware)
- 为什么用 512MB 的 microSD 卡? (https://btxx.org/posts/memory/#why-the-512mb-micro-sd-card)
- (外部的)硬件 (https://btxx.org/posts/memory/#the-external-hardware)
- VPS 配置 (https://btxx.org/posts/memory/#vps-stats)
- 准备 microSD 卡 (https://btxx.org/posts/memory/#preparing-our-microsd-card)
- Alpine Linux 无盘模式 (https://btxx.org/posts/memory/#alpine-linux-in-diskless-mode)
- 软件 (https://btxx.org/posts/memory/#software)
- `darkhttpd` (https://btxx.org/posts/memory/#darkhttpd)
- `nginx` (https://btxx.org/posts/memory/#ngnix)
- `rsync` (https://btxx.org/posts/memory/#rsync)
- `lbu` (https://btxx.org/posts/memory/#lbu)
- 打开端口 (https://btxx.org/posts/memory/#opening-ports)
- TierHive VPS (https://btxx.org/posts/memory/#tierhive-vps)
- TierHive HAProxy (https://btxx.org/posts/memory/#tierhive-haproxy)
- 在 VPS 上终止 TLS (https://btxx.org/posts/memory/#terminating-tls-on-a-vps)
- 备份 (https://btxx.org/posts/memory/#backups)
- 愉快地托管! (https://btxx.org/posts/memory/#happy-hosting)
开始之前,我们先列出所有需要的硬件项。
## (本地的)硬件
- Raspberry Pi Zero v1.3
- 512MB+ microSD 卡(安装和启动到 RAM 仍然需要)
- Waveshare Ethernet HAT(可选,也可用 OTG 适配器替代)
- 以太网线
- Micro USB 电源线 / 电源适配器
- 酷炫外壳(可选)
### 为什么用 512MB 的 microSD 卡?
这将使我们的镜像备份更容易(在本文末尾)。由于我们受限于最大 RAM 空间(存储)为 512MB,所以没有必要备份超过需要的容量。
Alpine 初始安装时暂时需要的额外硬件:
- 显示器
- HDMI 转 mini-HDMI 适配器
- 键盘
## (外部的)硬件
由于我打算避免在 Pi Zero 上直接处理繁重的 TLS 终止,我将通过一个单独的小型 VPS 来转发安全流量。我目前使用的是 TierHive (https://tierhive.com/r/AD3AFC1F50FF)(推荐链接),到目前为止体验非常好。它们仍处于 alpha 阶段,但对于这个个人实验来说没问题。我选择 TierHive 是因为其低价格和预置的 HAProxy 配置选项。
### VPS 配置
- Alpine Linux
- 128 MB RAM
- 1 GB 存储(NVMe)
- 1 vCPU
- 约 4 美元/年
但现在不用操心这些,我们稍后会详细讨论。你可以随意使用其他提供商,或者像 Cloudflare 这样的免费服务 (https://btxx.org/posts/memory/#fn:1),如果你喜欢的话。
## 准备 microSD 卡
以下操作在 macOS 上完成。使用其他操作系统需要不同的步骤。注意,我们将直接把 `tar` 内容提取到 microSD 卡上,所以请确保下载以 `tar.gz` 结尾的 Alpine 镜像。
插入 SD 卡,用 `diskutil list` 找到磁盘。本例中 SD 卡位于 `/dev/disk4`。
擦除并重新分区为 FAT32:
```
diskutil eraseDisk FAT32 ALPINE MBRFormat /dev/disk4
```
将 Alpine tarball 提取到卡上:
```
tar xzf alpine-rpi-*.tar.gz -C /Volumes/ALPINE
```
清理 macOS 产生的垃圾文件,然后弹出:
```
find /Volumes/ALPINE -name '._*' -delete
rm -rf /Volumes/ALPINE/.Spotlight-V100
rm -rf /Volumes/ALPINE/.fseventsd
rm -rf /Volumes/ALPINE/.Trashes
diskutil eject /dev/disk4
```
现在将 microSD 卡插入你的 Pi Zero。确保 Pi 连接了显示器和键盘,然后开机。
## Alpine Linux 无盘模式
Pi 启动进入 Alpine 现场环境后,使用 `root` 登录(无需密码)。注意 SD 卡应位于 `/dev/mmcblk0`。
通常你会运行 `setup-alpine` 并逐步完成安装,但我们需要先配置 `lbu`。这将允许我们将配置和网站文件保存到 SD 卡上,以便重启后持久化更改。
```
setup-lbu mmcblk0p1
mkdir -p /media/mmcblk0p1/cache
setup-apkcache /media/mmcblk0p1/cache
lbu commit -d
```
特别注意 `lbu commit -d`。你每次安装/移除包或更改系统文件时都需要运行此命令,否则下次重启或断电后更改会丢失。
完成后,我们可以通过运行 `setup-alpine` 继续安装。它会引导你完成:
- **键盘**:选择你的键盘布局
- **主机名**:给 Pi 起个名字
- **网络**:配置 `eth0`
- **DNS**:`8.8.8.8` 就行(或任何你想要的)
- **时区**:选择你的时区
- **镜像源**:按 `f` 选择基于你位置的最快镜像
- **SSH 服务器**:`dropbear` 比其他选项轻量得多,强烈推荐!
- **root 密码**:设置一个
- **磁盘**:重要!这里选择 `none`,保持*无盘*模式。当询问是否存储配置/APK 缓存时,应该已经默认使用你之前配置的 `/media/mmcblk0p1/cache` 设置。保持它们不变。
安装完成后,可以重启系统。启动并登录后,可以通过运行以下命令检查是否一切在内存中运行:
```
mount | grep " / "
```
如果根目录(`/`)挂载为 `tmpfs` 或 `ramfs`,则说明在 RAM 中运行。万岁!
## 软件
### `darkhttpd`
由于我们只需要提供基本的 HTTP(VPS 处理 TLS,还记得吗?),最适合我们有限资源的 Web 服务器选项是 `darkhttpd`。让我们安装并设置一个启动运行时,以便重启后持久化:
```
apk add darkhttpd
```
然后需要在 `/etc/init.d/darkhttpd` 创建一个运行时文件:
```
#!/sbin/openrc-run
description="darkhttpd static web server"
command="/usr/bin/darkhttpd"
command_args="/var/www/example.com --port 80 --maxconn 20"
command_background=true
pidfile="/run/darkhttpd.pid"
depend() {
need net
}
```
然后立即启动所有服务:
```
chmod +x /etc/init.d/darkhttpd
rc-update add darkhttpd default
rc-service darkhttpd start
```
这里你可以看到我们将网站文件放在 `/var/www` 下。确保让 `lbu` 包含此目录,否则重启后这些文件会丢失!
```
lbu include /etc/init.d/darkhttpd
lbu include /var/www
```
还要注意 `maxconn` 参数,你可以根据需要调整。就这样!
### `nginx`
如果你需要更灵活或更好地控制 Web 服务器,也可以使用 `nginx`。
```
apk add nginx
```
然后在 `/etc/nginx/http.d/yourdomain.com.conf` 创建一个站点特定的配置文件:
```
server {
listen 8080;
server_name yourdomain.com;
root /var/www/yourdomain.com;
index index.html;
try_files $uri $uri/ =404;
error_page 404 /404;
location = /404 {
internal;
}
}
```
用于保持文件在重启/断电后持久化的规则与 `darkhttpd` 相同:
```
rc-update add nginx default
rc-service nginx start
lbu include /etc/nginx
lbu include /var/www
```
### `rsync`
为了将本地机器的更改同步到树莓派,我们需要 `rsync`:
```
apk add rsync
```
如果你更喜欢使用 `scp` 或通过 FTP 客户端直接传输文件,可以跳过这一步。这只是个人偏好。
### `lbu`
现在 Pi 上已经安装了我们想要/需要的所有东西,将所有希望持久化到 microSD 卡的配置和网站文件包含进来:
```
lbu include /etc/init.d/darkhttpd
lbu include /etc/nginx
lbu include /var/www
lbu commit -d
```
**我们最终的软件栈一览:**
- `dropbear`(安装时已设置)
- `darkhttpd`
- `lbu`
- `rsync`
## 打开端口
由于我们计划使用外部 VPS 处理 TLS 终止,只需要在本地网络打开一个端口(本例使用 `80`,但你可以用任何你想要的)。我不会深入细节,因为家庭网络差异很大。只需知道你需要打开端口 `80`,并确保目标 IP 是你的树莓派 Zero 设备的 IP(你还应该为其设置静态 IP,以避免麻烦)。
注意下面说明中的目标端口。
**重要:** 如果你的 ISP 为家庭网络分配动态 IP,你需要配置某种形式的 DDNS。我推荐使用 DuckDNS (https://duckdns.org/)。
## TierHive VPS
对于我们的需求,VPS 只需要低端配置:
- Alpine Linux
- 128MB 内存
- 1GB 存储
按照标准的 Alpine 配置正常安装并设置上述系统。完成后,使用 VPS 设置页面提供的 `ssh` 目标登录。
这个 VPS 上真正需要的包只有 `socat`。我们将使用 `socat` 将互联网流量定向到本地的树莓派 Zero(因为 TierHive 是一个 NAT VPS 提供商)。
```
apk add socat
```
然后创建 `/etc/local.d/forward.start`:
```
#!/bin/sh
socat TCP-LISTEN:80,fork,reuseaddr TCP:YOUR_HOME_IP:48080 &
```
将 `YOUR_HOME_IP` 替换为你的家庭 IP 或 DDNS 主机名,将 `48080` 替换为你路由器上转发的任意外部端口。还要注意,你需要让路由器正确转发端口。
例如:
```
TCP 48080 -> Pi: 80
```
## TierHive HAProxy
现在我们将 TierHive 的 HAProxy Edge 服务与我们新搭建的 VPS 连接。导航到 TierHive 管理后台的“HAProxy”菜单,选择“Add Domain”。输入你的自定义域名并按照指示在你的 DNS 记录中添加一个 `TXT` 文件。这是用于验证你的域名。
确认后,点击“Configure Backends”按钮。然后执行以下操作:
1. 单服务器
2. 区域访问
3. 选择 VPS 服务器(使用下拉菜单选择你的 VPS)
4. 设置端口(本例配置为 `80`)
5. 保存!
这些更改大约需要 5 分钟传播。完成后,你的小型 VPS 前面将运行 TierHive 的 HAProxy,它指向本地的 Pi Zero!
### 在 VPS 上终止 TLS
你现在可以停在这里,拥有一个可工作的网站。主要问题是没有 TLS,这在 2026 年对一个网站来说并不理想。好消息是 TierHive 的 HAProxy 服务内置自动 SSL 续期。你只需要在 HAProxy 管理页面中点击域名设置内的“Active SSL”。给它一点时间传播,就大功告成了!
现在所有的 TLS 握手都由 TierHive 处理,释放 Pi 专注于提供静态内容。
## 备份
这种设置的备份极其简单。在同一个网络上,你可以直接运行:
```
ssh root@YOUR-PI-ZERO-IP "dd if=/dev/mmcblk0 bs=4M" > zero-backup.img
```
这个镜像是**逐个字节的克隆**。将其刷写到新卡上,它将像当前 microSD 卡一样启动。只需确保新 SD 卡大小相同或更大!
Pi 完全启动后,你甚至可以卸下 microSD 卡,因为它运行在内存中。然后你可以将卡插入其他设备直接备份,而无需依赖不稳定的网络连接!
## 愉快地托管!
这就是全部内容。乍一看可能有点复杂,但我保证一旦开始,其实相当简单。希望这能激励其他人尝试自托管!
相似文章
在树莓派上托管网站
技术教程,介绍如何在树莓派上自托管网站,涵盖端口转发、DNS 配置、使用 Caddy 作为反向代理、PM2 进行 Node.js 进程管理,以及使用 GitHub Actions 实现 CI/CD 自动化。
在8位微控制器上托管网站
一个爱好者项目演示了在8位AVR微控制器上托管简单网站,通过串口连接使用SLIP协议与Linux PC通信,避免了以太网硬件需求。
Frood:一个基于Alpine Initramfs的NAS
描述了一种完全从Alpine Linux initramfs运行NAS的方法,支持干净启动、A/B部署、声明式git跟踪配置,并相比Alpine的无盘模式降低了复杂性。
Raspberry Pi 5 – 16 GB, 350美元
Raspberry Pi 5 现已推出 16GB 内存版本,售价 350 美元,搭载 2.4GHz 四核 ARM Cortex-A76 处理器、改进的 GPU,并增强了 I/O 能力,支持 USB 3.0 和带 PoE 的千兆以太网。
在20世纪60年代Univac计算机上运行Minecraft服务器及其他应用
一位爱好者成功在修复的1960年代UNIVAC 1219B(仅250 kHz CPU、90 KB内存)上运行Minecraft服务器、NES模拟器、Web服务器和现代加密算法。