【slighttpd】基于lighttpd架构的Server项目实战(1)—前言及设计思路
2016-02-03 21:05
555 查看
前言
前一阵子读了一些书,譬如经典的《APUE》、《UNP》,初次接触Linux环境下编程、Linux网络编程,读完之后受益良多。然而“纸上得来终觉浅”,不结合实际项目,常常看完之后就忘了,于是开始阅读优秀的开源代码。一开始读tinyhttpd,一个500多行代码的轻量级http服务器,麻雀虽小五脏俱全,至少总体了解了一个http服务器的运作流程。
接着读webbench,一个500多行代码的网站测压工具。
后面想开始读些轻量级的web server,候选的有lighttpd以及nginx。
nginx是早有耳闻,我的个人网站部署也是用的它。
而lighttpd是前些年比较火的,但是社区支持较少,中文资料也少。
nginx只看了整体架构那一部分,由于lighttpd的代码量相对更少一点,而且刚好有位博主写了一系列的博文对lighttpd的主要内容进行了比较详细的分析,所以借着网络资源,我开始阅读lighttpd的源码。
lighttpd的代码十分优雅,特别是它的架构——使用状态机来控制整个请求-响应过程。
看了lighttpd的主体代码之后,作为练习实践,我决定模仿lighttpd的架构——master&worker模式以及StateMachine,自己开发一个简单的、适合初学者了解、学习lighttpd架构的server。
经过考虑,以及参考了github上一些源码,我初步的大致计划如下:
编程语言:C++ ;
事件处理方式:使用libevent库,实现纯异步事件处理;
服务器模式:采用 Master-Worker模式,一个Master,多个Worker;
连接的处理:使用状态机,并支持插件,所有具体的处理均交给插件来做。
在接下来的开发中,我也会陆陆续续把自己开发的过程,遇到的问题以及解决在此记录,便于以后总结反思、学习等。
设计思路
Master:负责插件加载工作等、子进程创建、监听SIGCHLD信号等,包含数据成员worker——用于处理具体的事务;Worker:管理监听(listener成员)、连接(connection)等事务,进行event loop;
Listener:主要两个功能,第一,获取监听套接字,第二,监听套接字可读事件(accept)的回调;
Connection:维护一个连接,内部使用状态机;
Plugin:插件接口;
Http:处理http的模块。
东西有点多,一下子上手可能不知道如何做。
所以我打算一步步来,先从简单的做起,之后逐步充实:
构建Master和Worker,暂时不涉及任何网络,只在子进程中输出一句话,这一步主要熟练下fork()的使用;
添加网络部分,构建Listener及Connection,暂不涉及插件、HTTP、状态机,可以只做成简单的TCP echo服务器,这一部分主要学习libevent异步事件的使用,一开始可以仅使用单进程来调试,之后扩展到多进程,解决一些多进程的问题,之后进程一些测压——写一个python脚本测试基本的功能,使用webbench测试并发连接;
加入状态机机制,还是可以暂时不涉及HTTP部分;
加入HTTP部分,定义Plugin接口;
开发HTTP插件,比如最基本的静态文件处理。
接下来开工~加油~
相关文章推荐
- linux 网络命令整理
- HTTP1.1协议中文版-RFC2616
- AFNetworking3.0网络请求方法封装(自带缓存功能)
- Python实现NN(神经网络)
- cinder list 报错:ERROR: Malformed request url (HTTP 400)
- 使用HttpURLConnection查看图片
- 广西首届网络安全选拔赛PWN、REVERSE、决赛题目
- nyoj 489
- 广西首届网络安全选拔赛 MISC Wirteup
- 广西首届网络安全选拔赛 WEB Writeup
- 从Http协议报头看RESTful
- 百行代码教你了解何为神经网络
- HttpClient_4 用法(HC3-->HC4必看)
- Ios9下访问http:// 安全认证
- Linux TCP队列相关参数的总结
- Python 14.2 TCP编程
- HttpClient设置代理,超时,以及得到cookies
- mysql-5.7.9-winx64 MySQL服务无法启动,服务没有报告任何错误的解决办法 转自【IT精英团】:http://www.itnpc.com/news/web/144832818227054.html
- 网络解析过程
- qemu网络配置