【问题标题】:high performance application webserver in C/C++C/C++ 中的高性能应用程序网络服务器
【发布时间】:2011-09-18 08:20:44
【问题描述】:

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

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

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

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


编辑:如果有帮助的话,我正在考虑类似 Ruby Mongrel for C 之类的东西。

【问题讨论】:

  • ajax:fastcgi++。 websockets: websocket++
  • 我认为您正在寻找的是 http 服务器库,而不是独立服务器。

标签: c http webserver apache


【解决方案1】:

我将提出与 Axel Gneiting 相同的建议 - 但已提供了我采用这种方法的原因的答案:

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

2) 使用(未经修改的)主流网络服务器应该为您提供比您需要的更多的功能(因此您有成长的空间)。

3) 使用(未经修改的)主流网络服务器通常意味着它比自制系统经过了更广泛的测试和记录。

4) .. 而且它更有可能是安全和稳定的。

5) 使用 fastCGI,您可以使用各种语言来开发后端处理 - 包括 C++ 和 C。standard toolkits 可以帮助您实现这一目标。

6) 或者,许多网络服务器支持在进程中运行解释器引擎(例如 mod_php、mod_perl)。不过,我建议您不要将自己的本机代码作为模块运行。

不能基于文件。

诶?这是什么意思?

【讨论】:

  • 如,我不希望服务器的想法是,请求URI是/my/something,所以找到文件something——你可以在某种程度上解决这个问题.htaccess for Apache中的示例,但它很丑陋,我宁愿不这样做。我希望服务器在读取时调用我的函数。
  • 重新模块 - 参见上面的 3 和 4。重新引用文件 - 然后将文档根目录设置为空目录。
【解决方案2】:

猫鼬:一个文件。简单易用。不是 asycn io,但非常适合嵌入式和特定用途。

关。优秀。没有崩溃。超精心计划的配置。换句话说,与 Nginx 相比,C/C++ 开发非常聪明和容易,非常干净、明智的 api。每个核心提供一个线程。或您指定的任何内容。一个很好的选择。最大的缺点(也许我在这方面缺乏):无法通过代码。

libevent:单线程在单核机器上并不是劣势。毕竟它的重点是异步 i/o。确实有其他内核的多线程。

nginx:没有亲身经历。在补丁服务器上取得了重大进展。 (非常混乱的 api)

boost asio:asynchio (asio) 的 c++ 库。惊人的。像我这样的傻瓜需要一个友好的高级 API。以及其他来自php、java、javascript、node.js等网络语言的人。

python bottle:很棒的 1 个文件库(框架/系统),可以轻松构建 python web 应用程序。 has/is 一个内置的 httpd 服务器,比如 libevent 和 node.js

node.js:javascript 异步服务器。一个很好的选择。不幸的是,必须用 javascript 编程,这确实变得乏味。虽然完成工作有话要说;在此过程中,您还可以说一些享受自己的话。希望没有人提出node.php

【讨论】:

  • 看看 libuv 和 http-parser,node.js 的 C 库。
  • 看看 civetweb,它是 MIT 许可的 mongoose 版本。
【解决方案3】:

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

nginx

nginx project page

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

  • 非常好的可调性能。丰富的功能。便携性。
  • Module API 没有记录,看起来很冗长。以nginx hello world module 为例。
  • Nginx 不使用线程,而是使用多个进程。这使得编写模块变得更加困难,需要学习用于共享内存的 nginx API 等。

猫鼬

mongoose project page

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

libmicrohttpd

libmicrohttpd project page

  • 官方 GNU 项目。
  • 虽然比编写 nginx 模块简单得多,但冗长的 API 对我来说似乎很尴尬。
  • keep-alive 模式下的良好性能(链接到下面我的基准测试),如果没有 keep-alive,性能就不那么好了。

libevent

libevent project page

Libevent 库有一个名为 evhttp 的内置 Web 服务器。

  • 它是基于事件的,为此使用 libevent。
  • 简单的 API。自动构造 HTTP 标头。
  • 正式单线程。这是主要缺点。我找到了a hack,它使多个evhttp 实例同时运行,接受来自同一个套接字的连接。不确定它是否安全可靠。
  • 单线程 evhttp 的性能出奇的差。多线程 hack 效果更好,但仍然不好。

G-WAN

G-WAN project 不是开源的,但我想说几句。

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

如您所见,现有的替代方案都没有让我完全满意。所以我开发了自己的服务器,就是……

NXWEB

NXWEB project page

功能亮点:

  • 非常好的性能;查看项目页面上的基准
  • 可以处理数万个并发请求
  • 内存占用小
  • 多线程模型可扩展
  • 非常轻量级的代码库
  • 简单的 API
  • 体面的 HTTP 协议处理
  • 保持连接
  • SSL 支持(通过 GNUTLS)
  • HTTP 代理(使用保持连接池)
  • 非阻塞发送文件支持(带有可配置的小文件内存缓存;gzip 预编码文件服务)
  • 面向开发人员的模块化设计
  • 可以作为守护进程运行;出错时重新启动
  • 开源

限制:

  • 依赖于 libev 库(不再)
  • 仅在 Linux 上测试

【讨论】:

  • NXWeb 基准测试不是很严格:G-WAN 占用 105 MB RAM? (在 3 年内从未见过)NXWeb 受益于 req/s 范围而其他人只有一个值?尝试使用 1-1000 并发范围而不是一次性并发,这将使您的测试更加相关。说别人崩溃或不稳定,说真的,如果你的项目很好,那么它不需要冒险在那种卑鄙的环境中......
  • 以下是图表:gwan.com/imgs/nxweb_3.0.1_100k.png vs gwan.com/imgs/localhost_gwan2.10.8.png,获胜者是... G-WAN(用于速度、CPU 和 RAM)- 不是上面宣传的 nxWeb。 Yaroslav,这里是测试的源代码:gwan.com/source/ab.c,我尊重你的工作,对 G-WAN 也一样。 nxWEB 仍有改进空间以匹配 G-WAN 的性能。
  • 关于基准测试:我认为这里不适合讨论。我没有在这篇文章中说 nxweb 比 g-wan 快,所以你的论点似乎无关紧要。我建议在这里讨论:groups.google.com/forum/?hl=en&fromgroups#!topic/nxweb/…
  • 关于 nxweb 的线程安全:请您向问题跟踪器提交错误报告。通常模块代码的线程安全是模块的责任。再说一次,这里不适合讨论它。
  • 这是您声称其他人“不稳定”的“正确位置”,但您不希望为 NxWeb 讨论此事......它跪了 (683 req/s ) 使用 weighttp -n 100000 -c 1000 -t 6 -k -H "Accept-Encoding: gzip" "127.0.0.1:80/…" 并让我们免去 "modules is not thread-safe" 这首歌:那就是G-WAN 使用上面的 weighttp 命令以 110k req/s 的速度服务的代码 (gwan.com/source/loan.c)。我是 G-WAN 开发的一部分 - 您没有填写 G-WAN 错误报告来维持您的“不稳定”声明。使用loan.c,你会看到。
【解决方案4】:

我是一个狂热的nginx 用户; nginx是用C编写的; nginx 似乎可以为您工作。如果你想要最好的 nginx 速度,我会做一个 nginx 模块。这里是3rd party modules,您可以查看它以了解它需要什么。

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

【讨论】:

  • nginx 模块 API 多久更改一次? (自从编写主要指南以来,它似乎至少改变了一次。)
  • 虽然我自己不需要编写任何模块,但据我所知模块 api 应该是相当稳定的。如果有更改,我怀疑作者会在没有充分理由的情况下进行重大更改。
  • 这是对 nginx 模块开发的一次深入探讨:evanmiller.org/nginx-modules-guide.html
【解决方案5】:

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

【讨论】:

  • 我不喜欢 FastCGI 的一点是,每个基本的 HTTP 请求最终都需要两个套接字,而 DB 连接通常需要 3 个。
  • IPC 套接字真的是可扩展性问题吗?我不这么认为。 TCP/IP 堆栈不用于此。
  • ...如果您有效地管理您的资源(就像 fastCGI 一样),您不需要为每个请求打开/关闭后端套接字。
猜你喜欢
  • 1970-01-01
  • 2011-08-26
  • 2011-01-21
  • 2011-05-26
  • 2011-02-19
  • 2011-01-29
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多