现在的位置: 首页 > 综合 > 正文

第2章 Apache平台和结构

2012年12月09日 ⁄ 综合 ⁄ 共 3302字 ⁄ 字号 评论关闭

转载注明出处!

版权所有,yacsha(wangcheng711@gmail.com)

http://blog.csdn.net/yacsha/

2007-05-17

2 Apache平台和结构

apache作为常驻后台程序运行(windows下是services,unix下是deamon),这样可以加快服务速度和节省服务器资源.作为一个实际运作中的服务程序,我们需要让它随系统启动,常驻系统之中.早期apache版本运行在inetd模式 (对每一个请求创建一个进程来服务),这种模式不太适合实际中使用.

 

2.1 概要

       apache http服务器由一个小核心和一系列模块组成.这些模块可以以静态方式编译到服务进程程序中,也可以以动态库的形式加载,动态模块一般存放在/modules/或者/libexec/目录.另外apache http服务程序需要依靠apr(…..)运行.apr库专门用来提供跨平台.


apache结构

 

因此模块的运行不需要依靠具体的平台.mpm(多进程模式)模块是一个特别的模块,用来针对专一的平台来优化apache. mpm模块是唯一一个需要和操作系统交道的模块,其他模块应该通过apr库来完成自己的功能.

 

2.2 两个阶段

       apache启动服务有两个阶段.初始化和运行.root方式随系统启动,解析配置文件,加载模块,初始化一些系统资源,例如日志文件,共享内存段,数据库连接.对正常的操作,apache放弃自己特权用户级别,启动非特权用户用来接受用户的服务请求.这种基本安全方法用来阻止apache(或者模块,脚本)中一些简单错误而导致的系统级别的安全问题.像用malwarems iis进行溢出攻击的”code red(红色代码)””Nimda(尼姆达)”病毒.

       这两个阶段的操作暗示着应用程序的结构,首先,任何需要系统权限的程序都必须在系统启动时候运行(译者注:这个好像有问题???不随系统启动就拿不到系统权限??).第二,在程序启动的时候进行所有的初始化,这是一个好方法.减少在接受请求的时候进行初始化.这些耗资源和拖慢速度的操作都在程序启动的时候完成, 相比apacheinetd或者tcpserver模式运行是有效率的.

在启动的时候执行两次配置代码是一个没有直觉,奇怪的结构(不包括重新启动服务),第一次,检查配置是不是有效(最少能让apache启动),第二次是在启动服务的时候,就是我们上面说到的第二个阶段,大多数模块都能忽略这一阶段的初始化(:apache会以非特权用户的方式启动服务进程),通过使用apr缓存池可以避免资源泄露,这些对一些模块有一些提示,例如,一个动态加载的模块只希望运行一次初始化代码,因此我们必须使用一种方法通过设置和检查全局的一个标志变量来确保关键变量只被初始化了一次.

 

2.2.1 初始化阶段

       这个阶段用来读取配置文件,加载模块,初始化需要的资源,每个模块可能有自己需要的资源,在这个时候初始化自己需要的资源.在初始化阶段, apache以一个单进程,单线程,完全控制系统的方式运行.

 

2.2.1.1 配置

       httpd.conf文件是apache的主要配置文件,术语规范,第三方apache组织,像提供rpm,deb.可能使用一个不同命名表,另外httpd.conf文件可能是单一文件,也可能是多个文件.通过使用include指令来包含不同的配置文件.一些组织有非常难懂的配置,例如对Debian GNU/Linuxapache配置,需要对Debian非常熟悉.本书不是用来谈论这种设计的优缺点,因此我们仅仅简单的把这个配置文件叫做httpd.conf.

       httpd.conf文件是一个纯文本文件,在程序初始化的时候被一行一行的解析,该文件由指令,容器,注释组成.空白行是允许的,不会对配置起任何影响.

      

       指令

       httpd.conf文件中大多数内容是指令.一个指令可以没有参数,也可以有多个参数,参数之间用空格隔开.每一个指令有自己的语法格式,不同的指令允许不同的参数个数和参数类型(有字符串 数字 枚举 布尔 或者文件名).核心和一些模块有自己支持的指令,我们在第9章中详细讨论.

       例如:

       LoadModule foo_module modules/mod_foo.so

这个指令由mod_so支持,用来加载一个模块.第一个参数是模块名(字符串,数字字符).第二个参数是文件名.可以是绝对路径也可以是相对路径.

 

       DocumentRoot /usr/local/apache/htdocs

       这个指令由核心模块支持,用来设置网页根目录.

 

       SetEnv hello “Hello, World!”

       这个指令由mod_env支持,用设置环境变量.注意,第二个参数包含空格,我们必须用双引号包含起来.

 

       Choices On

       这个指令由mod_choices(6)支持,用来激活模块的选项.

       容器

       一个容器是一个特定集合的指令.通过一系列简单的尖括号来归类,容器在语义上和其他指令不同,指令的开始和结束分别独立占一行.有效的指令落在开始和结束的中间.例如由内核模块实现的<VirtualHost>指令.如以下指令

       <VirtualHost 10.31.2.139>

              ServerName www.example.com

              DocumenRoot /usr/www/example

              ServerAdmin webmaster@example.com

              CustomLog /var/log/www/example.log

       </VirtualHost>

 

容器提供作用域的功能,里面的指令只在该作用域内生效.在上面这个例子中,指令只对访问www.example.com域名时候有效.该容器可以被嵌套,除非明确的指示不能嵌套.所有用到的指令,包括容器都是在具体的上下文中生效.

 

       注释

       任何一行以#号开头都被认为是注释.

       # this line is a comment

       一般行中的#不会被认为是注释,除非模块明确的支持该指令.

       一个模块支持的指令在模块没有被加载的时候不会生效.apache在解析这个指令的时候会遇到语法错误.因此mod_so必须以静态的方式加载,这点非常重要的!当你开发一个新模块的时候,没有LoadModule的支持,在你修正你编写的模块的时候,必须重新编译整个服务器程序!

 

2.2.2 运行阶段

       在初始化阶段结束的时候,程序的控制转向多进程模块(mpm)(2.3章节),mpm在系统级别管理apache的操作.根据当前系统来管理进程池或者线程池和一些应用限制(例如对特定情节的应用).启动进程作为控制者,管理一系列子工作例程.这些工作例程用来接受用户的请求.控制者用来创建新的子工作例程,移除多余的工作例程,通过信号指示来停止或者重启服务.

       由于mpm的结构,我们不能在确定的范围内描述运行阶段.尽管标准的mpm以工作例程的方式使用,但是没有被限制只能使用这一种方式使用mpm..原理上另外一个mpm能够在系统层上实现完全不同的服务器结构.

 

2.2.3 停止

       这里没有停止阶段,但是有一些清除工作需要完成在服务停止的时候,在第3章中描述,apache停止的时候,所有注册的清除操作都会被执行.

 

2.3 多进程处理模块(mpm)

       在初始化结束阶段,所有的配置也被解析后,apache的控制转到mpm控制模块,mpm提供apache服务程序和操作系统之间的接口,该模块的主要职责是优化apache适应当前的操作系统平台,确保apache能够足够安全和有效率.

       通过名字我们能看出,mpm

抱歉!评论已关闭.