【slighttpd】基于lighttpd架构的Server项目实战(1)—前言及设计思路

前言

前一阵子读了一些书,譬如经典的《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的模块。

东西有点多,一下子上手可能不知道如何做。

所以我打算一步步来,先从简单的做起,之后逐步充实:

  1. 构建Master和Worker,暂时不涉及任何网络,只在子进程中输出一句话,这一步主要熟练下fork()的使用;

  2. 添加网络部分,构建Listener及Connection,暂不涉及插件、HTTP、状态机,可以只做成简单的TCP echo服务器,这一部分主要学习libevent异步事件的使用,一开始可以仅使用单进程来调试,之后扩展到多进程,解决一些多进程的问题,之后进程一些测压——写一个python脚本测试基本的功能,使用webbench测试并发连接;

  3. 加入状态机机制,还是可以暂时不涉及HTTP部分;

  4. 加入HTTP部分,定义Plugin接口;

  5. 开发HTTP插件,比如最基本的静态文件处理。

接下来开工~加油~

你可能感兴趣的:(http,server,lighttpd,网络编程,状态机)