Hiawatha
Hiawatha 是一个开源的 网络服务器,其三个主要特点是安全、易用和轻量级。它支持 CGI、FastCGI、IPv6、URL 重写和反向代理等,并具有其他网络服务器没有的安全功能,例如阻止 SQL 注入、XSS、CSRF 和漏洞利用尝试。
安装
配置
目录结构
首先,为了概述 Hiawatha 的整体目录结构,下面显示了默认配置建议的层次结构
/etc/hiawatha/
- 程序配置文件/etc/hiawatha/tls/
- 网站 TLS 证书/srv/http/hiawatha/
- 与 IP 地址关联的默认空白网站的根目录/var/lib/hiawatha/
- http 压缩和上传的缓存/var/log/hiawatha/
- 程序和默认网站的日志文件/srv/http/my-domain/public/
- 网站根目录/srv/http/my-domain/log/
- 网站日志文件
基本网络服务器设置
Hiawatha 配置文件是 /etc/hiawatha/hiawatha.conf
。提供了一个配置文件示例 /etc/hiawatha/hiawatha.conf.sample
。
在示例设置中,有一个默认网站附加到域名的 IP 地址,它是一个虚拟网站,指向一个空白 html 页面。这是 IP 扫描机器人和黑客将面对的页面。
然后,使用 VirtualHost
部分定义工作网络服务器。Hiawatha 可以服务多个网络服务器,并且每个部分都描述一个不同的服务器。为了初始测试目的,您可以为 my-domain 创建一个 VirtualHost
,并在其根目录 /srv/http/my-domain/public
中保存一个虚拟 index.html
启动文件。
接下来,启用 并 启动 hiawatha.service
,并将浏览器指向 http://my-domain
。在该阶段,您应该能够加载网站启动页面。
有关更多详细信息,请参阅官方 操作指南 和 hiawatha(1) 手册页。
/var/lib/hiawatha/gzipped/
中。每次再次请求该文件时,将使用磁盘上已 gzip 压缩的版本。它会注意到文件更改(时间戳和大小),并且在重新启动时清除缓存。CGI
通用网关接口 (CGI) 脚本可以与 Hiawatha 开箱即用,只需在 VirtualHost
部分中启用 CGI 模块,如下所示
/etc/hiawatha/hiawatha.conf
VirtualHost { ... ExecuteCGI = yes }
CGI 脚本解释器
要在您的网站中使用 CGI 脚本,您必须指定常见的脚本文件扩展名和可以运行它们的二进制文件的位置。这在配置文件的主要部分中指出
CGIhandler = /usr/bin/php-cgi:php CGIhandler = /usr/bin/perl:pl CGIhandler = /usr/bin/python:py
有关更多详细信息,请参阅官方 HowTo。
FastCGI
Hiawatha 支持两种不同的方法将信息发送到 FastCGI 进程:Web 服务器可以通过 Unix 域套接字 或 TCP 连接 进行通信。通信类型在 FastCGIServer
部分中通过字段 ConnectTo
定义。
启用 SSL/TLS
首先,需要 X.509 SSL/TLS 证书才能使用 TLS。如果您没有证书,可以使用 #自签名证书 或从 #Let's Encrypt 证书 颁发机构免费使用一个证书。
证书文件中项目的顺序必须如下
serverkey.pem
-----BEGIN RSA PRIVATE KEY----- [webserver private key] -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- [webserver certificate] -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- [optional intermediate CA certificate] -----END CERTIFICATE-----
为了支持 SSL/TLS,应添加以下 Binding
部分,该部分配置 Hiawatha 以使用证书进行 HTTPS 连接
/etc/hiawatha/hiawatha.conf
Binding { Port = 443 TLScertFile = /etc/hiawatha/tls/serverkey.pem }
完成后,重启 hiawatha.service
。
VirtualHost
块内添加 TLScertFile
设置。当没有为网站定义虚拟主机时,将使用 Binding
部分中指定的证书。/etc/hiawatha/hiawatha.conf
VirtualHost { Hostname = www.website.org ... TLScertFile = website.pem }
反向代理
Hiawatha 的手册页建议使用以下内容
ReverseProxy [!]<pattern> [<skip directories>] http[s]://<hostname>[:<port>][/<path>] [<timeout>] [keep-alive]
<timeout>
是 Hiawatha 尝试连接到其他 Web 服务的时间(以秒为单位)。添加 keep-alive
启用与最终 Web 服务器的 keep-alive 连接。
例如,将来自 https://service.domain.net
的请求转发到端口 8181
上另一个本地运行的 Web 服务的 Web 服务反向代理配置如下所示(超时 10 秒)
/etc/hiawatha/hiawatha.conf
VirtualHost { Hostname = service.domain.net WebsiteRoot = /var/www/domain StartFile = index.html ReverseProxy .* http://127.0.0.1:8181/ 10 RequireTLS = yes }
如果需要 UNIX 套接字,则
ReverseProxy .* /unix/socket 10
证书
自签名证书
要获取本地自签名证书以供个人使用、测试或 Web 开发,可以按照 OpenSSL#生成自签名证书 中的步骤创建私钥和自签名证书。
确保您已将 SSL 捆绑路径添加到您的 hiawatha.conf
中,如 #启用 SSL/TLS 中所述。
由于此解决方案不使用官方证书颁发机构 (CA),因此首次访问该网站时需要添加安全例外。
Let's Encrypt 证书
配置
Hiawatha 提供了一个脚本,可以使用 ACME v2 协议以自动方式获取 Let's Encrypt 证书。
目录 /usr/lib/hiawatha/letsencrypt
中提供了一个配置文件示例 letsencrypt.conf
。 设置 lefh 需要两个步骤
- 将示例配置文件复制到用户区域
~/.letsencrypt/
,如果 hiawatha 作为系统服务运行,则通常为/root/.letsencrypt/
。 - 编辑设置,特别是将
ACCOUNT_EMAIL_ADDRESS
的值替换为选定的电子邮件地址,lefh 将不会使用初始示例电子邮件地址运行。
获取证书
详细说明在 lefh(1) 中描述,工具的配置在 letsencrypt.conf
中定义。 简而言之,获取证书需要两个步骤
- 在 Let's Encrypt 证书颁发机构 (CA) 注册一个帐户。将创建一个帐户密钥文件。
# lefh register
- 请求网站证书:www.my-domain.org 必须是
VirtualHost
的第一个主机名。任何后续 Web 服务器的主机名将用作证书的备用主机名。请注意,通配符不能在主机名中使用:即使 Let's Encrypt 接受此功能,也只能通过 DNS 质询获得,而 lefh 不支持此方法。
将创建文件 www.my-domain.org.pem
。
# lefh request www.my-domain.org
如果以上操作成功,您可以通过更改配置文件中的 LE_CA_HOSTNAME
设置从测试 CA 切换到生产 CA,并再次执行上面的两个步骤。在确保测试成功之前,不要急于投入生产:letsencrypt 对失败的尝试强制执行速率限制,并且可能会被暂时禁止。
http://www.my-domain.org/.well-known/acme-challenge/Cl887Wpvc297mfkdNZRuAl48h_FTLnA_ZbhJo3FdExY
的位置可访问。因此,您的网站必须可以通过 HTTP 访问:外部端口 80
必须转发到您的服务器,并且必须在 hiawatha 中配置端口 80
的绑定,以便 Let's Encrypt CA 可以获取质询。自动续订
可以使用以下命令续订证书并在续订时重启服务器
# lefh renew restart
默认情况下,证书将在剩余时间少于 7 天时续订,并将写入 HIAWATHA_CERT_DIR
中指示的目录。续订前的天数可以通过 RENEWAL_EXPIRE_THRESHOLD
设置来控制。
每日安排此脚本是合适的,因为在达到阈值之前无论如何都不会采取任何操作。可以使用 cron 或 systemd/Timers 实现此每日自动化
使用 cron 自动化
为了自动化证书的续订,为 root 用户计划一个 cronjob 以运行上面的命令行。
使用 systemd 计时器自动化
可以使用 systemd 计时器 来重复续订过程
/etc/systemd/system/lefh-renew.service
[Unit] Description=Renew Let's Encrypt certificates for Hiawatha Wants=network-online.target After=network-online.target [Service] User=root WorkingDirectory=/tmp Type=oneshot ExecStart=/usr/bin/lefh renew restart
/etc/systemd/system/lefh-renew.timer
[Unit] Description=Daily renewal of Let's Encrypt's certificates for Hiawatha [Timer] OnCalendar=daily # Be kind to the Let's Encrypt servers: add a random delay of 12 hours RandomizedDelaySec=12h Persistent=true [Install] WantedBy=timers.target