httpd
概述
httpd(8) 是 OpenBSD 原生的 Web 服务器守护进程。它简洁且以安全为核心,默认在 chroot(2) 中运行于 /var/www,提供静态内容,并将动态请求分发给 FastCGI 后端。TLS 内建支持,并与 acme-client(1) 集成以实现证书自动化管理。
OpenBSD 上的 Web 服务器历史
OpenBSD 最初随系统附带 Apache 1.3,曾短暂改用 nginx(OpenBSD 5.6–5.8),自 OpenBSD 5.9 起在基本系统中内置原生的 httpd(8)。
Web 服务器对比
配置
配置文件为 httpd.conf(5)。server 与 location 块中的路径相对于 /var/www chroot,除非另作说明。
提供静态内容的最小配置:
创建文档根目录与测试页:
使用 rcctl(8) 启用并启动服务:
随时校验配置:
日志
默认情况下,日志写入 chroot 内部:
实时跟踪请求:
可按服务器定制日志:
配合 acme-client(1) 使用 TLS
使用 acme-client(1) 从 Let's Encrypt 签发并续签 TLS 证书;下面的流程提供一套完整且现行的工作方式。
前提
DNS A/AAAA 记录已解析到本服务器。
TCP 端口 80 与 443 可达(按需调整 pf(4))。
ACME “http-01” 验证路径
/.well-known/acme-challenge/已暴露。
在 chroot 内创建标准验证目录:
暴露 ACME 验证
将验证路径映射到 /var/www/acme:
重载:
配置 acme-client(1)
创建 /etc/acme-client.conf(参见 acme-client.conf(5)):
/etc/ssl/private/ 下的私钥须仅 root 可读。
获取初始证书
成功后,证书链为 /etc/ssl/example.org.fullchain.pem,私钥为 /etc/ssl/private/example.org.key。
启用 HTTPS 并重定向 HTTP
端口 80 保留用于 ACME 验证与 301 重定向;端口 443 提供站点服务并启用 HSTS。
自动续签
定期调度续签,且仅在证书变化时重载;~ 会随机化分钟(参见 crontab(5))。
OCSP 装订
在线证书状态协议(OCSP) 提供证书吊销状态。OCSP 装订 让服务器从证书机构获取已签名的 OCSP 响应,并在 TLS 握手时一并附带(“装订”),从而提升隐私并降低延迟。
使用 ocspcheck(8) 生成并维护装订的 OCSP 响应,然后在 tls {} 块中引用。tls ocsp 的路径为绝对路径,不相对于 chroot。
通过 cron(8) 定期刷新,因为 OCSP 响应比证书过期更频繁:
若装订文件缺失或过期,TLS 仍可正常运行,只是不带装订;客户端可能回退到实时 OCSP 查询。
常见配置示例
所有指令均见 httpd.conf(5)。
301 重定向(永久)
HTTP→HTTPS(见上文) 与常见的主机名规范化:
目录迁移:
URL 前缀映射与整洁路径
使用 request strip 在文件查找前去除前导路径段。
单页应用回退:
HTTP 基本认证
OpenBSD 的 httpd 支持 HTTP 基本认证,可限制对特定位置的访问。
使用 htpasswd 文件
这种方式将凭据管理从主配置文件中分离,便于长期维护。
创建密码文件
在默认 chroot 内创建目录,并使用 htpasswd(1) 生成 bcrypt 密码哈希:
httpd.conf 中指定的路径须相对于 /var/www(默认 chroot 环境)。
在 httpd.conf 中引用
访问 /private/ 时,服务器会提示输入凭据,并按指定的 htpasswd 文件校验。
httpd(8)不支持在 httpd.conf 中内联用户名/密码块。请按上文所示使用
authenticate ... with "/path/to/htpasswd"。authentication { user ... }风格不适用于 OpenBSDhttpd。
静态 gzip 投递(gzip-static)
启用静态 gzip 压缩可节省带宽。当客户端接受 gzip 编码、且请求文件同时存在带 .gz 后缀的版本时,httpd 会以 Content-Encoding: gzip 投递压缩文件。
在 server 或 location 作用域启用:
部署时预压缩资源。常见文本类型的示例:
自定义错误响应
FastCGI 与动态内容
动态应用通过 FastCGI 提供。
使用 slowcgi(8)(基本系统)
启用包装器,并将匹配的 location 指向其套接字:
通过 php-fpm 使用 PHP(软件包)
为所选 PHP 版本安装并运行 php-fpm(服务名含版本号,例如 php84_fpm)。确保 FastCGI 套接字路径在 /var/www 内可见。
测试脚本:
安全说明
httpd(8) 以
_httpd用户运行,默认 chroot 到 /var/www。server/location上下文中的路径相对于 chroot。tls { certificate|key|ocsp }中的路径为绝对路径。在端口 80 上保留一个 HTTP 虚拟服务器,用于 ACME 续签与 301 重定向到 HTTPS。
在 pf(4) 中开放所需端口:
服务管理与排障
使用 rcctl(8) 管理守护进程:
语法检查与日志:
常见问题:
ACME 验证返回 404:检查验证用的
location块,确认 /var/www/acme 存在且可读。TLS 无法启动:确认证书与密钥路径可读;参见 httpd.conf(5) 的
tls块。FastCGI 错误:确认 chroot 内的后端套接字路径与权限。
最后更新于