nginx是多进程web服务器的优秀代表。

本文要用mongols-1.2.3实现一个比nginx更快的多进程的web服务器。

mongols是C++ 服务器基础设施库, 它的主要特性如下:

  • tcp 服务器
  • http 服务器
  • websocket 服务器
  • web 服务器
  • leveldb 服务器
  • lua 服务器
  • sqlite 服务器
  • medis 服务器

以上所有服务器均通过epoll机制实现,并且支持多线程化和多进程化。

mongols不依赖于任何事件库,其并发性能却强于著名的libevent、libev和libuv。

而且,它提供非常友好的开发接口,使得任何试图基于tcp、resp或http协议开发高性能网络服务器的开发者都能够轻易地完成工作。

下载:https://github.com/webcpp/mongols

先看压测比较:

再看代码:

  1. #include <unistd.h>
  2. #include <sys/wait.h>
  3. #include <sys/signal.h>
  4. #include <mongols/util.hpp>
  5. #include <mongols/web_server.hpp>
  6. #include <iostream>
  7.  
  8. static void signal_cb(int sig, siginfo_t *, void *);
  9. static std::vector<pid_t> pids;
  10.  
  11. int main(int, char**) {
  12. // daemon(1, 0);
  13. auto f = [](const mongols::request & req) {
  14. if (req.method == "GET" && req.uri.find("..") == std::string::npos) {
  15. return true;
  16. }
  17. return false;
  18. };
  19. int port = ;
  20. const char* host = "127.0.0.1";
  21. mongols::web_server
  22. server(host, port, , , /*must be 0*/);
  23. server.set_root_path("html");
  24. server.set_mime_type_file("html/mime.conf");
  25. server.set_list_directory(true);
  26. server.set_enable_mmap(false);
  27.  
  28. int child_process_len = std::thread::hardware_concurrency();
  29. mongols::forker(child_process_len
  30. , [&]() {
  31. server.run(f);
  32. }
  33. , pids);
  34. for (int i = ; i < child_process_len; ++i) {
  35. mongols::process_bind_cpu(pids[i], i);
  36. }
  37.  
  38. const int sig_len = ;
  39. int sigs[sig_len] = {SIGHUP, SIGTERM, SIGINT, SIGQUIT};
  40. struct sigaction act;
  41. memset(&act, , sizeof (struct sigaction));
  42. sigemptyset(&act.sa_mask);
  43. act.sa_sigaction = signal_cb;
  44.  
  45. for (int i = ; i < sig_len; ++i) {
  46. if (sigaction(sigs[i], &act, NULL) < ) {
  47. perror("sigaction error");
  48. return -;
  49. }
  50. }
  51.  
  52. for (size_t i=;i<pids.size();++i) {
  53. pid_t pid;
  54. if ((pid = wait(NULL)) > ) {
  55.  
  56. }
  57. }
  58.  
  59. }
  60.  
  61. static void signal_cb(int sig, siginfo_t *, void * ) {
  62. switch (sig) {
  63. case SIGTERM:
  64. case SIGHUP:
  65. case SIGQUIT:
  66. case SIGINT:
  67. for (auto & i : pids) {
  68. kill(i, SIGTERM);
  69. }
  70. break;
  71. default:break;
  72. }
  73. }

结论:nginx并不是最快的web服务器。

比NGINX更快:nginx-1.15.5 vs mongols-1.2.3的更多相关文章

  1. 阿里云openssl升级,实现nginx主动推送,nginx主动推送能够有效减少不必要的报文传输,减少用户请求次数,以达到更快访问速度

    现有版本检查 [root@node3 ~]# openssl version               #这个版本是无法支持http2.0主动推送功能.需要升级为2019版本. OpenSSL 1. ...

  2. modSecurity和Naxsi哪个更适合Nginx搭建WAF

    nginx增加modsecurity模块 modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成 ...

  3. Nginx为什么快到根本停不下来?

    Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器. 图片来自 Pexels Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资 ...

  4. Nginx 笔记与总结(15)nginx 实现反向代理 ( nginx + apache 动静分离)

    在 nginx 中,proxy 用来实现反向代理,upstream 用来实现负载均衡. 例如有两台服务器,nginx 服务器作为代理服务器,执行 .html 文件,apache 服务器上执行 .php ...

  5. 【夯实Nginx基础】Nginx工作原理和优化、漏洞

    本文地址 原文地址 本文提纲: 1.  Nginx的模块与工作原理    2.  Nginx的进程模型    3 . NginxFastCGI运行原理        3.1 什么是 FastCGI   ...

  6. 让你的 Node.js 应用跑得更快的 10 个技巧(转)

    Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...

  7. 让互联网更快:新一代QUIC协议在腾讯的技术实践分享

    本文来自腾讯资深研发工程师罗成在InfoQ的技术分享. 1.前言 如果:你的 App,在不需要任何修改的情况下就能提升 15% 以上的访问速度,特别是弱网络的时候能够提升 20% 以上的访问速度. 如 ...

  8. Nginx教程(五) Nginx配置文件详解

    一. Nginx配置文件nginx.conf中文详解 #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processe ...

  9. Quick UDP Internet Connections 让互联网更快的协议,QUIC在腾讯的实践及性能优化

    https://mp.weixin.qq.com/s/44ysXnVBUq_nJByMyX9n5A 让互联网更快:通往QUIC之路 原创: 史天 翻译 云技术实践 8月15日 QUIC(Quick U ...

随机推荐

  1. jade模版js中接收express的res.render

    router: router.get('/', function(req, res, next) { res.render('index', { title:{name:'aaa',age:23} } ...

  2. JavaScript(七)

    类型转换 1.直接转换 parseInt() 与 parseFloat() alert('12'+7); //弹出127 alert( parseInt('12') + 7 ); //弹出19 ale ...

  3. jade的写法

    标签直接写:p或p. 例如: p 今天自己很棒 p.今天自己很棒 则输入 <p>今天自己很棒</p> <p>今天自己很棒</p> ***jage模板记得 ...

  4. Express内置方法

    创建一个 Express 应用.express()是一个由 express 模块导出的入口(top-level)函数. //最顶级:top-level 内置方法 express.static(root ...

  5. nexus的jar包上传与下载

    1. hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分,Releases公司内部发布版本仓库. Snapshots 公司内部测试版本仓库 2. p ...

  6. (78)Wangdao.com第十五天_JavaScript 面向对象

    面向对象编程(Object Oriented Programming,缩写为 OOP) 是目前主流的编程范式. 是单个实物的抽象, 是一个容器,封装了属性(property)和方法(method),属 ...

  7. (87)Wangdao.com第二十天_JavaScript document 节点对象

    document 节点对象, 代表整个文档,每张网页都有自己的 document 对象. window.document 当浏览器开始加载文档时就存在了 正常的网页使用 document 或者 win ...

  8. JavaScript Concurrency model and Event Loop 并发模型和事件循环机制

    原文地址:https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop JavaScript 有一个基于 event loop 的 ...

  9. 书上关于*(p++)表达式的几种变形形式的思考题

    代码: int main(){ int a[10] = { 1,2,3,4,5,6,7,8,9,10 }; int *p = &a[3]; cout << "*p++ = ...

  10. Python基础之语句1

    一.行定义(两类): 1.物理行:程序员编写代码的行. 2.逻辑行:python解释器需要执行的指令. 建议:一个逻辑行在一个物理行上,若一个物理行使用多个逻辑行,需要使用分号隔开:如果逻辑行过长,可 ...