Hiawatha

来自 ArchWiki

Hiawatha 是一个开源的 网络服务器,其三个主要特点是安全、易用和轻量级。它支持 CGIFastCGI、IPv6、URL 重写和反向代理等,并具有其他网络服务器没有的安全功能,例如阻止 SQL 注入XSSCSRF 和漏洞利用尝试。

注意: Hiawatha 不再积极开发:其创建者在 2019 年 2 月宣布他正在 缩减 这个始于 2002 年的项目。

安装

安装 hiawathaAUR 软件包。

配置

目录结构

首先,为了概述 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) 手册页。

注意: Hiawatha 支持即时 gzip 内容编码。它将 gzip 压缩请求的文件并将其缓存在磁盘上的 /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
注意: 应安装相应的语言解释器:对于 php,需要 phpphp-cgi,对于 python,需要 python

有关更多详细信息,请参阅官方 HowTo

FastCGI

安装 fcgi

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

提示: Hiawatha 支持 服务器名称指示,它允许在同一 IP 地址上服务多个证书,从而服务多个安全网站。要使用此功能,请在每个具有自己的 SSL/TLS 证书的虚拟主机的 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 需要两个步骤

  1. 将示例配置文件复制到用户区域 ~/.letsencrypt/,如果 hiawatha 作为系统服务运行,则通常为 /root/.letsencrypt/
  2. 编辑设置,特别是将 ACCOUNT_EMAIL_ADDRESS 的值替换为选定的电子邮件地址,lefh 将不会使用初始示例电子邮件地址运行。

获取证书

详细说明在 lefh(1) 中描述,工具的配置在 letsencrypt.conf 中定义。 简而言之,获取证书需要两个步骤

  1. 在 Let's Encrypt 证书颁发机构 (CA) 注册一个帐户。将创建一个帐户密钥文件。
    # lefh register
  2. 请求网站证书: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 对失败的尝试强制执行速率限制,并且可能会被暂时禁止。

注意: Let's Encrypt CA 在质询操作期间通过 HTTP 请求文件。此文件必须在类似 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 设置来控制。

每日安排此脚本是合适的,因为在达到阈值之前无论如何都不会采取任何操作。可以使用 cronsystemd/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

启动启用 lefh-renew.timer

注意: 该服务等待网络启动并在线,有关网络依赖性实现的更多信息,请参阅 systemd#网络启动后运行服务

参见