c - C/C++ 中的高性能应用程序网络服务器

标签 c http webserver apache

是否有使用 C 或 C++ 的高性能(最好是事件和开源)Web 服务器?

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

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

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


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

最佳答案

我的工作有完全相同的要求,所以我评估了一些解决方案:mongoose、libmicrohttpd、libevent。我也在考虑编写 nginx 模块。以下是我的发现摘要:

nginx

nginx project page

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

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

Mongoose

mongoose project page

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

libmicrohttpd

libmicrohttpd project page

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

自由事件

libevent project page

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

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

广域网

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

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

如您所见,现有的替代方案都不能完全满足我的要求。所以我开发了自己的服务器,也就是...

新网

NXWEB project page

功能亮点:

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

限制:

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

关于c - C/C++ 中的高性能应用程序网络服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6405811/

相关文章:

c - 微 Controller 中的"printf",它是做什么用的?

c - meminfo_proc_show() 的枚举和 si_meminfo() 的变量集在哪里?

javascript - API 网络服务器

java - JNLP 推荐服务器

php - 在 Linux/Apache 上通过 PHP 脚本访问 USB 网络摄像头

c++ - printf 的 "precision"说明符的类型是什么?

c - 64位机上栈帧的创建

api - 由于 User-Agent header 无效而拒绝请求时更正 HTTP 状态代码

web-services - 报告 RESTful Web 服务内部服务错误 500 的最佳实践?

javascript - 在 AJAX 中仅检索远程 URL 的一部分