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

Aar*_*ken 40 c apache webserver http

在C或C++中是否有任何高性能(理想的事件和开源)Web服务器?

我希望能够使用它,因为它在我的应用程序中使用填充的HTTP Request类/结构调用方法/函数,然后我可以返回填充的HTTP Response类/结构.

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

如果您不知道任何此类服务器可用,您是否会建议编写我自己的Web服务器以适应任务?它不能基于文件,必须用高性能的C/C++编写.


编辑:我正在考虑像Ruby Mongrel for C这样的东西,如果有帮助的话.

Yar*_*hiy 67

我对我的工作有着同样的要求,所以我评估了许多解决方案:mongoose,libmicrohttpd,libevent.我也在考虑编写nginx模块.以下是我的发现摘要:

nginx的

nginx项目页面

我喜欢这台服务器并且经常使用它.它的性能和资源使用情况要比Apache好得多,我还在使用它,但计划迁移到nginx.

  • 非常好的可调性能.丰富的功能.可移植性.
  • 模块API没有记录,似乎非常详细.以此nginx hello world模块为例.
  • Nginx不使用线程但使用多个进程.这使得编写模块更加困难,需要学习共享内存的nginx API等.

猫鼬

猫鼬项目页面

  • 所有服务器的代码都在单个mongoose.c文件中(大约130K),没有依赖项.这很好.
  • 每个连接一个线程,所以如果你需要并发,你必须配置很多线程,即.高RAM使用率.不太好.
  • 性能很好,虽然不是特例.
  • API很简单,但您必须自己编写所有响应HTTP标头,即.详细了解HTTP协议.

libmicrohttpd

libmicrohttpd项目页面

  • 官方GNU项目.
  • 详细的API,对我来说似乎很尴尬,虽然比编写nginx模块简单得多.
  • 在保持活动模式下的良好表现(链接到我下面的基准测试),如果没有保持活力则不太好.

的libevent

libevent项目页面

Libevent库有内置的web服务器evhttp.

  • 它是基于事件的,使用libevent.
  • 简易API.自动构造HTTP标头.
  • 正式单线程.这是主要的缺点.我发现了一个hack,它使evhttp的几个实例同时接受来自同一套接字的连接.不确定它是否安全可靠.
  • 单线程evhttp的性能令人惊讶地差.多线程黑客工作得更好,但仍然不好.

G-WAN

G-WAN项目不是开源的,但我想谈谈它.

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

正如您所看到的,现有的替代品都没有让我满意.所以我开发了自己的服务器,这是......

NXWEB

NXWEB项目页面

功能亮点:

  • 非常好的表现; 查看项目页面上的基准
  • 可以服务数万个并发请求
  • 内存占用少
  • 多线程模型,旨在扩展
  • 特别轻松的代码库
  • 简单的API
  • 体面的HTTP协议处理
  • 保持活跃的联系
  • SSL支持(通过GNUTLS)
  • HTTP代理(具有保持活动连接池)
  • 非阻塞sendfile支持(具有可配置的小文件内存缓存; gzip预编码文件服务)
  • 开发人员的模块化设计
  • 可以作为守护进程运行; 重新启动错误
  • 开源

限制:

  • 取决于libev库(不再是)
  • 仅在Linux上测试过

  • 关于基准:我认为这不是讨论的好地方.我没有说在这篇文章中nxweb比g-wan快,所以你的论点似乎无关紧要.我建议在此讨论:https://groups.google.com/forum/?hl = en&fromgroups#!topic/nxweb/hA7b4v2hVdE (3认同)
  • 这是"正确的地方",你声称其他人"不稳定",但你不希望这个问题被讨论为NxWeb ...它跪在地上(683 req/s)与weighttp -n 100000 -c 1000 -t 6 -k -H"Accept-Encoding:gzip""http://127.0.0.1:80/loan?name=Eva&amount=1000000&rate=3.5&term=100"并且我们的"模块不是线程 - 安全的"*歌曲:这是代码(http://gwan.com/source/loan.c),G-WAN使用上面的weighttp命令以110k req/s的速度运行.我是G-WAN开发的一部分 - 您没有填写G-WAN错误报告来维持您的"不稳定"声明.使用loan.c,你会看到. (3认同)
  • NXWeb 基准测试不是很严格:G-WAN 占用 105 MB RAM?(三年内从未见过)NXWeb 从 req/s 范围中受益,而其他人只有一个值?尝试使用 1-1000 并发范围而不是一次性并发,这将使您的测试更相关。并说其他人崩溃或不稳定,说真的,如果你的项目很好,那么它不需要冒险这种卑鄙的行为。 (2认同)
  • 以下是图表:http://gwan.com/imgs/nxweb_3.0.1_100k.png vs http://gwan.com/imgs/localhost_gwan2.10.8.png 获胜者是... G-WAN(速度) 、CPU 和 RAM)- 不是上面宣传的 nxWeb。Yaroslav,这里是测试的源代码:http://gwan.com/source/ab.c,我尊重你的工作,对G-WAN也这样做。nxWEB 仍有改进空间以匹配 G-WAN 的性能。 (2认同)

Axe*_*ing 7

我建议编写一个可以与许多高性能Web服务器(甚至是闭源服务器)一起使用的FastCGI可执行文件.