下面显示的是 sqlite.org 上 /etc/xinetd.d/http 文件的完整文本,该文件配置 althttpd 以在 IPv4 和 IPv6 上提供未加密的 HTTP 请求。您可以将其用作创建自己的安装的模板。
service http { port = 80 flags = IPv4 socket_type = stream wait = no user = root server = /usr/bin/althttpd server_args = -logfile /logs/http.log -root /home/www -user www-data bind = 45.33.6.223 } service http { port = 80 flags = REUSE IPv6 bind = 2600:3c00::f03c:91ff:fe96:b959 socket_type = stream wait = no user = root server = /usr/bin/althttpd server_args = -logfile /logs/http.log -root /home/www -user www-data }
这里的关键观察是,端口 80 上的每个传入 TCP/IP 连接都会启动一个 /usr/bin/althttpd 的副本,并带有一些额外的参数,这些参数相当于 Web 服务器的配置。
请注意,althttpd 以超级用户身份运行。这不是必需的,但如果这样做,则 althttpd 会将自身移动到 Web 文档层次结构根目录(示例中为 /home/www)处的 chroot 监狱中,然后在读取任何内容之前放弃所有超级用户权限。-user 选项告诉 althttpd 在进入 chroot 监狱后成为用户 www-data。
-root 选项(始终应为绝对路径)告诉 althttpd 在哪里查找文档层次结构。在 sqlite.org 的情况下,所有内容都来自 /home/www。在此文档层次结构的顶层是一堆目录,其名称以“.website”结尾。每个此类目录都是一个单独的网站。根据传入 HTTP 请求的 Host: 参数选择目录。sqlite.org 上的目录部分列表如下
3dcanvas_tcl_lang_org.website 3dcanvas_tcl_tk.website androwish_org.website canvas3d_tcl_lang_org.website canvas3d_tcl_tk.website cvstrac_org.website default.website fossil_scm_com.website fossil_scm_hwaci_com.website fossil_scm_org.website system_data_sqlite_org.website wapp_tcl_lang_org.website wapp_tcl_tk.website www2_alt_mail_net.website www_androwish_org.website www_cvstrac_org.website www_fossil_scm_com.website www_fossil_scm_org.website www_sqlite_org.website
对于每个传入的 HTTP 请求,althttpd 获取请求头中 Host: 参数的文本,将其转换为小写,并将所有非 ASCII 字母数字字符更改为“_”。结果确定要使用哪个子目录作为内容。如果没有任何匹配项,则“default.website”目录用作回退。
例如,如果 Host 参数为“www.SQLite.org”,则名称将转换为“www_sqlite_org.website”,并使用该目录提供内容。如果 Host 参数为“fossil-scm.org”,则使用“fossil_scm_org.website”目录。通常,两个或多个名称引用同一个网站。例如,fossil-scm.org、www.fossil-scm.org、fossil-scm.com 和 www.fossil-scm.com 都是同一个网站。在这种情况下,通常只有一个目录是真实目录,而其他目录是符号链接。
在仅托管单个网站的最小安装中,只需一个名为“default.website”的子目录就足够了。
在 *.website 目录中,要服务的文件由 HTTP 请求 URI 选择。标记为可执行的文件将作为 CGI 运行。名称以“.scgi”结尾且内容为“SCGI hostname port”形式的不可执行文件将 SCGI 请求转发到 hostname:port。所有其他不可执行文件按原样交付。
如果请求 URI 指定 *.website 中目录的名称,则 althttpd 会按顺序附加“/home”、“/index.html”和“/index.cgi”,以查找匹配项。
如果 URI 的前缀与可执行文件的名称匹配,则该文件将作为 CGI 运行。对于按原样提供的内容,请求 URI 必须与文件的名称完全匹配。
对于按原样提供的内容,MIME 类型是根据文件名扩展名使用编译到 althttpd 中的表推断出来的。
使用 Xinetd 支持 HTTPS
从 2.0 版(2022-01-16)开始,althttpd 可选地支持 TLS 加密连接。使用 Xinetd 设置 HTTPS 网站与 HTTP 网站非常相似。xinetd 的适当配置是 /etc/xinetd.d 目录中名为“https”的单个文件,其内容如下
service https { port = 443 flags = IPv4 socket_type = stream wait = no user = root server = /usr/bin/althttpd server_args = -logfile /logs/http.log -root /home/www -user www-data -cert /etc/letsencrypt/live/sqlite.org/fullchain.pem -pkey /etc/letsencrypt/live/sqlite.org/privkey.pem bind = 45.33.6.223 } service https { port = 443 flags = REUSE IPv6 bind = 2600:3c00::f03c:91ff:fe96:b959 socket_type = stream wait = no user = root server = /usr/bin/althttpd server_args = -logfile /logs/http.log -root /home/www -user www-data -cert /etc/letsencrypt/live/sqlite.org/fullchain.pem -pkey /etc/letsencrypt/live/sqlite.org/privkey.pem }
当然,您需要调整路径名和 IP 地址,以使其适合您的特定安装。
此 https 配置文件与之前的 http 配置文件相同,只是有几处更改
- 将服务名称从“http”更改为“https”
- 将端口号从 80 更改为 443
- 向 althttpd 添加 -cert 和 -pkey 选项,以便它知道在哪里找到相应的证书和私钥。
创建新的 https 配置文件后,只需重新启动 xinetd(通常使用命令“/etc/init.d/xinetd restart
”),您现有的网站的 HTTPS 版本就会立即出现。