在C / C ++中的高性能应用程序Web服务器

在C或C ++中是否有任何高性能(理想情况下是开放源代码的)Web服务器?

我希望能够使用它,因为它调用我的应用程序中的方法/函数与填写HTTP请求类/结构,然后我可以返回一个填充的HTTP响应类/结构到它。

如果它不是开源的,我需要内置支持长轮询连接,保持活动等,否则,我认为我可以自己添加这些东西。

如果你不知道任何这样的服务器可用,你会build议写我自己的Web服务器,以适应任务? 它不能基于文件,而必须用高性能的C / C ++编写。


编辑:我想像C的Ruby Mongrel的东西,如果有帮助。

我对自己的工作有着相同的要求,所以我评估了一些解决scheme:mongoose,libmicrohttpd,libevent。 而且我也在考虑编写nginx模块。 以下是我的发现的总结:

nginx的

nginx项目页面

我喜欢这个服务器,并使用它很多。 它的性能和资源使用情况比Apache还要好,我现在还在使用,但是计划迁移到nginx。

  • 非常好的可调性能。 丰富的function。 可移植性。
  • 模块API没有logging,似乎是非常详细的。 以这个nginx Hello World模块为例。
  • Nginx不使用线程,但使用多个进程。 这使得编写模块变得更困难,需要学习nginx API来共享内存等。

mongoose

mongoose项目页面

  • 所有服务器的代码都在单个mongoose.c文件(大约130K),没有依赖关系。 这很好。
  • 每个连接一个线程,所以如果你需要并发性,你必须configuration很multithreading,即。 高内存使用率。 不太好。
  • performance很好,虽然并不例外。
  • API很简单,但你必须自己编写所有的响应HTTP头,即。 学习HTTP协议的细节。

libmicrohttpd

libmicrohttpd项目页面

  • 官方的GNU项目。
  • 详细的API,对我来说似乎很尴尬,虽然比写nginx模块简单得多。
  • 保持活着模式下的良好性能(链接到我的基准testing),如果没有保持活力,就不太好。

的libevent

libevent项目页面

Libevent库内置了名为evhttp的Web服务器。

  • 这是基于事件的,为此使用了libevent。
  • 简单的API。 自动构造HTTP头。
  • 正式的单线程。 这是主要的缺点。 我发现了一个黑客 ,这使得evhttp的多个实例同时接受来自同一个套接字的连接。 不知道它是否安全和健壮。
  • 单线程evhttp的性能是惊人的差。 multithreading的黑客工作得更好,但仍然不好。

G-WAN

G-WAN项目不是开源的,但是我想谈一谈。

  • 性能非常好,内存使用率低,可执行文件为150 KB。
  • 非常方便的“servlet”部署:只需将.c文件复制到csp目录中,然后运行服务器自动编译它。 代码修改也是即时编译的。
  • 简单的API。 尽pipe在某些方面受到限制。 丰富的function(json,键值存​​储等)。
  • 不稳定。 我有静态文件segfaults。 挂在一些示例脚本上。 (经验丰富的安装,从不混合不同版本的文件)。
  • 只有32位二进制 (不再是)。

所以,正如你所看到的,没有任何替代品已经完全令我满意。 所以我开发了我自己的服务器,这是…

NXWEB

NXWEB项目页面

function亮点:

  • 非常好的performance; 请参阅项目页面上的基准
  • 可以服务数万个并发请求
  • 小内存占用
  • multithreading模型旨在进行扩展
  • 特别轻的代码库
  • 简单的API
  • 体面的HTTP协议处理
  • 保持连接
  • SSL支持(通过GNUTLS)
  • HTTP代理(带有保持连接池)
  • 非阻塞sendfile支持(具有可configuration的小文件内存caching; gzip预编码文件服务)
  • 开发人员的模块化devise
  • 可以作为守护进程运行; 重新启动错误
  • 开源

限制:

  • 取决于libev库 (不再)
  • 只在Linux上进行testing

我build议写一个FastCGI可执行文件,可以与许多高性能的Web服务器(甚至是封闭源代码)一起使用。

mongoose:一个文件。 简单易用。 不是一个asycn io,但完美的embedded式和特定的目的。

金桂冠。 优秀。 没有崩溃。 超好计划的configuration。 非常聪明和容易的c / c + +开发,换句话说,非常干净明智的api与nginx相比。 提供每个核心的线程。 或任何你指定的。 一个很好的select。 最大的缺点(也许在这方面缺乏):不能通过代码。

libevent:单线程在单核机器上不是缺点。 毕竟它的重点是一个asynchronousI / O。 确实有其他内核的multithreading。

nginx:没有个人经验。 在不完整的服务器上获得认真的理由。 (非常混淆API)

提升asio:一个用于asynchio(asio)的c ++库。 真棒。 需要一个像我这样的傻瓜友好的更高层次的api。 以及来自php,java,javascript,node.js和其他网页语言的其他人。

python瓶:真棒1文件库(框架/系统),可以很容易地build立pythonnetworking应用程序。 有/是一个内置的httpd服务器,如libevent和node.js

node.js:javascript asyncio服务器。 一个很好的select。 不幸的是,必须在JavaScript中编程,这确实变得乏味。 而要完成这项工作还有什么可说的; 在这个过程中还有一些值得欣赏的地方。 希望没有人会出现node.php

我会提出与Axel Gneiting相同的事情,但是提供了一个答案,我采取这种方法的原因是:

1)作为协议,HTTP并不是微不足道的 – 编写自己的服务器或修改现成的解决scheme是一项非常复杂的任务 – 比使用可用的API来实现单独的处理引擎要复杂得多

2)使用(未经修改的)主streamnetworking服务器应该为您提供比您需要的更多的function(所以您有越来越多的空间)。

3)使用(未经修改的)主streamnetworking服务器通常意味着它比自制系统更广泛地进行testing和logging。

4)..更可能是安全和稳定的。

5)使用fastCGI,你可以使用各种语言来开发你的后端处理,包括C ++和C语言。有一些标准的工具包可以帮助你。

6)或者,许多Web服务器为运行中的解释器引擎(例如mod_php,mod_perl)提供支持。 我build议不要将自己的本地代码作为模块运行。

它不能基于文件。

嗯? 那是什么意思?

我是一个狂热的nginx用户; nginx是用C写的; nginx似乎可以为你工作。 如果你想从nginx中获得最好的速度,我会创build一个nginx模块。 以下是第三方模块 ,您可以查看它们以了解其需求。

至于长轮询的要求,你可能想看看http推模块。