WebServer

2025-12-07 0 412

基于Linux EPOLL多路复用的C++轻量级WebServer

功能

  • 可作为静态WebServer(常规的html、图片、视频等)
  • 支持GET、POST(交由cgi处理)请求
  • 多站点支持
  • 支持fastcgi(目前已支持php-fpm)
  • 支持反向代理
  • 支持session、cookie

todo:

  • 负载均衡(开发中,完善支持随机模式、hash模式、权重模式三种负载均衡策略)
  • 日志完善
  • 实现类似nginx中rewrite模块

项目地址 欢迎PR、Issue、Star。

技术实现

  • 使用EPOLL边缘触发(ET)的IO多路复用技术,非阻塞IO+ET方式
  • 多线程(one loop per thread思想)充分利用CPU资源
  • 采用基于事件驱动的Reactor模式,主Reactor负责accept,子Reactor负责处理I/O,通过事件循环
  • FastCGI协议实现支持,可处理动态脚本语言
  • cJSON方式读入配置文件
  • 反向代理中域名自动解析IP地址
  • 状态机化HTTP处理过程

ab压测(nginx vs WebServer)

ab -n 1000 -c 300

  • nginx

  • WebServer

ab -n 1000 -c 500

  • nginx

  • WebServer

演示

  • 作为静态WebServer

    编译好的一个vue项目做为测试

  • 大文件测试

    一个7m+大小的图片做为测试

  • 多host支持

    由于服务器国内没有备案,使用curl模拟http请求在头部添加host测试

    curl -H \"Host: 1.icharle.com\" http://47.115.***26.47/    # 预期输出结果为:这里是1.icharle.com站点
    curl -H \"Host: 2.icharle.com\" http://47.115.***26.47/    # 预期输出结果为:这里是2.icharle.com站点
    
  • 反向代理

    采用新启动一个8085端口WebServer反向代理80端口,配置文件示例如下

    {
          \"server\": {
              \"PORT\": 8085,
              \"ThreadNum\": 4,
              \"BackLog\": 1024
          },
          \"host\": [{
              \"default\": {
                  \"root\": \"/home/www/default/\",
                  \"access_log\": \"/www/log/default.log\",
                  \"warn_log\": \"/www/log/default.warn.log\",
                  \"proxy_pass\": \"http://127.***0.0.1:80\" # 反向代理80端口
              }
          }]
    }
    
  • CGI支持连接php-fpm

    简易的支持CURD的PHP项目做为测试(涉及GET、POST、AJAX、cookie、数据库交互)

食用

要求:

  • Linux系统并已安装gcc/g++编译器
  • GCC >= 4.9
git clone https://*gi*t*hub.com/icharle/WebServer.git
cd WebServer
make

# 修改配置文件(见配置文件说明)

# fastcgi使用(目前支持php-fpm)
编译安装PHP
修改php-fpm.conf中listen改用监听9000端口(如下为php-fpm.conf文件)

[global]
pid = xxxxx
error_log = xxxxx
log_level = notice

[www]
listen = 127.0.0.1:9000 # 需要修改的地方
listen.backlog = 8192 
listen.allowed_clients = 127.0.0.1
listen.owner = www  # php-fpm运行的用户
listen.group = www  # php-fpm运行的用户组
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.status_path = /phpfpm_70_status
pm.max_children = 80
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 20
request_terminate_timeout = 100
request_slowlog_timeout = 30
slowlog = var/log/slow.log

# 运行启动
nohup ./bin/WebServer >> web.log 2>&1 &

注意:
由于php-fpm默认运行在www用户及www用户组中,将root目录改为www用户,否则运行php脚本文件出现权限错误的问题。

# 创建不可登录的组帐户www
groupadd www
useradd www -s /sbin/nologin -g www  

# 修改root文件目录为www用户及组
chown -R www:www /home/www/(修改为自己root目录)

# 下图作者root文件目录示例

配置文件说明

{
  \"server\": {
    \"PORT\": 80,         // 运行端口
    \"ThreadNum\": 4,     // 启动线程数
    \"BackLog\": 1024     // listen最大值
  },
  \"host\": [
    {
      \"default\": {                                      // 默认站点(当host不匹配时候默认走default站点)
        \"root\": \"/home/www/default/\",                   // 该站点存放目录处
        \"access_log\": \"/www/log/default.log\",           // 暂时无日志输出
        \"warn_log\": \"/www/log/default.warn.log\",        // 暂时无日志输出
        \"proxy_pass\": \"http://dududu.*s*oa*rteam.cn\"       // 反向代理配置(仅支持HTTP代理) 不写端口时候默认反代80端口
      },
      \"1.icharle.com\": {                                // host(即域名)
        \"root\": \"/home/www/1.icharle.com/\",
        \"access_log\": \"/www/log/1.icharle.com.log\",
        \"warn_log\": \"/www/log/1.icharle.com.warn.log\",
        \"proxy_pass\": \"http://127.***0.0.1:8043\"           // 反向代理(IP+端口、域名+端口)
      },
      \"2.icharle.com\": {
        \"root\": \"/home/www/2.icharle.com/\",
        \"access_log\": \"/www/log/2.icharle.com.log\",
        \"warn_log\": \"/www/log/2.icharle.com.warn.log\"
      }
    }
  ]
}

下载源码

通过命令行克隆项目:

git clone https://github.com/icharle/WebServer.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 WebServer https://www.zuozi.net/31834.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务