EasyServer 是使用 C++ 17 标准开发的轻量级Web服务器。
- 基于 C++ 17 标准开发,使用标准库提供的智能指针或将类按照RAII方式来设计,降低内存泄漏的可能。
- 使用 线程池 + 非阻塞 Socket + Epoll (ET) + Reactor模式的并发模型。主线程作为 Acceptor 接受请求,并分发给其他事件处理线程。详情见 并发模型。
- 使用基于标准库优先队列 (Priority_Queue) 实现的定时器关闭超时请求,采用惰性删除。
- 使用 eventfd 实现了线程的异步唤醒。
- 实现了一个简单的异步日志模块,使用链式缓冲。
- 使用状态机解析 HTTP 请求。
src
├── Http // 提供 HTTP 中连接和读写事件的处理功能
├── Log // 日志模块
├── Reactor // 事件处理模块
├── Server // 服务器模块,作为 Acceptor 处理连接,分发事件
├── Thread // 线程池、线程信息获取
└── Util // 工具类
仅列出我的开发环境以供参考。
- OS : Debian 4.19.146-1 (2020-09-17) x86_64 GNU/Linux ( Debian 10.12 )
- Compiler : GCC 8.3.0 x86_64-linux-gnu
- CMake : 3.13.4 ( set minimum required version to 3.12 in CMakeLists )
由于使用了 Epoll,目前仅能在符合工具版本条件的 Linux 环境上进行完整编译。Log 部分在 macOS上开发,即 Log 部分确保可以在符合条件的 macOS 环境上编译运行。下面列出我在 macOS 的开发环境以供参考。
- OS : macOS Monterey 12.4+, Apple M1
- Compiler : Clang 13.1.6 arm64-apple-darwin 21.4.0
- CMake : 3.23.2+
未来期望完成 EasyServer 的跨平台实现。
./build.sh
或者使用CMake:
cmake -B build
cd build
cmake --build .
推荐使用 VSCode 的 CMake Tools 拓展。
测试对 EasyServer 进行了功能测试与性能测试,并使用 Valgrind 进行了内存检查。
测试结果见 TestResult。未来更多和测试有关的文档见 ./docs/Tests。
在 docs 中,记录了项目中模块设计与实现的一些思路、问题和细节,也有一些项目过程中的学习、感受和思考,希望对于和我一样的学习者有所帮助。
参考的项目有很多,记录在 开始Coding之前 的最后。非常感谢这些无私的开源作者!