精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
Apache是强大的Web服务器,它的性能远超微软的IIS服务器软件。它也是典型的网络服务软件,是开发其它网络服务软件的最佳参考模型。
锐英源研究过Apache的2个主要版本1.3和2.0,用它开发过商业软件产品,翻译过它的大量英语资料,经常在Apache的开发邮件列表里查找相关知识点,欢迎对此开源代码进行学习合作和开发合作。
锐英源在Apache的主要研究成果点有:
1、多任务服务器架构(进程管理)
2、request_rec结构的常用成员变量
3、Apache父子进程通信
4、头信息(header)数据说明
5、MIME信息说明
6、配置和系统宏
7、记分牌
8、核心静态文件传送
这里列出核心静态文件传送的流程描述,以资借鉴。
判断长度是否大于4096,如果大于4096则清0小长度发送计数(长度小于等于4096的发送调用计数,是静态全局变量);如果不大于4096,则小长度发送计数加1。
如果读长度小于4096 {
如果socket连接有效,则维持读取发送循环:
读取4096个字节数据
开始发送循环,如果连接有效且没有发送完4096个数据:
发送4096个字节的数据
发送循环结束
读取发送循环结束
}
else {
如果socket连接有效,则维持读取发送循环:
读取12*1450个字节数据
开始发送循环,如果连接有效且没有发送完12*1450个数据:
利用socket的api来判断TCP的底层发送缓冲中有没有数据如有循环等待;
循环发送6*1450个字节的数据
发送循环结束
读取发送循环结束
}
如果小长度发送计数大于4,则清0计数,并休眠1毫秒。
request_rec结构包括一些指针,这些指针指向:服务器完成请求处理后将会清除的资源池,包含每个服务器与每个连接信息的结构,以及更加重要的请求自身信息的结构。
这些当中最重要的信息是一小套描述被请求对象属性的字符串,包括它的URI、文件名、 内容类型与编码(这些信息由处理该请求的转换和类型检查处理器分别填入)。其它经常用到的数据项是一些表,给出了客户端原生请求的MIME头、 准备回送的响应中的MIME头(模块们可以随意加入) 和为向请求提供服务过程中产生的子处理过程提供的环境变量。 这些表用ap_table_get和ap_table_set例程来处理。注意Content-type头的值不能被模块的内容处理器使用 ap_table_*()例程来设置。而是通过把request_rec结构中的 content_type字段指向一个适合的字符串来设置。例如,r->content_type = "text/html"; 最后,还有指向两个数据结构的指针,依次来说,一个是指向每模块配置结构。 具体地,这结构拥有指向这样一些数据结构的指针: 有模块创建来描述自身是如何被配置在给定的目录(通过htaccess文件 或<Directory>部分)中工作的; 以及在为请求提供服务的过程中建立的私有数据(因此模块中处理各段的处 理器能够传送一些“注解”给负责另一个阶段的处理器)。另有一个server_rec 数据结构中的配置向量,也由request_rec指向, 包含着每个(包括虚拟)服务器的配置数据。
这里是一个简化的声明,给出了最常用的成员变量:
struct request_rec {
pool *pool;
conn_rec *connection;
server_rec *server;
/* 请求的是什么对象 */
char *uri;
char *filename;
char *path_info;
char *args; /* 查询参数,如果有的话 */
struct stat finfo; /* 由服务器核心设置;
* 如果不存在这样的文件,st_mode设为零 */
char *content_type;
char *content_encoding;
/* MIME头环境,输入和输出。同时也是一个存放传递
* 给子处理过程的环境变量的数组,因此可以
* 写模块来加入一些东西到环境中去。
** headers_out和err_headers_out的区别是
* 后者即使出错时也被输出并持续通过内部重定向传递
* (因此为错误文档处理器输出的头信息将会包含它们)。
*/
table *headers_in;
table *headers_out;
table *err_headers_out;
table *subprocess_env;
/* 关于请求自身的信息 */
int header_only; /* 头请求,相对于GET */
char *protocol; /* 协议, 或者由客户请求给出,或者是HTTP/0.9 */
char *method; /* GET, HEAD, POST, 等等 */
int method_number; /* M_GET, M_POST, 等等 */
/* 日志信息 */
char *the_request;
int bytes_sent;
/* 一个模块可以设置的标志,用于显示返回的
* 信息是不是易变所以客户端不应该缓存它。
*/
int no_cache;
/* 各种跟随.htaccess文件变化的其他配置信息
* 这些是对于每个模块都有一个无类型指针的配置向量
* (具体指向的东西由各模块决定)。
*/
void *per_dir_config; /* 配置文件中设置的选项,等等 */
void *request_config; /* 针对*这个*请求本身的专门信息 */
};
大多数request_rec结构是通过读取客户端的HTTP请求并填充各个域建立起来的