apache源码分析v2.0

2023-05-16

一。概要
1.平台功能层,可移植运行库层,核心功能层,可选功能层,第三方支持库
2.核心功能层:mod_core 处理配置文件中的大部分配置指令
mod_so 动态加载其余模块
mpm 多进程处理
3.http_config:对配置文件解析,处理,保存.
http_connection:处理http连接
http_protocol:解析http请求头,生成返回给客户端的响应包.
http_request:ap_process_request请求处理。请求本身属性管槽更改,比如ap_allow_methods。子请求。重定向请求。
http_core:处理http协议。
mod_core:对核心需要的指令进行比较。


二。apache启动。(server/main.c)
http://blog.csdn.net/fatowen/article/details/5112349
 Apache运行MAIN函数入口->init_process初始化apr库(apache也是apr库的使用者)->首先要将相应的可选挂钩注册到核心->>init_process函数内初始化在命令行输入的指令信息并赋值存储在process_rec全局变量中->ap_setup_prelinked_modules将所有预链接的模块加入到模块链表中->ap_read_config将读取配置文件和命令行指令信息存放在相应的链表中Apache根据指令加载与连接模块->->ap_run_rewrite_args对通过命令行传入的参数进行重写,只有mpm才用到->apr_getopt对指令进行进一步解析->apr_pool_create分配全局内存池->ap_replace_stderr_log生成日志文件->ap_read_config读取配置文件,在ap_build_config函数中执行指令,并生成配置树->运行ap_run_pre_config()挂钩->ap_process_config_tree处理配置树->所有挂钩排序->检验配置文件挂钩ap_run_test_config()->->运行ap_run_open_logs()挂钩->运行挂钩ap_run_post_config()(运行读取配置文件之后的挂钩函数)其中的mod_ssl的挂钩ssl_init_Module()实现了具体操作-------->进入主循环->清空有挂钩函数->ap_register_hooks遍历所有模块注册的挂钩函数->再次运行读取配置文件,并生成配置树->运行挂钩ap_run_post_config()的过程->ap_run_optional_fn_retrieve其他模块声明自己的导出函数->ap_mpm_run()


1. 初始化内存池资源
2.两次对配置文件读取和解析。第一次预读取,获取第二次读时的配置信息,第二次读取内容。
3.初始化虚拟主机
4.初始化数据库连接。
5.通过ap_mpm_run交给mpm模块。当该模块失败或完毕时返回主程序。各种os特性限制,不存在一种普适的并发模型。
 交给mpm时为普通用户权限。


二。当有请求过来时,堆栈如下:
kd> kp
ChildEBP RetAddr  
0190ff10 6ff0b022 libhttpd!ap_process_request(struct request_rec * r = 0x00705c98) [e:\modsecurity\httpd-2.2.29\httpd-2.2.29\modules\http\http_request.c @ 259]
0190ff28 6ff05215 libhttpd!ap_process_http_connection(struct conn_rec * c = 0x00704cb8)+0x52 [e:\modsecurity\httpd-2.2.29\httpd-2.2.29\modules\http\http_core.c @ 190]
0190ff40 6ff05503 libhttpd!ap_run_process_connection(struct conn_rec * c = 0x00704cb8)+0x25 [e:\modsecurity\httpd-2.2.29\httpd-2.2.29\server\connection.c @ 43]
0190ff50 6ff1f64e libhttpd!ap_process_connection(struct conn_rec * c = 0x00704cb8, void * csd = 0x006f1c60)+0x33 [e:\modsecurity\httpd-2.2.29\httpd-2.2.29\server\connection.c @ 190]
0190ff70 78543433 libhttpd!worker_main(void * thread_num_val = 0x00704cb0)+0x9e [e:\modsecurity\httpd-2.2.29\httpd-2.2.29\server\mpm\winnt\child.c @ 784]
0190ffa8 785434c7 MSVCR90!_callthreadstartex(void)+0x1b [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 348]




三。http连接处理
1.pre_connection的挂钩:
core_pre_connection(core.c中,是必须的。禁用nagle算法,),
ssl_hook_pre_connection,
nwssl_pre_connection,
logio_pre_conn插入log_input_outpu输入输出过滤器,
dumpio_pre_conn,
2. process_connection(允许协议模块处理,比如ftp,pop3.现在主要是http_core.c中的ap_process_http_connection和ap_process_http_async_connection). 
ap_read_request.
ap_process_request.
 
四。http_protocol模块解析报文。
解析http请求头(get index.html http/1.1),请求域(accept:*/*),请求体.保存到request_rec中。
经过输入过滤器链表,比如敏感字符。


五。请求处理ap_process_requst函数。
1.请求解析。通过ap_unescap_url函数进行url字符转义(如空格转为%20)。




六。->prefork_hooks->prefork_run->make_child->child_main->apr_thread_create->start_threads
1-->create_listener_thread->create_listener_thread->listener_threadap_process_connection(server/connection.c)->ap_run_process_connection
2-->worker_thread->process_socket->ap_process_connection


七。register_hooks->ap_hook_process_connection(core_pre_connection(core.c中))->ap_process_http_connection->ap_process_http_sync_connection
-->ap_read_request
-->ap_process_request->ap_process_async_request->ap_process_request_internal(server/request.c)->ap_unescape_url(处理url)->
ap_getparents(改成绝对路径,剔除/../)->ap_location_walk(查找该url的配置信息,比如授权,权限)->ap_run_translate_name对url转换比如代理添加proxy.->ap_run_map_to_storage(转换为本地磁盘资源的路径)->ap_location_walk读取转换后的新url的配置信息->ap_run_header_parser检查http头->ap_run_access_checker检查访问限制,比如限制ip访问->ap_run_check_user_id检查用户密码->
ap_run_auth_checker资源的权限检查->ap_run_type_checker检查资源类型,由mod_mime完成.->ap_run_fixups生成相应内容给客户.


八.htaccess文件对每个请求读取一次配置文件.


九。杂项
1.条件指令由core.c处理.比如ifmodule的处理函数为函数start_ifmod.
2..htaccess处理函数为ap_parse_htaccess,在config.c文件中,在request.c中调用。当接收到一个http请求时,需要获取对应的location配置信息,目录配置信息及文件配置信息当查找目录配置信息时,需要处理.htaccess文件。
3.模块相关:
apache1.3版本模块分为三部分:模块描述结构,模块配置数据结构,apache请求各阶段对应的处理函数。函数分为两种:初始化函数和请求处理函数。初始化函数负责对模块,子进程等进程初始化,包括mod_init,child_init,child_exit.
apache2.0版本:模块描述结构,模块配置数据结构,挂钩注册函数,指令表,可选函数,过滤器相关处理。
核心模块和非核心模块通过request_rec, conn_rec, server_rec结构交互。
module结构定义在http_config.h中。
apache模块状态过程分为预加载模块,预链接模块。ap_preloaded_modules定义在os/win32/modules.c中,包括所有默认静态编译的模块。ap_prelined_modules包括默认在apache
启动后处于激活状态的模块。
ap_loaded_modules包括所有已经加载的模块,但不一定激活。ap_top_modules链表保存所有被激活的模块。
ap_setup_prelinked_modules函数开始加载模块,在main.c中。ap_add_module用于加载模块,对应于AddModule指令。
ap_add_module_commands函数将模块的指令及指令处理函数加入到指令哈希表中。
4.指令表:对于指令共享,apache2.2引入哈希表解决。键是指令名称,值是对应的处理函数的模块链表,由ap_mod_list结构表示,全局哈希表由ap_config_hash表示,每次通过ap_add_module_commands插入,然后rebuild_conf_hash重建哈希表。
动态模块加载由函数load_module实现,在modules/mappers/Mod_so.c中。
5.关于hook挂钩。使用ap_run_xxx触发挂钩,挂钩的触发通常是由核心模块在对客户端请求进行处理过程中进行的。使用ap_hook_xxx注册挂钩。当调用某个挂钩时,apache核心逐一遍历所有的模块,检查该模块是否注册了该挂钩,如果注册了,则调用该
挂钩函数处理,没有则查找下一个模块。
声明挂钩使用AP_DECLARE_HOOK. APACHE挂钩分为两类,启动挂钩和请求挂钩。启动挂钩有pre_config,post_config,open_logs及child_init.请求挂钩按顺序包括create_connection,pre_connection,process_connection,create_request,keep-alive阶段
(create_request,post_read_request),解析url阶段(translate_name(修改uri,比如mod_proxy添加proxy关键字),map_to_storage,header_parse(已废弃,换到post_read_request阶段)),授权认证阶段(access_checker(根据特定条件限制资源访问,比如ip),check_user_id(验证用户名和密码),auth_checker(通过认证的用户是否有权限查看资源)),响应内容生成阶段(type_checker(修改文档类型,比如mod_mime设置内容语言,编码及类型),fixups(向客户发送响应之前确定响应头,修改数据的最后机会),insert_filter(),handler)等。
同一挂钩的不同模块的函数数组使用apr_array_header_t数组报错,数组元素类型是ap_LINK_xxx格式。

   --成文于2015-5-6

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

apache源码分析v2.0 的相关文章

随机推荐

  • 基于图像拼接的无人机自主导航实时SLAM

    大多数无人机利用全球导航卫星系统 xff08 GNSS xff09 技术和惯性传感器 xff08 INS xff09 来估计自己的地理空间定位 无人机通过GNSS接收器进行增强 xff0c 这些接收器受益于从卫星发射的接收时间无线电信号来计
  • jar 压缩解压缩

    JAR包是Java中所特有一种压缩文档 其实大家就可以把它理解为 zip包 当然也是有区别的 JAR包中有一个META INF MANIFEST MF文件 当你找成JAR包时 它会自动生成 JAR包是由JDK安装目录 bin jar exe
  • Inverse elbow manipulator的正逆运动

    Inverse elbow manipulator 该结构同样是6 DOF xff0c 只是后面三个关节不是重合 这样子的结构 xff0c 工作空间更大 正运动好做 xff0c 逆运动还在推导中
  • 使用IMU进行状态估计及进阶

    文章目录 前言基本思想一 姿态估计1 1 通过6轴IMU来进行姿态估计的入门级方法1 1 1 通过加速度计计算姿态1 1 2 引入陀螺仪来得到更好的姿态估计 1 2 四元数解算姿态角解析 二 姿态估算与滤波的关系2 1 状态方程和观测方程2
  • Mujoco-小球建模与控制

    视频教程 xff1a https www bilibili com video BV1e44y1H7Mn 资源请到tiny cc mujoco下载 涉及内容 本次课程制作了一个简单的小球模型 然后对小球进行简单的模拟 xff0c 并演示了一
  • Mujoco-欠驱动的二阶单摆的LQR控制

    MuJoCo Lec7 span class token keyword void span span class token function f span span class token punctuation span span c
  • 四元数姿态计算

    本文基本上就是 1 的注解 一基本概念 1 1 四元数的定义 Quaternion A quaternion is a four dimensional complex number 四元数是一个四维的复数 写成行向量形式的话 q 61 q
  • Mujoco的关节与外力和驱动器

    核心公式 xff1a M qacc 43 qfrc bias 61 qfrc applied 43 ctrl M xff1a 惯性矩阵 qacc 加速度 qfrc bias 科里奥利矩阵和重力矩阵之和 xff1a qfrc bias 61
  • F28069的cpu定时器

    工程搭建参考 xff1a https blog csdn net feisy article details 126380289 F28069有三个32位的CPU定时器 xff1a 0 1 2 0 xff0c 1可用 xff0c 如果程序未
  • TI DSP的中断

    F28069的中断数是96个 xff0c 分为12组 The PIE block can support 96 individual interrupts that are grouped into blocks of eight Each
  • DSP的PWM

    PRD 周期寄存器 xff0c 决定了PWM的周期 频率 CMP 比较寄存器 xff0c 决定了PWM的占空比 CRT 计数寄存器 PWM原理图 为什么需要PWM
  • 出色的html滑动效果库 swiper -例子4 超长单栏横向滑动

    可以用于div滑动 xff0c 图片滑动等切换 例子代码以及所需资源 xff1a http download csdn net detail feisy 6638105 官网例子 xff1a 使用iframe来在同一个页面里面加入了很多各种
  • 【华人学者风采】张祥雨 旷视研究院

    华人学者风采 张祥雨 xff0c 旷视研究院基础模型负责人 研究领域主要为计算机视觉 曾与旷视首席科学家孙剑博士共同发明深度残差网络 ResNet 2020年发表论文 xff1a 22 发表论文 xff1a 58 论文引用数 xff1a 6
  • 出色的html滑动效果库 swiper -例子5 横向自由滑动 可以滑动部分

    可以用于div滑动 xff0c 图片滑动等切换 例子代码以及所需资源 xff1a http download csdn net detail feisy 6638105 官网例子 xff1a 使用iframe来在同一个页面里面加入了很多各种
  • 不要将两个指针变量指向同一块动态内存

    不要将两个指针变量指向同一块动态内存 这个容易引起很严重的问题 如果将两个指针变量指向同一块动态内存 xff0c 而其中一个生命期结束释放了该动态内存 xff0c 这个时候就会出现问题 xff0c 另一个指针所指向的地址虽然被释放了但该指针
  • CMAKE的一些编译选项

    set CMAKE BUILD TYPE 34 Release 34 if CMAKE BUILD TYPE STREQUAL 34 Debug 34 set CMAKE CXX FLAGS 34 CMAKE CXX FLAGS std 6
  • 查看当前系统的glibc版本

    from http my oschina net acmfly blog 77211 有时我们经常需要查看当前系统的glibc版本 xff0c 可以这样查看 xff1a lib libc so 6 有时 xff1a lib x86 64 l
  • 禁忌搜索算法简介

    忌搜索 xff08 Tabu Search或Taboo Search xff0c 简称TS xff09 的思想最早由Glover 1986 提出 xff0c 它是对局部领域搜索的一种扩展 xff0c 是一种全局逐步寻优算法 xff0c 是对
  • 自定义文件格式注册和图标设置

    我们很多时候可能会有这样的一种需求 xff0c 即要生成自己的文件格式 xff0c 然后将这种文件格式注册到操作系统中 xff0c 双击就会使用特定的程序来打开 xff0c 并且我们还想为这种文件格式设置一个图标和缩略 本文章解决的是注册文
  • apache源码分析v2.0

    一 概要 1 平台功能层 xff0c 可移植运行库层 xff0c 核心功能层 xff0c 可选功能层 xff0c 第三方支持库 2 核心功能层 xff1a mod core 处理配置文件中的大部分配置指令 mod so 动态加载其余模块 m