althttpd:SQLite作者的单个C代码文件中的简单Web服务器

2021-06-08 17:25:45

althttpd是一个简单的webserver,它运行了https://sqlite.org/ websitewsincesince 2004. althttpd争取简单,安全性和低的卢索斯。

截至2018年,SQLite.org的althttpd实例为Sqlite.org解答每天的500,000个HTTP请求(大约5或6个每秒)每天提供约50GB的内容(约4.6兆比特/秒),在40美元/月的Linode上。该机器上的负载平均值通常保持约0.1或0.2。大约19%的HTTP请求是CGI到各种FOSSILSOURCE - 代码存储库。

althttpd通常从xinetd或stunnel4发射。为每个传入连接启动单独的Processis,并且该过程无线集中在服务一个连接上。单个althttpdprocess将通过相同的连接处理一个或多个HTTP请求。当连接关闭时,Althttpd进程退出。

althttpd也可以单独操作。 althttpditself侦听端口80用于传入HTTP请求,然后forksa自身副本来处理每个入站连接。每个连接仍然使用单独的过程处理。唯一的区别是Connection-Handler进程现在由MasterAlthttpd实例而不是xinetd或stunnel4启动。

althttpd没有配置文件。所有配置都涉及一些命令行参数。这有助于保持Chonugation简单,并通过错误配置的Web服务器介绍介绍安全漏洞的担忧。

althttpd本身并不是处理TLS连接。对于HTTPS,Althttpdrelies在STunnel4上处理TLS协议协商,解密,entencryption。

因为每个althttpd进程只需要为singleconnection服务,所以althttpd是单线程。此外,每个处理的每个处理都在一个连接的持续时间内,这意味着虽然内存泄漏不需要担心太多的内存。这些设计因素有助于保持Althttpd源代码简单,这有助于安全审计和分析。

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

althttpd源代码是大量评论和可访问的。它应该相对容易地自定义专门需求。

下面如下所示是/etc/xinetd.d/http文件onsqlite.org的完整文本,它将althttpd配置为IPv4和IPv6上的Server Uneccryptedhttp请求。您可以使用它作为模板来创建自己的安装。

服务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 -Umer www-data bind = 45.33 .6.223}服务http {port = 80 flags =重用IPv6绑定= 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)的根目录中,然后在读取电线的任何内容之前丢弃超级用户权限。 -User选项告诉Althttpd在进入Chroot Jail后成为用户www-data。

-root选项告诉althttpd在哪里找到文档层次结构。在sqlite.org的情况下,所有内容都是从/home/www.at服务的,本文档层次结构的顶级是一群目录why negry以&#34为止; .website"每个此类目录都是一个单独的网站。该目录是基于主机:ComcomComing HTTP请求的参数。 sqlite.orgis上的目录的部分列表:

对于每个传入的HTTP请求,althttpd获取主机的文本:请求标题中的参数:将其转换为小写,而ASCII字母数字以外的更改链字符为" _"结果用于内容的子目录。如果没有匹配," default.website"目录用作回退。

例如,如果主机参数是" www.sqlite.org"然后将名称呈现为" www_sqlite_org.website"这是用于服务内容的目录。如果主机参数是" fossil-scm.org" thenthe" fossil_scm_org.website"使用目录。通常,两个或更多的名称是指同一个网站。例如,Fossil-SCM.org,www.fossil-scm.org,fossil-cm.com和www.fossil-scm.com都是Thesame网站。在这种情况下,通常只有一个目录ISA实时目录,其他目录是符号链接。

在仅托管单个网站的最小安装上,它足以有一个名为" default.website&#34的单个子目录。

在* .website目录中,要服务的文件由HTTP请求URI选中。标记为可执行文件的文件是runas cgi。具有以&#34结尾的名称的非可执行文件; .scgi"它具有表单的内容和#34; scgi hostname端口"继电器Quest到主机名:端口。所有其他不可执行的文件都已提供。

如果请求URI指定* .website中的目录的名称,然后是althttpd附录" / home" /#34; /index.html" ;,和#34; /index.cgi&# 34;,inthat命令,寻找一场比赛。

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

对于AS-IS提供的内容,使用编译为ALTHTTPD的表从FILENAMEEEENTINGS推断MIME类型。

althttpd本身没有做任何加密。使用althttpd设置加密网站,推荐的技术使用stunnel4。

cert = /etc/letsencrypt/live/sqlite.org/fullchain.pemkey = /etc/letsencrypt/live/sqlite.org/privkey.pem\[https\ richeach = ::: 443TimeOutClose = 0exec = / USR / Bin / althttpdexecargs = / usr / bin / althttpd -logfile /logs/http.log -root / home / www -Uner www-data -https 1

此设置与xinetd设置非常相似。一个关键差异是" -https 1"选项用于告诉althttpd,即连接是未被卷积的。这是重要的,使得althttpd将知道为CGI程序设置HTTPS环境变量。

可以同时配置托伦althttpd两者和stunnel4。事实上,这就是Thesqlite.org网站的工作方式。请求http://sqlite.org/ go to terxinetd和请求https://sqlite.org/通过stunnel4。

在作者' s桌面工作站上,在他的主目录中是一个子目录,是一个子目录〜/ www / default.website。该子目录包含一个集合的oveciles和CGI脚本。 althttpd可以通过运行以下命令来服务于那里的内容:

" - 口岸8080"选项是告诉althttpd在ital-alonemode中运行,侦听端口8080。

Althttpd的作者只使用了用于测试的独立模式.Since althttpd本身并不支持TLS加密,Thestunnel4设置是生产网站的首选。

为了防御恶作剧,据众不管们的档案名称有限制。在请求URI中,所有字符其他字符和", - 。/:〜"被转换为单个" _"此外,如果请求URI的任何路径元素以&#34开头;"或" - "然后,alalthttpd始终返回404未找到错误。因此,只要文件名与""。"。&#34,它在文档层次结构中安全地到铺设文件(例如,CGI使用的数据库或CGI所使用的其他内容)。或" - "

例外:虽然althttpd通常返回404,但是对于从&#34开始的路径元素找不到的404;。",它确实允许请求uri以&#34开头的URI; /。众所周知/" 。和文件或目录名称" /。众所周知的/"被允许从#34开始;"或" - " (但不是" ..")。此例外是必要的,以便让Letsencrypt到网站的验证潜能机关。

如果文件名为" -auth"出现在内容层次结构中的任何位置,然后所有兄弟姐妹文件和较低级别目录中的所有文件都需要HTTP基本身份验证,如&#34的内容所定义; -auth"文件。 - " -auth"文件是纯文本和线程.Blank线条和以与#34开头的行;#"被忽略。其他线条有含义如下:

如果存在的话,HTTP-Redirect行将导致所有HTTP请求重定向到HTTPS请求中。 " -auth"文件是依次读取和处理的,所以在下面的&#34下面; http-redirect"从未见过或处理HTTP请求的线路。

仅存在HTTPS的行,如果存在,则意味着只允许允许HTTPS请求。任何HTTP请求都会导致404未找到错误。在HTTP-REDIRECT行之后,仅限HTTPS-ocke正常发生。

单线这个形式建立了"王国"用于基本身份验证。 Web浏览器通常将在询问用户名和密码的对话框中显示域名作为标题。

有多条用户线,一个用于每个有效用户。登录名:密码参数定义用户必须键入以获取访问该网站的用户名和密码。密码是清晰的文本 - HTTP基本身份验证不是最安全的身份验证机制。在成功登录后,名称存储在Remote_user环境变量中,以便CGI脚本访问它。名称和登录通常是相同的,但可以不同。

如果和#34;任何人和#34;遇到行,这意味着允许任何请求,即使没有提供用户名和密码。这条线与&#34结合使用 - 重定向和#34;导致所有普通的HTTP请求重定向到HTTPS而无需登录凭据。

-auth文件会导致将所有HTTP请求重定向到HTTPS,未知任何进一步登录。 (尝试它:访问http://sqlite.org/ ververify您被重定向到https://sqlite.org/。)

除了当然,密码不是一排" x"人物。此默认用于-auth文件的典型用途。访问权限授予单个用户到"私人&#34中的内容;子目录,只要用户使用HTTPS而不是HTTP进入。 " http-redirect"由于请求标题中包含的Passwordis,并且可以通过HTTP发送请求,强烈建议所有基本身份验证都强烈推荐所有基本身份验证。如果请求通过HTTP发送,则可以通过错误的家伙拦截。

如果在althttpd命令行上给出了-logfile选项,则为每个HTTP请求附加到名称文件。日志文件处于逗号分隔值或CSV格式,指定了RFC4180。这是一个评论源代码解释每个输出线的每个字段都意味着什么。

日志文件是CSV的事实使得可以轻松导入IntosQlite进行分析,使用这样的脚本:

创建表日志(日期文本,/ *时间戳* / IP文本,/ *源IP地址* / URL文本,/ *请求URI * / REF Text,/ * Exceer * / Code int,/ *结果代码。前:200 ,404 * / nin int,/ *字节是请求* / nout int,/ *字节回复* / t1 int,t2 int,/ *过程时间(用户,系统)毫秒* / t3 int,t4 int,/ * CGI脚本时间(用户,系统)毫秒* / t5 int,/ *挂钟时间,毫秒* / nreq int,/ *序列号的此请求* /代理文本,/ *用户代理* /用户文本,/ *远程user * / n int,/ *字节的脚本中的脚本* / lineno int / *生成日志条目* /)的源代码行;模式csv.import httplog.csv日志

-logfile选项上的文件名可能包含由strftime()扩展的基于时间的字符。因此,要导致每天使用的新日志文件,您可能会使用以下方式: