0%

tinywebserver实践

开题报告

TinyWebServer

是什么

简介:https://developer.mozilla.org/zh-CN/docs/Learn/Common_questions/What_is_a_web_server

image-20220506123837020

关于我的疑问,目前的想法是一个webserver必须有applicationserver才能完整,一部分?application用于验证webserver能否完成预定功能。

TinyWebServer项目地址:GitHub - qinguoyi/TinyWebServer: Linux下C++轻量级Web服务器

详解代码:TinyWebServer——从0到服务器开发! - 知乎 (zhihu.com)

原项目是Ubuntu16.04,我用的是是20.04,考虑简洁版还是原生版

简介

Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器.相关知识:《linux高性能服务器编程》,《unix网络编程》

  • 使用线程池 + 非阻塞socket + epoll(ET和LT均实现) + 事件处理(Reactor和模拟Proactor均实现) 的并发模型;
  • 使用状态机解析HTTP请求报文,支持解析GET和POST请求;
  • 访问服务器数据库实现web端用户注册、登录功能,可以请求服务器图片和视频文件;
  • 实现同步/异步日志系统(根据日志内容大小选择),记录服务器运行状态;
  • 经Webbench压力测试可以实现上万的并发连接数据交换;

架构

Mysql

思考过可不可以直接连接宿主机上的MySQL,好像是可以,看着有点麻烦,没有尝试了.

install

1
apt install mysql-server-5.7
  • “正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 6968(unatten”
    • kill 6968
  • 安装过程中会弹出让你配置密码的操作

检查状态

1
2
3
apt install net-tools
netstat -tap | grep mysql #查看运行mysql的端口状态
mysql -V #注意是大写V,小写有其他作用

查看运行状态

1
systemctl status mysql.service

测试

1
2
mysql -uroot -p	#回车后输入前面配置的密码,进入mysql
mysql> show databases; #mysql语句注意分号结尾

快速启动

数据库相关

创建数据库、user表、插入一条user数据(应该是用于测试

1
2
3
4
create database webserver;
use webserver;
create table user(username char(50) NULL,passwd char(50) NULL)engine=InnoDB;
insert into user(username,passwd) values('name','passwd');

修改main.cpp中的数据库初始化信息

1
2
3
4
//数据库登录名,密码,库名
string user = "root";
string passwd = "123456";
string databasename = "webserver";

编译运行

切换到TinyWebServer-master目录下

1
sh ./build.sh
  • fatal error: mysql/mysql.h: 没有那个文件或目录 #include <mysql/mysql.h>

    • apt-get install libmysqlclient-dev
      
      1
      2
      3
      4
      5

      运行服务端

      ```sh
      ./server

在127.0.0.1:9006查看结果

  • 视频看不了,说是不支持该格式(火狐)image-20220518122538369

再次启动报错

https://blog.csdn.net/cuiyong_xu/article/details/42556925,非正常退出产生问题,强行杀死占用进程

1
lsof -i

压测

1
2
gcc webbench.c -o webbench
./webbench -c 10001 -t 5 http://127.0.0.1:9006/

报错:problems forking worker no. 9754,fork failed.: Resource temporarily unavailable

1
ulimit -u	#查看最大进程数

压力测试webbench(转) - 雄哼哼 - 博客园 (cnblogs.com)?服务器挂了,-c设置小点儿,我的是好像有点不太行

image-20220518122809423

计划

  • 阅读源码,整理项目架构,给出注释
  • 增加功能
    • 文件上传和下载:该项目目前只实现了GET请求,没有真正的达到交互
    • 登录状态的保存:利用session或cookie
    • 大数据量情况下的用户登录验证:将所有用户信息加载到内存中耗时→hash建立多级索引