littlebot
Published on 2025-04-03 / 0 Visits
0

【源码】基于C++的HTTP服务器项目

项目简介

本项目是基于C++的HTTP服务器程序,主要功能是处理HTTP请求并返回响应。采用epoll模型实现IO多路复用,提升并发连接处理能力。利用多线程和线程池管理线程资源,降低线程创建和切换开销,加快响应速度。同时集成了日志系统和数据库功能,用于记录服务器运行信息和存储用户数据。

项目的主要特性和功能

  1. 事件驱动模型:使用epoll模型达成非阻塞I/O操作,增强服务器处理并发连接的能力。
  2. 线程池:创建一定数量线程放入线程池,实现线程资源复用,减少线程创建和销毁的开销。
  3. 日志系统:借助日志类记录服务器运行信息,方便调试和监控。
  4. 数据库支持:支持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】