本项目是一个基于muduo网络库的现代化C++11 Web服务器应用,专注于提供高性能、稳定可靠的Web服务。系统集成了用户认证、静态资源服务、数据库交互等完整的Web应用功能,适用于实际生产环境中的中小型Web服务部署。
第一阶段:原始实现
- 自定义线程池和事件驱动架构
第二阶段(当前):muduo网络库重构
- 高性能网络框架:采用muduo库实现One Loop Per Thread架构,充分利用多核CPU
- 全面C++11化:使用智能指针、lambda表达式、右值引用、default/delete函数等现代C++特性
- 内存安全优化:用
std::string替代char*,减少内存泄漏风险 - 并发模型改进:基于muduo的Reactor模式,线程池使用
std::thread和std::vector,自动管理线程生命周期 - 编译性能提升:使用前置声明减少头文件依赖,加快编译速度
- 代码结构优化:更清晰的类职责划分和命名规范
- 用户管理系统:提供完整的用户注册、登录和认证功能,支持密码安全存储
- 静态资源服务:高效提供图片、视频、HTML、CSS、JavaScript等各类静态文件
- 数据库集成:与MySQL数据库无缝集成,实现用户数据的持久化存储
- 多模式部署:支持不同部署模式以适应各种应用场景
- 日志监控:提供完善的日志记录功能,便于系统运维和问题排查
全面支持各类Web内容:
- 图片展示(JPG、PNG等格式)
- 视频播放(MP4等格式)
- 文档下载(TXT等格式)
- 动态页面(HTML、CSS、JS)
- 操作系统:Linux (Ubuntu 16.04+ 推荐)
- 编译器:GCC 4.8+ (支持C++11)
- 数据库:MySQL 5.7+
- 依赖库:pthread, mysqlclient
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install libmysqlclient-dev-
配置数据库:
# 创建数据库 mysql -u root -p -e "CREATE DATABASE tinyweb;" # 创建用户表 mysql -u root -p tinyweb -e "CREATE TABLE user(username char(50) NULL, passwd char(50) NULL)ENGINE=InnoDB;" # 添加测试用户 mysql -u root -p tinyweb -e "INSERT INTO user(username, passwd) VALUES('admin', '123456');"
-
编译项目:
make
- HTTP协议支持:完整支持HTTP/1.1协议,解析GET/POST请求
- 静态资源服务:支持图片、视频、HTML、CSS、JavaScript等静态文件
演示图片:
- 用户认证:基于MySQL的用户注册和登录功能
- 并发处理:高性能线程池实现,支持上万并发连接
- 超时管理:定时器自动清理非活动连接
- 日志记录:可配置的同步/异步日志系统
-
智能指针:
std::unique_ptr用于资源管理,避免内存泄漏std::unique_ptr<Utils> m_utils;
-
Lambda表达式:简化线程创建和回调函数
m_threads.emplace_back([this] { this->run(); });
-
范围for循环:更简洁的容器遍历
-
自动类型推导:
auto关键字减少冗余代码 -
默认/删除函数:更精确地控制类的行为
~http_conn() = default; http_conn(const http_conn &) = delete; http_conn &operator=(const http_conn &) = delete;
-
常量表达式:编译期计算,提高性能
static constexpr int READ_BUFFER_SIZE = 2048;
-
初始化列表:更安全、更简洁的初始化方式
int m_pipefd[2]{}; char m_read_buf[READ_BUFFER_SIZE]{};
-
右值引用:优化资源传递,减少不必要的拷贝
-
标准线程库:
std::thread替代pthread,跨平台兼容性更好 -
条件变量:
std::condition_variable提供更安全的线程同步
# 使用默认配置启动 (muduo版本,端口9006)
./server
# 自定义端口启动
./server -p 8080
# 异步日志 + 多线程配置
./server -p 9006 -l 1 -t 16 -s 16
# 完整参数列表
./server -p port -l log_write -m trigmode -o linger -s sql_num -t thread_num -c close_log -a actor_model- One Loop Per Thread 架构:每个工作线程拥有独立的EventLoop,减少竞争
- 无锁数据结构:充分利用线程局部性,减少锁开销
- 高效的事件处理:采用epoll/kqueue,支持高并发连接
- 内存池管理:减少频繁的内存分配释放开销
- 异步日志系统:日志不阻塞主线程,提升吞吐量
- 首页:
http://your_server_ip:9006 - 注册:
http://your_server_ip:9006/register.html - 登录:
http://your_server_ip:9006/login.html
| 参数 | 描述 | 默认值 |
|---|---|---|
| -p | 端口号 | 9006 |
| -l | 日志写入方式(0:同步, 1:异步) | 0 |
| -m | 触发模式组合 | 0 |
| -o | 优雅关闭连接(0:关闭, 1:开启) | 0 |
| -s | 数据库连接池数量 | 16 |
| -t | 线程池线程数量 | 16 |
| -c | 关闭日志(0:开启, 1:关闭) | 0 |
| -a | 并发模型(0:Proactor, 1:Reactor) | 0 |
-
WebServerMuduo:基于muduo库的Web服务器核心类
init():初始化服务器配置,包括端口、日志、数据库等参数start():启动服务器和EventLoop,开始处理连接setThreadNum():设置IO线程数量,实现one loop per thread架构loadUsers():异步加载数据库用户,避免阻塞主线程
-
HttpContext:HTTP请求解析类,负责HTTP协议解析
parseRequest():状态机式解析HTTP请求行、头部、bodygotAll():判断请求是否完整reset():重置解析状态,用于连接复用
-
HttpResponse:HTTP响应类,负责构建和管理HTTP响应
setStatusCode():设置HTTP响应状态码setContentType():设置响应内容类型addHeader():添加响应头部字段setBody():设置响应体内容
-
EventLoop(muduo):事件循环处理器,管理IO事件和定时器
loop():启动事件循环,阻塞直到退出runAfter():在指定时间后执行回调runEvery():周期性执行回调
未来将重点改进以下应用功能:
- 用户界面优化:改进前端页面设计,提升用户体验
- 安全增强:增加HTTPS支持和安全认证机制
- 监控系统:完善系统监控和告警功能
- 部署简化:提供更便捷的部署和配置方案
欢迎提交Issue和Pull Request来帮助改进这个项目!
本项目采用MIT许可证,与原项目保持一致。
MIT License
Copyright (c) 2023 TinyWebServer-C++11
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.








