锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / Web服务器Apache开源技术基地
技术分类
Apache疑难
Apache调试
mod_perl和print相关分段错误
查找apache2.0为什么会发送错误文本和为什么杀不死
Apache2.0下的vodd的内存占用大问题
使用ulimit -v命令可以设置进程占用的VSZ少,但是对RSS还是会不断增长
ApacheWeb服务器架构
Apache请求处理阶段目的详解
Apache请求处理阶段介绍
apache_arc
apache_detail
apache_meaning
apache_request
Apache模块
ap_pass_brigade函数分析
apache过滤器随笔
mod_perl特有的功能流
Apache模块定义
Http_core模块
Mod_alias模块
Mod_rewrite模块
Mod_so模块
Mod_userdir模块
Apache数据结构
Apache数据结构主要分类和功能介绍
Buckets and Brigades目的和用法
Buckets and Brigades函数
Apache数组
Apache队列Queue
Linux通用线程池
Apache学习示例
父子进程
用Apache精通C语言
Apache的API
Apache的API
模块初始化和释放回调和模块配置访问函数
指令范围适用原则和配置钩子
Apache的使用
Apache在不同操作系统下的一些差异点
Apache的操作环境
Apache的编译
Perl内存不足和DPERL_EMERGENCY_SBRK解决方法
/dev/null附近语法错误、无法调用register_cleanup方法、readdir()不工作
print()无法发送、退出信号段错误、null line 0和使用XML:解析器
使用未初始化的值和回调退出
改写返回1、捕获SIGPIPE和显示明确包名
mod_perl编译问题和解决方法
编译mod_perl时的分段错误和错误路径
安装多个Perl或/usr/lib/目录下有libper导致编译模糊问题
无法加载Oracle.so和无效命令PerlHandler
未找到floatdisf参考符号、RegistryLoader中翻译uri到文件名失败和Apache加载失败
无法为DBI模块加载DBI.so
不能主动定义子程序、发送另一个SIGHUP和执行优雅重启时进程停止
当使用PerlFreshRestart时导致错误和常量子程序XXX重新定义
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

Web服务器Apache开源技术基地


Apache简介

Apache是强大的Web服务器,它的性能远超微软的IIS服务器软件。它也是典型的网络服务软件,是开发其它网络服务软件的最佳参考模型。

锐英源研究过Apache的2个主要版本1.3和2.0,用它开发过商业软件产品,翻译过它的大量英语资料,经常在Apache的开发邮件列表里查找相关知识点,欢迎对此开源代码进行学习合作和开发合作。


锐英源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

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请求并填充各个域建立起来的

友情链接
版权所有 Copyright(c)2004-2024 锐英源软件
统一社会信用代码:91410105098562502G 豫ICP备08007559号 最佳分辨率 1440*900
地址:郑州市金水区文化路97号郑州大学北区院内南门附近