在NetBSD上使用bozohttpd搭建简单的Web服务器
摘要
在NetBSD上使用bozohttpd搭建简单Web服务器的实用指南,包括通过inetd进行配置、使用acme-client实现HTTPS,以及可选的多站点设置。
<p><a href="https://lobste.rs/s/titphm/setup_simple_web_server_with_bozohttpd_on">评论</a></p>
查看缓存全文
缓存时间: 2026/08/06 14:10
# bozohttpd rocks - 在 NetBSD 上使用 bozohttpd 搭建一个简单的 Web 服务器
来源:https://bozo.httpd.rocks/
如果你更喜欢使用 OpenBSD(https://openbsd.org/),可以查看 httpd.rocks(https://httpd.rocks/)。
如果你更希望使用类似 Caddy 的工具,可以查看 caddy.ninja(https://caddy.ninja/)。
---
- [开始之前...](https://bozo.httpd.rocks/#before-you-begin)
- [准备你的域名](https://bozo.httpd.rocks/#prep-your-domains)
- [网站文件](https://bozo.httpd.rocks/#website-files)
- [配置 inetd.conf](https://bozo.httpd.rocks/#configuring-inetdconf)
- [启动 bozohttpd](https://bozo.httpd.rocks/#start-bozohttpd)
- [设置 HTTPS](https://bozo.httpd.rocks/#setup-https)
- [配置 acme-client.conf](https://bozo.httpd.rocks/#configuring-acme-clientconf)
- [调整权限](https://bozo.httpd.rocks/#tweaking-permissions)
- [运行每日 cronjob](https://bozo.httpd.rocks/#running-a-daily-cronjob)
- [更新 `inetd.conf` 以支持 HTTPS](https://bozo.httpd.rocks/#updating-inetdconf-to-support-https)
- [多个网站怎么办?](https://bozo.httpd.rocks/#what-about-multiple-websites)
- [更新 acme-client.conf](https://bozo.httpd.rocks/#updating-acme-clientconf)
- [符号链接来救场!](https://bozo.httpd.rocks/#symlink-to-the-rescue)
- [更新 inetd.conf](https://bozo.httpd.rocks/#updating-inetdconf)
- [编辑 rc.conf](https://bozo.httpd.rocks/#editing-rcconf)
## 开始之前...
本指南假设你已经在你选择的服务器上安装好了 NetBSD。如果你需要在 VPS 上安装 NetBSD,请查看[官方指南](https://www.netbsd.org/docs/guide/en/chap-exinst.html)。
大多数命令都需要通过 `doas` 运行,因为你应该以已创建的用户身份登录,而绝不要直接使用 `root`。顺便说一句,你可能需要通过软件包安装 `doas`。
本指南中的所有示例都使用 `bozo.httpd.rocks` 作为域名(真是够“元”的……)。请记得将其替换为你自己的 URL。
## 准备你的域名
确保你的 DNS 记录已经配置好,并能按预期用于你的域名。你可以通过以下命令检查它们的状态:
## 网站文件
将你的网站文件放在适当的目录中。在本指南中,我们会将所有文件放入 `/var/www/bozo.httpd.rocks`。
## 配置 inetd.conf
`inetd` 会为每个连接执行一个新的 httpd,因此它会在每次请求开始时读取证书文件。(这不是性能最优的方案,但对我们这样简单的需求来说已经足够了!)
将以下内容放入你的 `/etc/inetd.conf` 文件中:
```
http stream tcp nowait:600 _httpd /usr/libexec/httpd httpd /var/www/bozo.httpd.rocks
```
## 启动 bozohttpd
现在只需让 `bozohttpd` 监听 80 端口。我们暂时还不需要担心 TLS。
我们通过重载 `inetd` 来启动 Web 服务器,因为这是我们调用它的地方:
## 设置 HTTPS
首先,我们需要从软件包中安装 `acme-client`:
```
pkgin install acme-client
```
接下来,我们创建后续步骤中需要的所有目录/子目录:
```
mkdir -p /etc/acme
mkdir -p /var/www/bozo.httpd.rocks/.well-known/acme-challenge
mkdir -p /etc/openssl/private
chmod 700 /etc/openssl/private
```
### 配置 acme-client.conf
写入 `/usr/pkg/etc/acme-client.conf`。请务必把域名和目录路径改成你自己的!
```
authority letsencrypt {
api url "https://acme-v02.api.letsencrypt.org/directory"
account key "/etc/acme/letsencrypt-privkey.pem"
}
domain bozo.httpd.rocks {
domain key "/etc/openssl/private/bozo.httpd.rocks.key"
domain full chain certificate "/etc/openssl/certs/bozo.httpd.rocks.fullchain.pem"
sign with letsencrypt
challengedir "/var/www/bozo.httpd.rocks/.well-known/acme-challenge"
}
```
现在我们可以获取证书了:
```
acme-client -vAD bozo.httpd.rocks
```
如果一切正常,那些新的 `key` 和 `pem` 文件应该已经存在。你可以随时检查确认:
```
ls -l /etc/openssl/private/bozo.httpd.rocks.key /etc/openssl/certs/bozo.httpd.rocks.fullchain.pem
```
**重要**:在继续之前,我们需要:
1. 调整证书文件的权限,以避免不必要的错误
2. 设置一个简单的 `cronjob`,每天检查证书的过期日期
### 调整权限
```
doas chown root:wheel /etc/openssl/private/bozo.httpd.rocks.key
doas chmod 600 /etc/openssl/private/bozo.httpd.rocks.key
doas chgrp wheel /etc/openssl/private
doas chmod 700 /etc/openssl/private
```
### 运行每日 cronjob
你需要以 `root` 身份设置这个 cron 条目:
然后添加一个简单的任务:
```
0 3 * * * acme-client bozo.httpd.rocks
```
## 更新 `inetd.conf` 以支持 HTTPS
回到原来的 `inetd.conf` 文件,加入对 `https` 的支持:
```
http stream tcp nowait:600 _httpd /usr/libexec/httpd httpd /var/www/bozo.httpd.rocks
https stream tcp nowait:600 root /usr/libexec/httpd httpd -U _httpd -Z /etc/openssl/certs/bozo.httpd.rocks.fullchain.pem /etc/openssl/private/bozo.httpd.rocks.key /var/www/bozo.httpd.rocks
```
你可能已经注意到,我们为 `https` 实例使用了 `root` 用户。这是为了避免与上面运行的 `acme-client` 任务产生冲突。
现在最后重启一次 `inetd`:
就是这样!尽情享受你的 Web 服务器吧!
---
## 多个网站怎么办?
别担心!你需要的都有。以下内容假设你*已经完成了*上面这一节的所有操作。
### 更新 acme-client.conf
我们将创建一对新的 key/pem(称为 `websites`),它将被我们托管的所有域名共享。第一步是在我们的 `acme-client.conf` 文件中加入这些“备用”域名:
```
authority letsencrypt {
api url "https://acme-v02.api.letsencrypt.org/directory"
account key "/etc/acme/letsencrypt-privkey.pem"
}
domain bozo.httpd.rocks {
domain key "/etc/openssl/private/websites.key"
domain full chain certificate "/etc/openssl/certs/websites.fullchain.pem"
alternative names {
example.com
example.org
example.net
}
sign with letsencrypt
challengedir "/var/www/acme"
}
```
### 符号链接来救场!
你需要“骗过” `acme-client`(在接下来的步骤中),让它指向共享的 `.well-known` 目录。每个域名都需要执行此操作:
```
doas mkdir -p /var/www/example.com/.well-known
doas ln -sf /var/www/acme /var/www/example.com/.well-known/acme-challenge
```
### 更新 inetd.conf
我们需要稍微调整现有的 `inetd.conf` 文件,并使用 bozohttpd 的 `-v` 和 `-V` 参数:
```
http stream tcp nowait:600 _httpd /usr/libexec/httpd httpd -v /var/www -V default /var/www/default
```
同时一定要彻底删除之前特定的 `https` 那一行。完成这些修改后,你可以重启 `inetd`:
```
doas /etc/rc.d/inetd restart
```
现在运行 `acme-client` 来获取新的证书:
```
doas acme-client -v bozo.httpd.rocks
```
### 编辑 rc.conf
现在我们对 `/etc/rc.conf` 文件做一些简单的调整:
```
httpd=YES
httpd_flags="-v /var/www -V -U _httpd -Z /etc/openssl/certs/websites.fullchain.pem /etc/openssl/private/websites.key"
httpd_wwwdir="/var/www/default"
```
然后同样重载它:
```
doas /etc/rc.d/httpd restart
```
恭喜!你现在正通过 `bozohttpd` 托管多个网站!
相似文章
使用 OpenBSD 搭建一个简单的自托管网页服务器
一份在 OpenBSD 上使用 httpd 和 WireGuard 通过 VPS 隧道隐藏 IP 来设置自托管网页服务器的逐步指南。
@avrldotdev: 最佳指南,适合任何人深入了解HTTP服务器工作原理并亲手构建一个。本文将帮助你学习:0. 网络…
一份全面的指南,介绍HTTP服务器的工作原理,涵盖网络协议、分块编码、状态机、解析器编写和并发基础知识,并附有亲手构建的说明。
用 aarch64 汇编构建 Web 服务器,给我的生活(缺乏)意义
本文介绍了 'ymawky',一个完全用 aarch64 汇编为 macOS 编写的最小 HTTP Web 服务器,使用原始系统调用而无需 libc 包装器,以探索底层系统机制。
死而未僵的软件:relayd(8) 与 httpd(8) 的持续演进
一篇博客文章,详细介绍了 OpenBSD 的 relayd(8) 和 httpd(8) 守护进程正在进行的复兴与现代化,包括使 imsg 消息系统现代化以及处理待定补丁的努力,作者称 LLM 是促使自己回归 C 语言编程的动因。
Show HN: 用汇编语言构建 Web 服务器,为我的生命赋予(些许缺乏的)意义
ymawky 是一个专为 macOS 编写的 ARM64 汇编 Web 服务器,其特点是不依赖 libc 仅使用系统调用,并具备基本的 HTTP 功能。