SQLite 作者又一开源Web 服务器althttpd
SQLite 大家应该都知道吧,SQLite 是一款轻型的数据库,是遵守 ACID 的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低。
SQLite 的作者是 D. Richard Hipp(理查德希普),作者非常的有个性,用到的软件工具都是自己写,他写了不少工具,比如 SQLite、Bug 追踪系统 CVSTrac、版本管理系统 Fossil。
今天要推荐的就是理查德希普最新开源的 Web 服务器 althttpd,
Althttpd 通常从 xinetd 或 类似。为每个传入启动一个单独的进程 连接,这个过程完全专注于服务于 一个连接。单个 althttpd 进程将在同一连接上处理一个或多个 HTTP 请求。 当连接关闭时,althttpd 进程退出。
Althttpd也可以独立运行。Althttpd 本身在端口上侦听 80 用于传入的 HTTP 请求(或 443 用于传入的 HTTPS 请求), 然后分叉自身的副本以处理每个入站连接。每 连接仍使用单独的进程进行处理。唯一的 不同之处在于连接处理程序进程现在由 Master Althttpd 实例而不是 Xinetd。
Althttpd 没有配置文件。处理所有配置 使用一些命令行参数。这有助于保持 配置简单,减轻了对引入的担忧 通过配置错误的 Web 服务器造成的安全漏洞。
因为每个 althttpd 进程只需要为一个进程提供服务 连接,althttpd 是单线程的。此外,每个过程 仅在单个连接期间存在,这意味着 althttpd 不需要太担心内存泄漏。 这些设计因素有助于保持 althttpd 源代码的简单性, 这有助于安全审计和分析。
要提供 TLS 连接,有两个选项:
althttpd 可以使用定义并链接到的宏来构建,然后从 和 标志开始。ENABLE_TLS-lssl -lcrypto--cert fullchain.pem--pkey privkey.pem
althttpd 可以通过外部连接服务启动,例如 stunnel4,将标志传递给 althttpd 以告诉它它是 通过该服务“间接”在HTTPS模式下运行。-https 1
源代码
althttpd 的完整源代码包含在单个 C 代码文件,在标准 C 库之外没有依赖项。 源代码文件名为“althttpd.c”。 要构建和安装 althttpd,请运行以下命令:
gcc -Os -o /usr/bin/althttpd althttpd.c
althttpd源代码被大量注释和可访问。 根据特殊需求进行定制应该相对容易。
要使用libssl构建具有内置TLS支持的althttpd:
gcc -Os -o /usr/bin/althttpd -fPIC -DENABLE_TLS \
althttpd.c -lssl -lcrypto
使用 Xinetd 进行设置
下面显示的是 /etc/xinetd.d/http 文件的完整文本 将 althttpd 配置为服务器未加密 sqlite.org 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
}
这里的关键观察结果是,每个传入的TCP / IP连接都打开 端口 80 启动 /usr/bin/althttpd 的副本,并带有一些额外的 相当于 Web 服务器配置的参数。
请注意,althttpd 以超级用户身份运行。这不是必需的,但如果 完成后,althttpd 会将自己移动到根目录的 chroot 监狱中 的 Web 文档层次结构(示例中为 /home/www),然后删除 从线路读取任何内容之前的所有超级用户权限。 -user 选项告诉 althttpd 在输入后成为用户 www-data 奇鲁特监狱。
-root 选项告诉 althttpd 在哪里可以找到文档层次结构。 在 sqlite.org 的情况下,所有内容都从 /home/www 提供。 在此文档层次结构的顶层是一堆目录 其名称以“.website”结尾。每个这样的目录都是一个单独的目录 网站。根据 的 Host: 参数选择目录 传入的 HTTP 请求。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 采用主机的文本: 参数,将其转换为小写,并更改 除 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 主机名端口”形式的内容中继 SCGI 请求主机名:端口。传送所有其他不可执行的文件 按原样。
如果请求 UR...
点击查看剩余70%
网友评论