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服务器。