随笔分类 -  Lighttpd源码分析

分析Lighttpd1.4.20的源代码
摘要:Lighttpd所要处理的错误分为两种。一种是http协议规定的错误,如404错误。另一种就是服务器运行过程中的错误,如write错误。 对于http协议规定的错误,lighttpd返回相应的错误提示文件。其实对于lighttpd而言,这不算错误。在返回错误提示文件后,相当于顺利的完成了一次请求,只是结果和客户端想要的不一样而已。 对于服务器运行中的错误,状态机会直接进入CON_STATE_ERROR状态。大部分的情况下,这种错误都是由客户端提前断开连接所造成的。比如你不停的刷新页面,在你刷新的时候,前一次的连接没有完成,但被浏览器强行断开,这时,服务器就会出现连接错误。对于服务器而言,刷新. 阅读全文
posted @ 2011-05-05 00:03 kernel@hcy 阅读(4439) 评论(0) 推荐(0) 编辑
摘要:好久没顾这个了,最近比较清闲,重新拾掇一下,有始有终。 回到正题,前一篇介绍完了请求的处理,先面lighttpd将会把处理的结果返回给客户端。状态机进入CON_STATE_RESPONST_START。在这个状态中,服务器主要的工作在函数connection_handle_write_prepare。这个函数不算复杂,主要是根据客户端请求的method来设置response的headers,其实就是设置“Content-Length”的值。下面是函数代码,做了一些删减: 1 static int connection_handle_write_prepare(server * srv, co. 阅读全文
posted @ 2011-04-30 23:43 kernel@hcy 阅读(4177) 评论(2) 推荐(0) 编辑
摘要:前面大概的介绍了一下lighttpd的状态机。在这篇中,将通过状态机,看看lighttpd到底是怎样处理连接请求的。在本篇中,我们只介绍lighttpd的最基本功能──处理静态页面。lighttpd处理静态页面要使用mod_staticfile.c插件。从名字中也可以看出是用来处理静态文件的。另外这个插件在配置文件中没有配置,是lighttpd默认会加载的。首先还是把状态机放这,以便查阅。首先,连... 阅读全文
posted @ 2010-04-07 17:51 kernel@hcy 阅读(5091) 评论(3) 推荐(2) 编辑
摘要:前面讲了lighttpd的fdevent系统,从这一篇开始,我们将进入lighttpd的状态机。状态机可以说是lighttpd最核心的部分。lighttpd将一个连接在不同的时刻分成不同的状态,状态机则根据连接当前的状态,决定要对连接进行的处理以及下一步要进入的状态。下面这幅图描述了lighttpd的状态机:(在lighttpd源码文件夹中的doc目录中有个state.dot文件,通过dot命令可... 阅读全文
posted @ 2010-03-24 22:11 kernel@hcy 阅读(8363) 评论(1) 推荐(2) 编辑
摘要:前面讲了lighttpd是怎样使用fdevent系统的,以及监听socket的处理过程。这一篇我们来看一看lighttpd是怎样处理连接socket的。首先,我们来看看lighttpd是怎样建立和客户端的连接的。前面在讲监听socket的处理过程中其实已经讲解了连接的建立过程。lighttpd监测监听socket的IO事件,如果有可读事件发生,那么表示有新的连接请求,然后调用network.c/n... 阅读全文
posted @ 2010-03-22 21:57 kernel@hcy 阅读(5030) 评论(1) 推荐(0) 编辑
摘要:前面讲了lighttpd的fdevent系统的初始化过程。这篇要看一看lighttpd是怎样使用fdevent系统的。讲解的过程中,会详细的分析fdevent的源代码。首先还是从server.c的main函数入手。在程序的初始化过程中,当完成fdevent的初始化之后,第一个需要fdevent处理的事情就是将在初始化网络的过程中得到的监听fd(socket函数的返回值)注册的fdevent系统中。... 阅读全文
posted @ 2010-03-18 22:34 kernel@hcy 阅读(5174) 评论(1) 推荐(1) 编辑
摘要:前面讲了lighttpd的fdevents结构体以及fdevent系统的对外接口,这一篇将解析一下fdevent系统初始化。C程序在进行真正的编译之前都要进行预编译,那么,我们就先来看看fdevent系统中的一些宏。首先是fdevent.h开头的一些宏:[代码]通过上面的宏判断系统中是否有对应的多路IO系统,如果有,就定义对应的USE_XXX宏,用来方便后面程序的盘算。预编译完这些宏以后,对于当前... 阅读全文
posted @ 2010-03-17 21:31 kernel@hcy 阅读(4528) 评论(0) 推荐(1) 编辑
摘要:前面讲了lighttpd的插件系统,这一篇将看一看lighttpd中的fdevent系统。fdevent系统主要是处理各种IO事件,在web服务器中,主要就是向socket写数据和从socket读数据。通常,web服务器是IO密集型程序,这就要求在数据的读写上,web服务器必须能够具有很好的性能,不会因为某个socket的阻塞而致使其他socket也被阻塞,否则会大大降低服务器的性能。因此,大部分... 阅读全文
posted @ 2010-03-17 17:30 kernel@hcy 阅读(6423) 评论(1) 推荐(1) 编辑
摘要:前面讲了lighttpd插件系统的加载和初始化,这一篇中,将介绍一下plugin.c中的宏PLUGIN_TO_SLOT。在将PLUGIN_TO_SLOT宏之前,我们先来看看lighttpd中插件系统的对外接口。这个接口所对的“外”指的是lighttpd服务器。前面已经提到,在运行的过程中,lighttpd不知道所加载的插件都是干什么用的,只知道这些插件所实现的接口,也就是在... 阅读全文
posted @ 2010-03-14 22:28 kernel@hcy 阅读(4044) 评论(0) 推荐(1) 编辑
摘要:前面讲了lighttpd插件系统的接口,下面我们来看看插件是怎么加载和初始化的。lighttpd的插件是以动态链接库的形式存在的。在服务器启动的时候,在初始化阶段将所有插件都加载进来。在server.c中的main函数中,加载插件是调用plugins_load函数:[代码]请读者注意一下这个函数调用的位置。这个函数是在服务器的初始化阶段进行调用的,并且该函数就在这调用了一次,其他地方没有再被调用过... 阅读全文
posted @ 2010-03-11 22:34 kernel@hcy 阅读(5776) 评论(3) 推荐(1) 编辑
摘要:在lighttpd中,使用插件的形式来增加服务的功能。同时,lighttpd提供了一个插件的公共接口给开发者,方便第三方提供额外的插件。Lighttpd的插件接口主要提供在plugin.h文件中。其中,plugin结构体是最核心的部分。plugin结构体的定义如下:[代码]可以看出,在结构体plugin的设计中,作者使用了面向对象的思想。plugin结构体就是一个虚基类,其中的数据成员,如name... 阅读全文
posted @ 2010-03-11 22:00 kernel@hcy 阅读(5777) 评论(2) 推荐(2) 编辑
摘要:lighttpd的工作模型很简单──一个主进程加多个工作进程的多进程模型,也就是所谓的watcher-worker模型。 整个程序的入口(main函数)在server.c文件中。在main函数的开始部分必然是处理参数和各种繁杂的初始化工作。其中有两个地方要重点看一起。第一个是下面的语句:[代码] 这个If语句是为了判断配置文件的语法是否合法。但是,明显,没有进行任何的测试,... 阅读全文
posted @ 2010-02-11 21:56 kernel@hcy 阅读(8119) 评论(0) 推荐(1) 编辑
摘要:etag的全称是entity tag(标记实体值),在RFC2616中关于etag的定义如下:The ETag response-header field provides the current value of the entity tag for the requested variant. The headers used with entity tags are described in... 阅读全文
posted @ 2009-11-16 21:53 kernel@hcy 阅读(2074) 评论(0) 推荐(0) 编辑
摘要:使用一个比特位来表示一个事件的两种状态,即节省内存,又可以提高运行速度。在Lighttpd中,提供了一个bitset数据结构,用来管理使用一个比特位集合。 在bitset.h中,比特位集合的数据结构定义如下:typedef struct{ size_t *bits; size_t nbits;} bitset;bits指向一个size_t类型的数组,存放bit集合。size_t类型通常被定... 阅读全文
posted @ 2009-11-04 21:35 kernel@hcy 阅读(1986) 评论(0) 推荐(0) 编辑
摘要:在web服务器中,通常要设计很多字符串的处理。比如客户端请求的 URI地址、发送的 query参数、post 提交的数据等等都是一串字符。因此,提供对字符串的灵活高效的处理,对lighttpd的效率至关重要。 在lighttpd中,buffer提供了对字符串的处理。在buffer.h中,有如下的数据结构定义: //定义buffer[代码] 上面的结构体定义了lighttpd中,对字符串处理的基本结... 阅读全文
posted @ 2009-11-04 20:52 kernel@hcy 阅读(3885) 评论(2) 推荐(0) 编辑
摘要:Lighttpd提供了一个通用数组,这个数组与程序的其他部分练习较少,因此可以单独进行分析。 首先要说一下Lighttpd中的定义的一些数据结构。 在array.h中有下面的定义:[代码]这是一个枚举类型,定义了各个数据类型的标志。从中可以看出程序中所定义使用的数据类型的种类和个数。Lighttpd在定义数据类型的时候使用了面向对象的思想,因此,程序具有很好的扩展性和适应性。这些类型中,最重要的是... 阅读全文
posted @ 2009-10-23 20:42 kernel@hcy 阅读(5441) 评论(0) 推荐(5) 编辑