集成XML解析器的嵌入式Web服务器

6
我有一个需求,需要将Web服务器集成到运行Linux的嵌入式设备中,并正在评估OSS和商业产品。
系统要求并不特别严格:-内存运行一组高达10MB的数据,-可以在300MHz ARM上空闲20%以上,并在爆发时提供更多,-UI将使用jQuery和JSON,因此希望在不到一秒钟的时间内提供几百KB页面,链接十几个CSS和JS文件。
功能要求:-支持HTTPS,-同时处理10个或更多连接,-经过充分测试以防范DOS攻击。
非常感谢提供一个集成的XML解析器,以便基于SOAP实现。
我不喜欢PHP,但对服务器端Javascript也不确定,也不熟悉Lua。因此,寻找模板解决方案的建议,也许是基于Python的堆栈。

我已经查看了stackoverflow上的讨论维基百科上的列表,并了解了tttpd, Mongoose, Cherokee, Appweb

目前,我邀请有生产质量部署的第一手经验的人提供详细技术建议和实现选择的讨论。


仍在评估选项,并欢迎更多的意见。Appweb、Mongoose和Cherokee仍然在考虑之中,但thttpd太过有限。希望了解可以制作多小的Apache配置,同时仍然使用Axis2 Web服务http://axis.apache.org/axis2/c/core。 - Walter K
4个回答

2
关于一个简单的Python服务器堆栈,社区内最常听到的轻量级实现组合是使用CherryPy(提供线程池WSGI服务器)和Werkzeug(创建应用程序的基本结构)。两者都是对WSGI的微小不同处理方式,可以极大地加速开发时间。
有一些很好的笔记概述了基本的Python框架比较(虽然不是在嵌入式环境中,但重点是轻量级部署)。在这个问题中,Alex "the Machine" Martelli为这两个框架发表了评论。 如果您能承受Python解释器的开销(我假设您可以,因为您将其包含在您的资格列表中),werkzeug是设置由简单端点组成的应用程序的绝佳方式。响应可以内联进行MIME类型,以帮助输出您的UI库(Jquery等)。Werkzeug文档中有很棒的示例。
我找到的关于比较WSGI服务器(以满足您对高并发连接和DOS生存能力的需求)最好的资源之一,可以在Nicholas Piel的博客文章中找到,在这篇文章中,CherryPy被评为速度方面最好的“物有所值”的资源之一。Cherry中的WSGI服务器已经准备就绪,可以作为提供环境给Werkzeug应用程序的服务器进程使用,因此您不需要实现像Apache与mod_wsgi这样更重的东西。在适度负载下,Cherry平均每秒可处理约2000个请求数,响应时间远低于一秒钟。

由于我不知道您将在什么设备上部署此应用程序,因此当然应该提到这两个平台都定期更新,因此如果由于某些原因分配网络资源来更新设备是不切实际的,则也应考虑这一点。

通过将 Python 的 minidom 模块(v2.6 +)与 Werkzeug 中的端点路由相结合,您应该也能从非常快的开发速度中受益。使用 Werkzeug 的 Map 功能构建复杂的 URL 架构很简单,在他们文档页面上的教程对此进行了详细介绍。两者之间,应该不难让您的 Web 服务运行起来。

我曾经看到过在全尺寸平台上成功使用Flask和Deform模板。非常感谢提供nichol.as网站链接的人,该网站提供了性能图表,让我得以进行数量级测量。 - Walter K

1
如果你只有10MB的话,那么很多建议都不适用:使用Node和Ruby只需要一个小应用程序就能迅速超出这个限制。PHP最低要求大约为8MB,但很快就会达到20+MB。我们曾经见过一个50MB的PHP管理应用程序,对于嵌入式系统来说绝对不是一个好选择,除非你有GB级别的空间。
我曾经使用过带有ESP的Appweb,它是一个C语言MVC框架,以及带有服务器端JavaScript的Ejscript。Ejscript具有XML解析器,并且可以处理SOAP需求。Appweb包含一个非常基本的XML解析器。如果您想要高级别的SOAP处理,您将需要libxml。
Appweb 4具有良好的DOS保护功能。您可以使用LimitRequestPerClient指令限制单个客户端的同时请求数量。LimitParseTimeout也有助于快速关闭未完成标头的DOS请求。Appweb安全沙箱具有许多指令,可帮助您描述负载,从而有助于防范DOS和其他安全威胁。
您的另一个选择是纯JavaScript并使用Ejscript,它内置了Appweb http引擎。

1

你需要先决定使用哪些服务器端技术。对于嵌入式系统,资源限制非常严格,因此请确保选择相应的轻量级技术!话虽如此,Node.js是一种很棒的技术(http://nodejs.org/),你可能想要关注一下。我也看到过一些针对它的SOAP实现。另一方面,基于javascript的开发可能会非常混乱!你可以尝试不同的解决方案,并使用JMeter等工具开始测试系统的功能行为(http://jmeter.apache.org)。

以下是一些建议:在嵌入式系统中设置一个轻量级的http服务器(例如Cherokee、lighttpd等),然后设置PHP(PHP也有一些SOAP工具)。稍后再用Python或Ruby解决方案(例如嵌入式Mongrel等)替换PHP。使用JMeter找出你的系统在重负载下的表现。


非常感谢指出JMeter的好处!尽管有些受人尊敬的人使用Node进行JavaScript服务器端开发,但我仍然不太确定。显然,Node有SOAP客户端,例如https://github.com/milewise/node-soap和https://github.com/marcgreenstock/douche。 - Walter K

1

我推断你嵌入式Web服务器的目的是提供配置、操作和状态等管理界面。

我们公司开发并部署了许多嵌入式系统上的管理Web界面,规格与您描述的相似,基于我们的产品Web。您可以在http://uweb.workware.net.au/了解更多我们的方法,同时您也可以阅读我在2010年嵌入式Linux大会上发表的一篇论文,链接为http://workware.net.au/papers/embedded-scripting.pdf,其中提供了我们如何通过脚本平衡大小和性能问题以实现快速部署的详细说明。

您有两个广泛的选择。第一个是使用像µWeb、Barracuda server(上面提到的)或开源框架等如luci (http://luci.subsignal.org/trac)这样的框架。第二个是使用您上面提到的轻量级Web服务器,然后构建自己的框架(基于jQuery和JSON)。第二种选择需要花费更长时间,并且安全性是一个问题,因为您需要处理XSS、CRSF和DOS攻击。

无论如何,我强烈建议您远离PHP、Python或服务器端Javascript。这些都对300MHz ARM平台来说过于资源密集。

如果您的管理UI将使用jQuery和JSON,为什么需要XML和SOAP呢?您是否有单独的SOAP支持要求?如果是这样,gSOAP可能是一个合理的选择(我上次使用它已经是几年前了)。

关于https和10个以上并发会话,请注意嵌入式平台上的初始SSL握手需要大量资源。如果您经常建立新请求(因为有新会话或请求未进行管道化),平台将会受到影响。您可能只能每秒建立1-2个SSL连接。


SOAP服务器端实现的要求是支持遗留接口,该接口与基于浏览器的用户界面并行公开设备属性和配置。 - Walter K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接