项目简介
本项目是基于C++的HTTP服务器程序,主要功能是处理HTTP请求并返回响应。采用epoll模型实现IO多路复用,提升并发连接处理能力。利用多线程和线程池管理线程资源,降低线程创建和切换开销,加快响应速度。同时集成了日志系统和数据库功能,用于记录服务器运行信息和存储用户数据。
项目的主要特性和功能
- 事件驱动模型:使用epoll模型达成非阻塞I/O操作,增强服务器处理并发连接的能力。
- 线程池:创建一定数量线程放入线程池,实现线程资源复用,减少线程创建和销毁的开销。
- 日志系统:借助日志类记录服务器运行信息,方便调试和监控。
- 数据库支持:支持SQLite和MySQL数据库,用于存储和检索用户数据。
安装使用步骤
编译和构建
使用CMake工具进行项目构建,执行以下命令:
bash
mkdir build
cd build
cmake ..
make
配置
数据库配置
在Database.hpp
中配置数据库连接信息:
```cpp
class Database {
private:
MYSQL mysql;
MYSQL *conn;
public:
Database() {
conn = mysql_init(&mysql);
if(conn == nullptr) {
LOG_ERROR("Failed to initialize MySQL connection");
}
conn = mysql_real_connect(conn,"localhost","root","1234","webserver",0,NULL,0);
if(conn == nullptr) {
LOG_ERROR("Failed to connect to MySQL server");
mysql_close(conn);
throw std::runtime_error("Failed to connect to MySQL server");
}
LOG_INFO("Connected to MySQL server");
// 创建用户表
string create_table_sql =
"CREATE TABLE IF NOT EXISTS users("
"username VARCHAR(15) PRIMARY KEY, "
"password VARCHAR(10)"
")";
if(mysql_query(conn,create_table_sql.c_str())){
fprintf(stderr, "%s\n", mysql_error(conn));
} else {
LOG_INFO("Created users table");
}
}
// 其他方法...
};
```
Nginx配置
在nginx.conf
中配置反向代理:
```nginx
user root;
events {
worker_connections 1024;
}
http { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
upstream myapp {
server localhost:8080 weight=3;
server localhost:8081 weight=2;
server localhost:8082 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://myapp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
access_log /var/log/nginx/access.log custom_format;
}
location ~* .+ {
proxy_pass http://myapp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
access_log /var/log/nginx/access.log custom_format;
}
location ~ ^/(login|register)$ {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
limit_except POST {
proxy_pass http://myapp;
}
}
location ~ ^/(login|register)$ {
proxy_pass http://myapp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
} ```
启动服务器
运行主入口文件(如main.cpp
),服务器将开始监听指定的端口,并处理来自客户端的HTTP请求:
bash
./server
测试
通过发送HTTP请求到服务器,验证服务器的响应和功能:
bash
curl -X POST -d "username=test&password=1234" http://localhost:8080/register
curl -X POST -d "username=test&password=1234" http://localhost:8080/login
注意事项
- 确保服务器监听的端口未被其他程序占用。
- 根据实际需求,配置路由表以处理不同的HTTP请求。
- 根据服务器的负载和并发需求,合理设置线程池的大小。
- 定期检查服务器日志,以监控服务器的运行状态和性能。
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】