轻量级Web服务器的设计与实现外文翻译资料

 2022-11-13 17:39:13

英语原文共 5 页,剩余内容已隐藏,支付完成后下载完整资料


Yaws: 另一个Web服务器

“另一个Web服务器(Yet Another Web Server)”被谦虚的命名为Yaws,是一种以可靠性、稳定性、可扩展性著称的开源的Erlang Web服务器。它作为传奇的Erlang程序员Claes “Klacke” Wikstrouml;m的心血,编制开始于大约10年前,Claes还发明了一些Erlang重要的特性,包括Erlang长期存储(ETS),分布式Erlang,分布式数据库和Erlang点语法。这是由一个围绕着实现各种功能,如响应流、Ajax支持、WebSockets支持、公共网关接口(CGI)和快速公共网关接口(FCGI)支持以及应用嵌入的相对简单的核心组成的通用的HTTP 1.1 Web服务器。虽然它能完美的胜任执行定期文件服务,但它应用得最有用的是生成和服务动态内容。

配置,制造,安装

为了开始Yaws,你可以从它的主页:http://yaws.hyber.org 获取官方发布版,或者从Yaws github.com中检索最新的资源。

知识库:git clone git://github.com/klacke/yaws.git

你可以用两种不同的方式建立Yaws:使用GNU自动工具或者通过rebar Erlang构建工具(见https://github.com/basho/rebar)。

使用自动工具的方法:autoconf ./configure make amp;amp; sudo make install

这将建立Yaws并且通过默认安装到/usr/local/bin/yaws,Erlang beam字节码文件和Yaws系统的其它部分将安装到/usr/local下的其他地方。生成的配置脚本的命令行选项让你选择替代安装位置。这种方法适合将Yaws运行为一个独立的Web服务器。另外,你可以使用rebar建立Yaws:rebar compile 这种方法的结果是建立Yaws并且将其安装在它自己的区域,这也可以独立运行但是最适合于应用嵌入Yaws最为一个内部Web服务器。

运行时配置

Yaws的配置控制的细节,例如它在哪里查找正在服务的文件,监听哪些端口,以及加载哪些应用程序来处理请求。配置存在两个部分。服务器配置应用于单个虚拟服务器。一个单一的Yaws实例可以在相同的或不同的ip地址主机多虚拟服务器。服务器配置控制特性例如服务器在哪个端口和ip地址监听请求、在文件系统中的根路径来自于哪一个Yaws服务文件、服务器可以执行的脚本的类型、以及应用模块或者被分配到不同URI路径的appmods。Appmods对于动态Yaws Web应用程序是非常有用的,所以之后关于它们我将会呈现出更多的细节。

全局配置作为一个整体适用于运行的Yaws实例。它指定日志所存放的目录、哪个Erlang字节码被加载、并从其中检索包含用于动态编译的应用程序代码的文件。它还为Yaws内部文件缓存设置了大小和超时限制。

在默认配置中,Yaws在启动时读取文件,监听8000端口建立一个常规的HTTP服务以及监听4443端口建立一个安全套接字层服务。不改变默认的配置需要有一个工作系统,不过你当然可以根据你的喜好来自由的编辑配置。广泛的文档可用于所有全局和服务器配置设置。在内部,Yaws使用一个命名为gconf的Erlang记录来代表全球配置,服务器配置使用Erlang sconf记录。这些记录是在公众中定义的,包括使用Yaws应用文件,特别是那些开启Yaws作为一个嵌入式Web服务器。嵌入式应用程序不能依赖Yaws从一个文件读取它的配置,当将其开启为一个嵌入式服务器时,必须通过gconf和sconf记录实例反馈一个有效的配置给Yaws。

文件服务

Yaws主要针对生成动态内容的应用程序,但是如果无法提供文件,我们不能将其视为通用的Web服务器。每个服务器配置告诉Yaws在哪里找到该服务器的文档根,然后Yaws使用请求URI路径来查找与该根相关的请求的文件。除了在Erlang Web服务器之间使用sendfile操作系统系统调用,可以使文件传递尽可能高效之外,Yaws的文件服务功能没有什么特别之处。然而,它可能不会永远持有这种区别,因为在撰写本文时,sendfile能力是从Yaws中提取出来的,并且重构后包含在Erlang及其相关的开放电信平台(OTP)实用框架。

图1. example.yaws文件。

此文件显示嵌入在lt;erlgt;和lt;/ erlgt;标签之间的Yaws out / 1 Erlang函数。 当客户端请求example.yaws页面时,Yaws调用out / 1函数,必要时首先编译它,并用它的返回值代替lt;erlgt;和lt;/ erlgt;标签之间的所有内容。 然后Yaws将生成的HTML页面返回给客户端。

一旦它出现,它将普遍适用于所有Erlang的Web服务器和其他应用程序。

动态应用程序

由于Yaws主要针对动态应用程序,它为它们提供了几个有用的功能。一个这样的特征是“ehtml”,这是表示为Erlang术语的常规HTML。例如,这里有一些简单的HTML:

这是ehtml中表示的内容:

如示例所示,ehtml结构非常类似于对应的HTML,但是,假设熟悉Erlang语法,ehtml更容易阅读。每个HTML标签被表示为Erlang原子,并且每个构造通常是包括标签,属性列表和主体列表的3元组。例如,这里显示的head标签有一个空的属性列表和一个由标题3元组组成的主体列表,它本身也有一个空的属性列表和一个主体列表,标题字符串(在Erlang中,字符串只是 字符列表)。应用程序可以比HTML字符串更容易创建ehtml结构,ehtml不容易出错,因为Erlang编译器强制执行元组和列表的语法正确性。

相关的动态应用程序功能是在HTML中嵌入Erlang代码的能力。 当一个请求到达具有“.yaws”后缀的文件时,Yaws会处理在lt;erlgt;和lt;/ erlgt;标签之间的文件中发现的任何Erlang代码,替换标签和它们之间的代码。 这样的代码,预期存在于一个名为out / 1(其中“/ 1”表示函数arity或参数的数量)的函数内,被编译和缓存以备将来调用。

图2.应用程序模块。 这个appmod out / 1函数返回一个适合创建一个新资源的POST请求的响应。 它首先获得目标URI,并用新资源的标识符来增加它的副本。 然后,它创建一个带有“location”键的JSON对象来存储新的资源URI,并返回新的URI作为响应Location头的值。 结果指定HTTP状态和位置头,并包括JSON对象字符串作为响应正文。

例如,考虑图1中有些繁杂的example.yaws文件。如果客户端从Yaws服务器请求此资源,则所提供的实际文档取决于在URI中出现的查询参数“title”和“name”的值,用于 访问资源。 在代码中,对yaws_ api:queryvar / 2函数的两次调用返回两个查询参数的值,然后用于完成从out / 1函数返回的ehtml。 通过URI http://example.org/example访问资源。 yaws?title = Example&name = Joe将文本“Example”替换为标题,将名称“Joe”替换为段落文本的可变部分。 这个例子虽然设计(并且可能不安全,假设查询参数值被非转义地使用),显示了应用程序如何调用任何Erlang函数来动态创建任何想要返回到其客户端的内容。

Arg数据

您可能注意到了称为Arg的参数传递给out / 1函数。 这是Yaws的arg记录的一个实例,这个结构封装了Yaws对当前请求知道的一切,包括

bull;客户端连接套接字,

bull;客户端IP地址和端口,

bull;请求标头,

bull;请求URI的路径部分的各个部分,

bull;请求主体(如用于HTTP POST,PUT和PATCH)(如果有)和

bull;查询参数(如果有)。

arg实例是Yaws应用程序编程的关键。 一旦Yaws将它传递给你的代码,代码就可以将它传递回各种Yaws函数,从中提取信息,以帮助完成请求。

Appmods

并不是所有的Web资源都只能用HTML表示,所以不是所有的应用程序都可以使用ehtml或“.yaws”页面。 希望处理常见格式(如XML和JSON)的Yaws应用程序可以通过appmods执行此操作。 一个appmod在概念上很简单:它是一个Erlang模块,它导出一个out / 1函数。 您配置Yaws以将模块与URI路径的一部分相关联。 当配置的服务器接收到包含该路径的请求时,Yaws调用appmod的out / 1函数,向其传递表示请求的arg实例。 例如,在路径“/”下的给定服务器中注册appmod意味着它将接收发送到该服务器的所有请求。

out / 1函数的结果通常提供客户机响应的状态,头和主体。 例如,图2中的appmod返回适合创建新资源的POST请求的响应。

这个out / 1函数创建一个新的资源和一个URI来标识它。它首先从请求Arg中提取目标URI,它返回一个Yaws url记录实例。然后它调用create_new_id / 0函数来生成一个新的标识符以在新的URI中使用(create_new_id / 0的细节在这里不重要)。然后它复制目标URI记录,但将其路径组件设置为新的URI路径字符串的组件。要创建响应主体,它使用Yaws json2模块创建一个JSON对象,其“location”键包含新资源的URI字符串。最后,它返回指定HTTP响应的元组列表:指示创建新资源的201状态代码,指定新资源的URI的位置HTTP头,以及作为由“应用程序”指定的JSON字符串的内容主体/ json“媒体类型。在将响应写入客户端连接套接字之前,Yaws用其他典型的头文件(例如Date,Server和Content-Length)来扩展这一点。

Appmods是无限灵活的。 为了处理请求和表单响应,它们可以调用数据库,调用后端服务,实现缓存或与其他Erlang节点上的副本进行通信。 您可以将它们实现为常规函数或调用标准Erlang行为(如gen_server和gen_fsm)的实例。

Yapps

appmods的一个缺点是,要部署他们需要配置更改以将appmod与URI路径关联。 如果应用程序是由单个开发人员或小团队开发的,这不是一个大问题。 然而,考虑到Erlang / OTP配备了模块化应用程序打包和部署系统,允许来自独立开发人员的应用程序一起部署在单个Erlang节点中。 在这个系统下,如果Web应用程序可以从独立开发的组件应用程序拼接在一起,并且可以部署到已经运行的Yaws实例,而不需要更改配置文件,这将是很好的。

yapp,“Yaws应用程序”的缩写,类似于一个appmod,但包含一个整个Erlang应用程序,而不仅仅是一个单一的模块。 这意味着应用程序启动的方式,其监督树以及它在运行时升级的方式都独立于Yaws。 为了启用yapp注册,Yaws提供了一个yapp模块,允许通过网页在URI路径下注册,而不需要更改配置文件。 但是与appmods一致,每个yapp只是提供一个或多个out / 1函数,当Yaws调用时,它决定分派一个请求到yapp。

稍等,还有更多内容

Yaws提供的功能包括文件服务,ehtml,“.yaws”页面,appmods和yapps。 它还提供了该列空间不允许我详细描述的各种其他特征,包括但不限于

bull;精确重写。应用程序可以注册模块,可以在Yaws分派请求之前检查和修改请求arg记录实例,这允许应用程序影响如何进行分派。

bull;CGI和FCGI支持。这允许Yaws通过调用支持这些协议的外部程序和脚本语言(如PHP和Perl)来满足客户端请求。

bull;Websockets。 Yaws客户端可以发送HTTP升级请求,要求Yaws将协议切换到websockets,这允许客户端和服务器之间的独立于HTTP的双向通信。在写这篇文章的时候,websockets规范仍然是草稿形式,没有最终确定,所以Yaws支持目前被认为是实验性的,可能会改变。一旦规范完成,我们将更新Yaws以符合它。

bull;响应流。这允许Yaws应用程序从本质上接管来自Yaws的客户端连接以流式传输对客户端的响应,这对于例如长轮询应用(Comet应用)或用于服务视频流是有用的。应用程序out / 1函数返回一个指示给Yaws,它想从给定的Erlang进程(这是一个非常轻量级的线程)流式响应客户端,之后,Yaws发送消息到该进程,告诉它现在拥有客户端套接字。一旦应用程序的进程完成了套接字,它会发送一个消息给Yaws返回套接字所有权。

bull;JSON-RPC和SOAP。这两个协议通过HTTP隧道传输,让客户端以不同于HTTP允许的方式与远程资源进行交互。 JSON-RPC和SOAP都允许远程过程调用(RPC)到远程资源,SOAP还允许通过非RPC XML消息交换与远程资源交互。这两种方法的根本缺陷在于,它们将HTTP作为传输协议而不是实际上是应用协议,从而绕过并消除了它提供的许多解耦,可演进性和可扩展性优点。尽管有

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[137197],资料为PDF文档或Word文档,PDF文档可免费转换为Word

您需要先支付 30元 才能查看全部内容!立即支付

课题毕业论文、外文翻译、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。