经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
比NGINX更快:nginx-1.15.5 vs mongols-1.2.3 - hi-nginx
来源:cnblogs  作者:hi-nginx  时间:2018/10/20 15:33:58  对本文有异议

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

 

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

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号