本文共 1984 字,大约阅读时间需要 6 分钟。
nginx是多进程web服务器的优秀代表。
本文要用-1.2.3实现一个比nginx更快的多进程的web服务器。
mongols是C++ 服务器基础设施库, 它的主要特性如下:
以上所有服务器均通过epoll机制实现,并且支持多线程化和多进程化。
mongols不依赖于任何事件库,其并发性能却强于著名的libevent、libev和libuv。
而且,它提供非常友好的开发接口,使得任何试图基于tcp、resp或http协议开发高性能网络服务器的开发者都能够轻易地完成工作。
下载:
先看压测比较:
再看代码:
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 8 9 static void signal_cb(int sig, siginfo_t *, void *);10 static std::vector 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_server23 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_len32 , [&]() {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 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服务器。
转载地址:http://ajagx.baihongyu.com/