一、 前言
简介:Lighttpd是一个轻量级的Web 服务器,支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。它具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。其静态文件的响应能力远高于Apache,可谓Web服务器的后期之秀。
功能:接收、响应用户请求,网元间消息通信,资源传递等。
我将lighttpd理解为一个平台,提供了一整套开发流程以及各种高效的工具。使得我们在服务器功能开发时就像使用VC在现有工程中添加模块一样简单:
VC |
Lighttpd |
打开已有工程并添加新模块的源文件 |
添加空的插件,自定义插件名,将其加入到makefile中 |
编码,调用各种库函数完成对字符串、数组等数据的处理。 |
编码,调用各种库函数(array、buffer、 chunk等等)完成对字符串、数组等数据的处理。 |
编译、连接(点图标或按快捷键) |
编译、连接(执行makefile或封装好的脚本) |
运行、调试 |
运行、调试 |
Lighttpd架构的设计初衷,所有具体的业务功能都应由插件实现。插件之间通常是完全独立(无内联)的,我们可以根据需要选择性的加载所需插件。
因此我们在开发时主要也是针对业务插件的编写和修改以完成我们所需的功能。
二、 架构
1. 状态机
谈到架构就必须从状态机说起,Lighttpd启动时完成了Server实例初始化、默认配置读取(lighttpd.conf)、插件加载等初始化操作,之后就进入了一个包含11个状态的有限状态机中。每个连接(事件)都是一个connection实例(con)。状态的切换完全取决于con->state。
※ 我们在插件中对事件的处理就是针对这个con实例;lighttpd经过初步处理后将con的基本信息初始化;插件拿到con后按照业务需要进行相应处理,然后再交还给lighttpd;lighttpd根据con中的信息完成响应。至此一次请求(事件)结束。
typedef enum {
CON_STATE_CONNECT,
CON_STATE_REQUEST_START,
CON_STATE_READ,
CON_STATE_REQUEST_END,
CON_STATE_READ_POST,
CON_STATE_HANDLE_REQUEST,
CON_STATE_RESPONSE_START,
CON_STATE_WRITE,
CON_STATE_RESPONSE_END,
CON_STATE_ERROR,
CON_STATE_CLOSE
} connection_state_t;
Lighttpd状态转换图
2. 插件
我们编写的插件会注册15(或其中的几个)回调接口(1.4.20)。lighttpd在初始化阶段、状态机执行阶段、退出阶段会分别调用这些回调函数,完成插件的实例化,初始化,连接重置,事件处理,插件释放等功能。它们分别是:
名称 |
handle_uri_raw |
handle_uri_clean |
handle_subrequest_start |
handle_subrequest |
handle_request_done |
handle_docroot |
handle_physical |
handle_connection_close |
handle_joblist |
connection_reset |
handle_trigger |
handle_sighup |
init |
set_defaults |
cleanup |