在NetBSD上使用bozohttpd搭建简单的Web服务器

Lobsters Hottest 工具

摘要

在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` 托管多个网站!

相似文章

死而未僵的软件:relayd(8) 与 httpd(8) 的持续演进

Lobsters Hottest

一篇博客文章,详细介绍了 OpenBSD 的 relayd(8) 和 httpd(8) 守护进程正在进行的复兴与现代化,包括使 imsg 消息系统现代化以及处理待定补丁的努力,作者称 LLM 是促使自己回归 C 语言编程的动因。