在树莓派 Zero 上完全运行于 RAM 中提供网站服务

Lobsters Hottest 工具

摘要

本教程介绍如何在树莓派 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 卡,因为它运行在内存中。然后你可以将卡插入其他设备直接备份,而无需依赖不稳定的网络连接! ## 愉快地托管! 这就是全部内容。乍一看可能有点复杂,但我保证一旦开始,其实相当简单。希望这能激励其他人尝试自托管!

相似文章

在树莓派上托管网站

Hacker News Top

技术教程,介绍如何在树莓派上自托管网站,涵盖端口转发、DNS 配置、使用 Caddy 作为反向代理、PM2 进行 Node.js 进程管理,以及使用 GitHub Actions 实现 CI/CD 自动化。

在8位微控制器上托管网站

Hacker News Top

一个爱好者项目演示了在8位AVR微控制器上托管简单网站,通过串口连接使用SLIP协议与Linux PC通信,避免了以太网硬件需求。

Frood:一个基于Alpine Initramfs的NAS

Hacker News Top

描述了一种完全从Alpine Linux initramfs运行NAS的方法,支持干净启动、A/B部署、声明式git跟踪配置,并相比Alpine的无盘模式降低了复杂性。

Raspberry Pi 5 – 16 GB, 350美元

Hacker News Top

Raspberry Pi 5 现已推出 16GB 内存版本,售价 350 美元,搭载 2.4GHz 四核 ARM Cortex-A76 处理器、改进的 GPU,并增强了 I/O 能力,支持 USB 3.0 和带 PoE 的千兆以太网。