动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.JAVA评述.
.Java进阶:在SE6中调用编译器的两.
.从XML元素结构到JAVA实现.
.oracle中的数据库乱码的原因与解.
.设计模式之Flyweight.
.探索J2ME:创建开销细节表单.
.在Eclipse中使用Ant来自动编译J2.
.只支持单表映射的持久化框架─Ea.
.Java Development Kit (JDK) 7 B.
.基于 J2EE 体系实现多层结构 Blo.
.Java 6中新型模态对话框API解析(.
.JavaBean的事件.
.JavaScript中的关键字“VAR”使用.
.Java新手入门:浅谈DAO模式.
.关于struts的文本域.
.新手上路:JDBC初级应用实例(一).
.使用多线程技术让你的Swing及时响.
.用JBoss Eclipse IDE开发J2EE应用.
.试试看把XML转成PDF的有效工具:.
.用J2SE 5.0创建定制的泛型集合.

我所认识的Apache

发表日期:2008-1-5 |



  一 序言
-------
我想Linux爱好者没有不知道Apache的. 作为一个linux的治理员更应该精通Apache的配制. 在这里我就我的理解描述一下Apache. 作为一个被广泛使用的Web服务器, Apache将reliable摆在了第一位, performance只是第二位的东东. 这一理念我觉得很好. 当然, 它最好的地方是开放源码, 这才使我们有机会深入了解世界上最流行的Web Server.

二 基本结构介绍
---------------
Apache是由模块组成, 其中http_core.c是最根本的, 一个最小的Apache编译只包含这一个模块. 你可以用"httpd -l" 可以列出Apache被编译进了哪些模块. 动态模块是需要在配制文件中定义的. 在Redhat中, 只有"http_core.c"被编译进去了, 其余的都被编译成了so. 可以被Apache动态加载. Redhat中的Apache是比较非凡的, 标准的Apache只有一个配制文件httpd.conf, 其他的文件都是空的.

下面是在配制文件中装载模块的命令:

LoadModule digest_module modules/mod_digest.so
LoadModule proxy_module modules/libproxy.so
LoadModule PHP3_module modules/libphp3.so
... ...
ClearModuleList
AddModule mod_actions.c
AddModule mod_userdir.c
AddModule mod_alias.c
... ...

LoadModule是用于动态加载模块的. ClearModuleList是删除Apache中的模块列表. AddModule是将模块加入到列表中去. 上面命令是用于重新构造模块列表, 模块在列表中的顺序代表了其处理时的优先级, 后面的优先级高.

Apache将一个Clinet的请求按以下步骤处理:

1. URL -> Filename translation
2. Auth ID checking
3. Auth Access checking
4. Access checking other than auth
5. Determining MIME type of the object requested
6. Fixups
7. Actually sending a response back to the client
8. Logging the request

Apache本身只负责内存分配, IO, 进程治理和模块治理等, 它通过调用模块提供的接口函数完成配制命令的处理和用户请求的实际处理. 其中的核心模块http_core.c提供了最基本的命令, 每一个模块通常都会有自己的配制命令. 模块可以参与上述的八个步骤. 每一个模块提供一个strUCt module, 其中定义了大量的函数指针和结构指针, 通过struct module告诉Apache该模块所支持的命令和参与的步骤.

struct module中定义了改模块的名字, 这是通过宏来完成的, 其名字就是__FILE__. 所以在文件mod_foo.c中定义的模块名字就叫mod_foo.c.

Apache内部维护了一个链表(头指针为top_module). 最初时只有一个
http_core.c. 每一条命令LoadModule, AddModule. 都会在表头加一项. 而在每一步, Apache都会按照链表中的顺序来依次调用每个模块提供的函数. 而在许多步, Apache碰到第一个返回OK的即结束. 因此, 表中的顺序( 这也就是所谓的优先级了 )可以对系统有很大影响.

下面看一下上面说过的八个步骤:

1. URL -> Filename translation
将URL转换为本地的文件名, 例如: mod_alias.c会在这一步处理alais

2. Auth ID checking
3. Auth access checking
4. Access checking other than auth
进行认证处理

5. Determining MIME type of the object requested
决定被请求对象的MIME类型

6. Fixups
不知道(谁知道请告诉我)

7. Actually sending a response back to the client
将应答发送给客户

8. Logging the request
写log

认证的部分会在后面讲. 我们看一看最后几步. Apache继续了通过扩展名来判定MIME类型的方法. AddType用来加入新的一些扩展名:

AddType application/x-httpd-php3 .php3
AddType application/x-tar .tgz

这两条指令定义了后缀为php3和tgz的文件的MIME类型. 这里用的都是标准的MIME类型, 所谓的决定MIME类型其实还包括了另一种情况: 模块会用一些字符串来描述一个请求, Apache根据这一字符串来选择一个相应的模块来处理该请求. 这些字符串都是内部自定义的. 细节会在下面描述.

AddHandler cgi-script .cgi
AddHandler server-parsed .sHtml

Sethandler cgi-script

AddHandler定义了何种扩展名用那一个字符串进行描述.
SetHandler将一个目录下的文件都指定用这一个字符串描述.

我在这里提到的命令都是与其结构密切相关的. Handler和Type的关系在下面会描述的. 许多的东东从外面是看不清楚的, 下面, 我们从里面看.

三 程序的基本结构
-----------------
Apache有非常好的跨平台性. 为了实现这一目标和简化模块编写者的负担,Apache完成了许多基本的功能如IO, 内存分配等, 这些接口都是与具体平台无关的. 还有一些很有用的例程如: hash table, array 等. 在整个体系中, Apache有一个基本点, 它尽可能的使用简单的结构和算法, 这不仅易于理解和维护, 还提高了它的稳定性.

在UNIX系统上, Apache采用了多进程模型, 在Window上采用了多线程模型.多进程模型中, 其子进程处理客户请求, 父进程用于治理子进程. 当系统过载时父进程会再启动几个子进程, 当系统空闲时, 父进程会杀掉几个子进程. 子进程的数目在"MinSpareServers"和"MaxSpareServers"之间. 而且, 每个子进程处理的请求个数也是有限制的, 这可以解决诸如内存泄漏等问题. 所有的进程状态都被记录在share memory中. 由于每个进程的状态记录在其中的一小块内存上, 它通常也只读写这一块内存, 因此, Apache没有使用什么同步机制.

在Richard Steve的书上说到的几种多进程服务器模型, Apache都使用了,在不同的系统上根据其特点选择使用不同的方法:

1. accept :
在accept处阻塞, 只有在accept是在内核级实现的才行.
2. select :
在select处阻塞.
3. mutex/lock_file :
使用mutex或lock_file来进行对accpet进行互斥.

三种方法都要求进行阻塞, 区别在于阻塞与不同的地方. 前两种方法都会由所谓的巨群问题: 多个阻塞在同一个资源上的进程被同时唤醒引发再次竞争. 不过, 按Richard Steve 的评测, 第一种方法最快, 第二种其次, 第三种最慢. 其实, 在linux上第三种方法也会有巨群问题.

Apache虽然并不强调性能, 这并不意味着他们不重视性能. 而是Apache认为在Server端realiable才是第一位的. 但Apache的性能还是不错的.

来源:Bricks with GNU&LINU
上一篇:唯一性约束 人气:467
下一篇:线程池的介绍及简单实现 人气:827
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-8-29 oblog v4.6 build 20080827
2008-8-29 ASBLOG v2.5 bulid 080828
2008-8-29 时尚DJ舞曲小偷 v3.1
2008-8-29 仿代码信息分类系统 v1.0 Beta3
2008-8-29 浮梦呓语-个人网站 完整版
2008-8-29 多用户QQ空间Flash播放器
2008-8-29 美思卡企业网站管理系统高级版
2008-8-28 LDV个人相册系统 v1.6.1
2008-8-28 讯时网站管理系统CMS v3.5
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号