您现在的位置是:首页 > 文章详情

比NGINX更快:nginx-1.15.5 vs mongols-1.2.3

日期:2018-10-18点击:330

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

 

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

 

原文链接:https://yq.aliyun.com/articles/684931
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章