
Lighttpd1.4.20源码分析
文章平均质量分 77
对Lighttpd服务器的源码框架进行分析,了解高性能web服务器的运作流程以及设计技术。
jiange_zh
linux 网络编程 C++ 算法 数据结构
展开
-
Lighttpd1.4.20源码分析 笔记 状态机之错误处理和连接关闭
这里所说的错误有两种: 1.http协议规定的错误,如404错误; 2.服务器运行过程中的错误,如write错误。对于http协议规定的错误,这里的“错误”是针对客户端的。lighttpd返回相应的错误提示文件之后,相当于顺利的完成了一次请求,只是结果和客户端想要的不一样而已。对于服务器运行中的错误,状态机进入CON_STATE_ERROR状态。常见的错误原因:客户端提前断开连接。比如你不停的刷原创 2016-01-22 11:17:48 · 2558 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 状态机之response
在CON_STATE_RESPONSE_START状态中,服务器开始准备给客户端的response: case CON_STATE_RESPONSE_START: /* * the decision is done * - create the HTTP-Response-Header原创 2016-01-21 23:55:18 · 2871 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 状态机之请求处理
lighttpd请求处理的过程:1.服务器与客户端建立连接后,连接进入CON_STATE_REQUEST_START状态,服务器做一些标记,如连接开始的时间等。2.连接进入CON_STATE_READ状态,服务器从连接读取HTTP头并存放在con->requeset.request中。若一次调用没能读取全部数据,连接的状态将继续为READ,继续等待剩下的数据可读。 在对joblist进行处理的时候原创 2016-01-20 23:01:39 · 1954 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 状态机与插件
Lighttpd启动时完成了一系列初始化操作后,就进入了一个包含11个状态的有限状态机中。每个连接都是一个connection实例(con),状态的切换取决于con->state。lighttpd经过初步处理后将con的基本信息初始化,而插件对事件的处理就是针对con进行的,它拿到con后按照业务需要进行相应处理,然后再交还给lighttpd,lighttpd根据con中的信息完成响应。状态定义如下原创 2016-01-17 14:26:26 · 1402 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 fdevent系统-连接socket及超时处理
上一篇我们探讨了lighttpd对监听socket的处理,这次我们看看连接socket的处理,以及相关超时的处理。lighttpd和客户端建立连接的过程:1.lighttpd检测监听socket的IO事件,如果有可读事件发生,那么表示有新的连接请求,于是调用network.c/network_server_handle_fdevent()来处理连接请求。2.network_server原创 2016-01-15 23:34:48 · 1596 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 fdevent系统-事件处理
我们仍然从server.c的main函数开始。当完成fdevent的初始化之后,第一个需要fdevent处理的事情就是将在初始化网络的过程中得到的监听fd(socket函数的返回值)注册到fdevent系统中。该动作调用的是network_register_fdevents()函数,定义在network.c文件中:/** * 在fd events系统中注册监听socket。 * 这个函数在子进程原创 2016-01-15 13:27:45 · 1686 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 fdevent系统-初始化
C程序在进行真正的编译之前都要进行预编译。我们看看fdevent系统中的一些宏:#if defined(HAVE_EPOLL_CTL) && defined(HAVE_SYS_EPOLL_H)# if defined HAVE_STDINT_H# include <stdint.h># endif# define USE_LINUX_EPOLL# include <sys/epoll.h原创 2016-01-15 11:30:19 · 1175 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 fdevent系统-结构体及对外接口
fdevent系统主要是处理各种IO事件,在web服务器中,主要就是向socket写数据和从socket读数据。web服务器是IO密集型程序,因此,大部分的web服务器都采用非阻塞IO进行数据的读写。lighttpd通过fdevent系统,采用类似OO中面向对象的方式将对IO事件的处理进行封装,对于不同的IO系统,提供一个统一的接口。lighttpd采用了所谓的Reactor模式,也就是非阻塞IO加原创 2016-01-15 11:00:07 · 1309 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 通用数组array.c(h)
首先回顾以下,在array.h中,UNSET类型是一个宏:#define DATA_UNSET \ data_type_t type; \ buffer *key; \ int is_index_key; /* 1 if key is a array index (autogenerated keys) */ \ struct data_unset *(*copy)(原创 2016-01-14 21:54:27 · 1113 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 数据结构的组织
我们看源文件,可以看到一些前缀了data_的文件: data_array.c、data_config.c、data_count.c、data_fastcgi.c、data_integer.c、data_string.c, 这些文件实现的是 lighttpd 的数据结构部分。 可以看到它们内部都包含了array.h。结构体定义在 array.h 头文件内有几个结构体定义: data_unset、原创 2016-01-09 23:55:16 · 1179 阅读 · 0 评论 -
Lighttpd1.4.20源码分析 笔记 网络服务主模型
一.概述Lighttpd采用多进程网络服务模型。进程分两种:监控进程watcher 和 工作进程 workers。监控进程:fork工作进程并监视工作进程的数目,一旦有工作进程退出,监控进程立即fork新的工作进程。工作进程:接收客户端请求并做出服务响应。一般情况下,存在一个监控进程和多个工作进程。max-worker值默认为0时,没有监控进程,只有一个工作进程。关于初始化:Lighttpd很多地方原创 2016-01-08 15:12:56 · 4214 阅读 · 0 评论