克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

写在前面

这是D.理查德·希普写的有趣http服务程序,很有意思,所以根据本人所能理解部分汉化. 介绍给大家. 这个对于IoT设备的伺服很有帮助,特别是IPv6对于设备,本人是这样认为的^_^

Althttpd 网络服务器

Althttpd 是一个简单的网络服务器,自 2004 年以来一直运行https://sqlite.org/网站。 Althttpd 力求简单、安全和低资源使用。

截至 2018 年,sqlite.org 的 althttpd 实例每天响应大约 500,000 个 HTTP 请求(大约每秒 5 或 6 个), 在每月 40 美元的Linode上提供大约 50GB 的内容(大约 4.6 兆位/秒)。 这台机器上的平均负载通常保持在 0.1 或 0.2 左右。 大约 19% 的 HTTP 请求是对各种Fossil源代码仓库的CGI 。

设计理念

Althttpd 通常从xinetdstunnel4 启动。 为每个传入连接启动一个单独的进程,该进程完全专注于为该连接提供服务。 单个 althttpd 进程将通过同一连接处理一个或多个 HTTP 请求。 当连接关闭时,althttpd 进程退出。

Althttpd 也可以单机运行。 Althttpd 本身在端口 80 上侦听传入的 HTTP 请求,然后派生自己的副本来处理每个传入的连接。 每个连接仍然使用单独的进程处理。 唯一的区别是连接处理程序进程现在由主 althttpd 实例启动,而不是由 xinetd 或 stunnel4 启动。

Althttpd 没有配置文件。 所有配置都使用一些命令行参数进行处理。 这有助于保持配置简单,并减轻对通过错误配置的 Web 服务器引入安全漏洞的担忧。

Althttpd 本身不处理 TLS 连接。 对于 HTTPS,althttpd 依赖 stunnel4 来处理 TLS 协议协商、解密和加密。

因为每个 althttpd 进程只需要服务一个连接,所以 althttpd 是单线程的。 此外,每个进程只在单个连接期间存活,这意味着 althttpd 不需要过多担心内存泄漏。 这些设计因素有助于保持 althttpd 源代码的简单,从而促进安全审计和分析。

源代码

althttpd 的完整源代码包含在单个 C 代码文件中,不依赖于标准 C 库之外。 源代码文件名为"althttpd.c"。 要构建和安装 althttpd,请运行以下命令:

gcc -Os -o /usr/bin/althttpd althttpd.c

althttpd 源代码有大量注释和可访问性。 针对特殊需求进行定制应该相对容易。

使用 Xinetd 进行设置

下面显示的是 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 文档层次结构根目录下的 chroot jail(示例中的 /home/www),然后在读取任何内容之前删除所有超级用户权限电线。 -user 选项告诉 althttpd 在进入 chroot jail 后成为用户 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",这是用于提供内容的目录。 如果主机参数是"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 主机名端口"的不可执行文件将 SCGI 请求中继到主机名:端口。 所有其他非可执行文件均按原样交付。

如果请求 URI 指定了 *.website 中的目录名称,则 althttpd 会按该顺序附加"/home"、"/index.html"和"/index.cgi",以寻找匹配项。

如果 URI 的前缀与可执行文件的名称匹配,则该文件将作为 CGI 运行。 对于原样内容,请求 URI 必须与文件名完全匹配。

对于按原样交付的内容,MIME 类型是使用编译到 althttpd 的表从文件扩展名中推导出来的。

使用 Stunnel4 设置 HTTPS

Althttpd 本身不做任何加密。 要使用 althttpd 设置加密网站,推荐的技术是使用stunnel4。

在 sqlite.org 网站上,/etc/stunnel/stunnel.conf 文件的相关行是:

cert = /etc/letsencrypt/live/sqlite.org/fullchain.pem key = /etc/letsencrypt/live/sqlite.org/privkey.pem [https] accept = :::443 TIMEOUTclose = 0 exec = /usr/bin/althttpd execargs = /usr/bin/althttpd -logfile /logs/http.log -root /home/www -user www-data -https 1

此设置与 xinetd 设置非常相似。 一个关键区别是"-https 1"选项用于告诉 althttpd 连接已加密。 这很重要,以便 althttpd 知道为 CGI 程序设置 HTTPS 环境变量。

可以同时将 xinetd 和 stunnel4 配置为运行 althttpd。 事实上,这就是 SQLite.org 网站的工作方式。 对http://sqlite.org/ 的请求通过 xinetd,对https://sqlite.org/ 的请求通过 stunnel4。

单机操作

在作者的桌面工作站上,他的主目录中有一个名为 ~/www/default.website 的子目录。 该子目录包含文件和 CGI​​ 脚本的集合。 Althttpd 可以通过运行以下命令来提供内容:

althttpd -root ~/www -port 8080 "-port 8080"选项告诉 althttpd 在独立模式下运行,监听端口 8080。

althttpd 的作者只使用了单机模式进行测试。 由于 althttpd 本身不支持 TLS 加密,因此 stunnel4 设置是生产网站的首选。

安全功能

为了防止恶作剧,althttpd 将服务的文件名有限制。 在请求 URI 中,除字母数字和",-./:~"之外的所有字符都转换为单个"_"。 此外,如果请求 URI 的任何路径元素以"."开头。 或 "-" 然后 althttpd 总是返回 404 Not Found 错误。 因此,只要文件名带有".",就可以安全地将辅助文件(例如,CGI 使用的数据库或其他内容)放在文档层次结构中。或者 "-"。

一个例外:虽然对于路径元素以"."开头的任何请求,althttpd 通常会返回 404 Not Found,但它确实允许 URI 以"/.well-known/"开头的请求。 并且"/.well-known/"下面的文件或目录名称允许以"."开头。或"-"(但不带"..")。 此例外是允许 LetsEncrypt 验证网站所有权所必需的。

基本认证

如果名为"-auth"的文件出现在内容层次结构中的任何位置, 则所有同级文件和低级目录中的所有文件都需要 HTTP 基本身份验证,如"-auth"文件的内容所定义。 "-auth"文件是纯文本和面向行的。 空行和以"#"开头的行将被忽略。 其他行的含义如下:

  • http-redirect(http重定向)

    http-redirect 行(如果存在)会导致所有 HTTP 请求重定向到 HTTPS 请求。 "-auth"(认证)文件按顺序读取和处理,因此"http-redirect"行下方的行对于http请求永远不会被看到或处理。

  • https-only(仅限于https)

    https-only 行(如果存在)表示仅允许 HTTPS 请求。 任何 HTTP 请求都会导致 404 Not Found 错误。 https-only 行通常出现在 http-redirect 行之后。

  • realm(领域) NAME(名称)

    这种形式的单行建立了基本身份验证的"realm(领域)"。 Web浏览器通常会在要求输入用户名和密码的对话框中将领域名称(realm name)显示为标题。

  • user(用户名) NAME LOGIN:PASSWORD(登录:密码)

    有多个用户行,每个有效用户对应一个。 LOGIN:PASSWORD 参数定义用户必须键入才能访问网站的用户名和密码。 密码是明文 - HTTP 基本身份验证不是最安全的身份验证机制。 成功登录后,NAME 存储在 REMOTE_USER 环境变量中,以便 CGI 脚本可以访问它。 NAME 和 LOGIN 通常相同,但可以不同。

  • anyone(任何人)

    如果遇到"anyone"行,则表示允许任何请求,即使没有提供用户名和密码。 此行与"http-redirect"结合使用,可以使所有普通 HTTP 请求重定向到 HTTPS,而无需登录凭据。

基本身份验证示例

http://www.sqlite.org/网站包含在顶层目录下的"-auth"文件,如下所示:

http-redirect anyone 该 -auth 文件会导致所有 HTTP 请求重定向到 HTTPS,而无需进一步登录。 (试试看:访问 http://sqlite.org/ 并验证您是否被重定向到 https://sqlite.org/。)

https://fossil-scm.org/private/上有一个"-auth"文件,如下所示:

realm Access To All Fossil Repositories http-redirect user drh drh:xxxxxxxxxxxxxxxx

当然,密码不是一行"x"字符。 这演示了 -auth 文件的典型用法。 授予单个用户访问"私有"子目录中的内容的权限,前提是用户使用 HTTPS 而不是 HTTP。 强烈建议将"http-redirect"行用于所有基本身份验证,因为密码包含在请求标头中,如果通过 HTTP 发送请求,则可能被坏人拦截和窃取。

日志文件

如果在 althttpd 命令行上提供了 -logfile 选项,那么每个 HTTP 请求的命名文件后都会附加一行。 日志文件采用RFC4180指定的逗号分隔值或 CSV 格式。 源代码中有一条注释解释了此输出行中每个字段的含义。

日志文件是 CSV 的事实使得很容易导入 SQLite 进行分析,使用这样的脚本:

CREATE TABLE log( date TEXT, /* Timestamp / ip TEXT, / Source IP address / url TEXT, / Request URI / ref TEXT, / Referer / code INT, / Result code. ex: 200, 404 / nIn INT, / Bytes in request / nOut INT, / Bytes in reply / t1 INT, t2 INT, / Process time (user, system) milliseconds / t3 INT, t4 INT, / CGI script time (user, system) milliseconds / t5 INT, / Wall-clock time, milliseconds / nreq INT, / Sequence number of this request / agent TEXT, / User agent / user TEXT, / Remote user / n INT, / Bytes of url that are in SCRIPT_NAME / lineno INT / Source code line that generated log entry */ ); .mode csv .import httplog.csv log -logfile 选项上的文件名可能包含由strftime()扩展的基于时间的字符。 因此,要使每天使用一个新的日志文件,您可以使用以下内容:

-logfile /var/logs/althttpd/httplog-%Y%m%d.csv 本页由 Fossil 2.16 [255a28b37a] 2021-06-24 16:40:48 大约 0.004 秒生成

MIT License Copyright (c) 2021 xchen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

有趣http服务程序是D.理查德·希普写的,很有意思 展开 收起
C
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化