[转]web服务器apache架构与原理 &apache 监控
web服务器
在开始了解Apache前,我们先熟悉一下web服务器,因为apache也是web服务器的一种。
Web系统由客户端(浏览器)和服务器端两部分组成。Web系统架构也被称为B/S架构。最常见的Web服务器有Apache、IIS等,常用的浏览器有IE、Firefox、chrome等。当你想访问一个网页时,需要在浏览器的地址栏中输入该网页的URL(Uniform Resource Locator,简称为URL)地址,或者是通过超链接链接到该网页。浏览器会向该网页所在的服务器发送一个HTTP请求,服务器会对接收到的请求信息进行处理,然后将处理的结果返回给浏览器,最终将浏览器处理后的结果呈现给用户。
web服务器端的工作流程:
(1)客户端发送请求
客户端(通过浏览器)和Web服务器建立TCP连接,连接建立以后,向Web服务器发出访问请求(如get)。根据HTTP协议,该请求中包含了客户端的IP地址、浏览器的类型和请求的URL等一系列信息。
(2)服务器解析请求
Web服务器对请求按照HTTP协议进行解码来确定进一步的动作,设计的内容有三鼐要点:方法(GET)、文档(/sample.html)、和浏览器使用的协议(HTTP/1.1)其中方法告诉服务器应完动的动作,GET方法的含义很明显是:服务器应定位、读取文件并将它返回给客户。
Web服务器软件现在就知道了,它应该找到文件/sample.html,并使用HTTP/1.1协议将内存返回给客户。信息是经过与请求到来相同的连接发出的,所以服务器不需要定们客户或创建新的连接。
(3)读取其它信息(非必须步骤)
Web服务器根据需要去读取请求的其它部分。在HTTP/1.1下,客户还应给服务器提供关于它的一些信息。元信息(metainformation)可用来描述浏览器及其能力,以使服务器能据此确定如何返回应答。
(4)完成请求的动作
若现在没有错误出现,WWW服务器将执行请求所要求的动作。要获取(GET)一个文档,web服务器在其文档树中搜索请求的文件(/sample.html)。这是由服务器机器上作为操作系统一部分的文件系统完成的。若文件能找到并可正常读取,则服务器将把它返回给客户。
如果成功:文件被发送出去。
首先,web服务器发送一个状态码及一些描述信息。既然文件已经找到,则发送状态码200,表示一切都OK ,文档随后发出,因为发送的信息是HTML文档,所以Content-type 取值为text/html。文档长为1024个字节,所以Content-type 取1024 。服务器软件的标识及文件的时间属性信息也被包含在头域中。
如果失败:返回错误指示。
如果请求的文件没有找到或找到但无法读取,测请求无法满足。这时将返回不同于200的状态码。最常见的问题是请求中的文件名拼写有误,所以服务器无法找到该文件。这种情况下,服务器将发送一个状态码---404 给客户。
(5)关闭文件和网络连接,结束会话。
当文件已被发邮或错误已发出后,web服务器结束整个会话。它关闭打开的的被请求文件,关闭网络端口从而结束网络连接。有关的其它工作则是由客户端来完成的,包括接收数据,并以用户可读的方式呈现出来。这些与服务器无关。
apache架构
Apache 作为历史最悠久的web服务器,一直是web应用系统的首选,是世界上被广泛应用的web 服务器软件,它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的web服务器端软件之一,也是流行架构LAMP的重要组成部分。
作为世界上最流行的Web服务器,Apache遵循的同样是HTTP协议,默认端口号为80。下面来是apache 架构图。
Apache 特点:
- 支持最新的HTTP/1.1通信协议。Apache是最先使用HTTP/1.1协议的Web服务器之一,它完全兼容HTTP/1.1协议并与HTTP/1.0协议向后兼容。Apache已为新协议所提供的全部内容做好了必要的准备。
- 支持多计算机平台。Apache几乎可以在所有的计算机操作系统上运行,包括主流的UNIX、Linux及Windows操作系统。
- 配置文件简单,易操作。用户可以通过直接修改Apache的配置文件信息来修改Apache,操作起来十分方便。
- 支持实时监视服务器状态和定制服务器日志。Apache在记录日志和监视服务器自身运行状态方面提供了很大的灵活性,可以通过Web浏览器来监视服务器的状态,也可以根据自己的需要来定制日志。
- 支持多种方式的HTTP认证。
- 支持Web目录修改。用户可以使用特定的目录作为Web目录。
- 支持CGI脚本,如Perl、PHP等。
- 支持服务器端包含指令(SSI)。
- 支持安全Socket层(SSL)。
- 支持FastCGI。
- 支持虚拟主机。即通过在一台服务器上使用不同的主机名来提供多个HTTP服务。Apache支持基于IP、主机名和端口号三种类型的虚拟主机服务。
- 跟踪用户会话。当用户浏览基于Apache的Web站点时,可以通过Apache的mod_usertrack模块对其进行跟踪。
- 支持动态共享对象。Apache的模块可在运行时动态加载,这就意味着这些模块可以被装入服务器进程空间,从而减少系统的内存开销。
- 支持多进程。当负载增加时,服务器会快速生成子进程来处理,从而提高系统的响应能力。
- 支持第三方软件开发商提供的功能模块。比如Apache加载mod_jserv模块后可以支持Java Servlet,这样就可以运行Java应用程序了。
- 支持多线程和多进程混合模型的MPM。 当MPM类型指定为worker时,由于是使用线程来处理,所以可以处理海量的请求,而系统资源的开销要小于基于进程的服务器。
Apache 工作模拟
Apache 2.X 支持插入式并行处理模块,称为多路处理模块(MPM)。在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到apache的速度和可伸缩性。
Worker MPM : 使用多个子进程,每个子进程中又有多个线程。每个线程处理一个请求,该MPM通常对高流量的服务器是一个不错的选择。因为它比prefork MPM需要更少的内存且更具有伸缩性。
Prefork MPM : 使用多个子进程,但每个子进程不包含多线程。每个进程只处理一个连接。在许多系统上它的速度和worker MPM一样快,但是需要更多的内存。这种无线程的设计在某些性况下优于worker MPM,因为它可在应用于不具备线程安全的第三方模块上(如 PHP3/4/5),且在不支持线程调试的平台上易于调试,另外还具有比worker MPM更高的稳定性。
(后面会介绍如果这两种模式以及apache更多的设置与监控等)
-----------------------------------------------------------------------------------------------------------------------------------------------------------
linux下通过server-status监控性能
要监控apache的性能,我们需要修改配置文件,允许查看apache运行状态的主机。
1)加载mod_status.so
对Apache的状态管理的模块是LoadModule status_module modules/mod_status.so ,所以需要...apache2\conf'\httpd.conf配置文件中修改。
[root@localhost /]# cd /usr/local/apache/conf
[root@localhost /]# vi httpd.conf
找到LoadModule status_module modules/mod_status.so ,去掉其前面的# 号(默认是没有# 号的)
2)下面有修改配置文件有两种方式:
方式一: 在httpd.conf文件底部分添加以下内容:
<location /c-server-status> SetHandler server-status Order Deny,Allow Deny from nothing Allow from all </location> ExtendedStatus On
方法二:在httpd.conf中找到以下内存
# Real-time info on requests and configuration
#Include conf/extra/httpd-info.conf //去掉这一行前面的#号
打开...apache2\conf\extra\http-info.conf 配置文件进行修改。修改内容与方式一相同。
其实,两种无方法是相同的,只是第二种方法更为优雅一点。
修改信息解释:
<location /c-server-status> : c-server-status 这个名字可以任意的取,但最好不要被别人猜到。
Deny from 表示禁止的访问地址;nothing 表示没有禁止访问的地址 。
Allow from 表示允许的地址访问;all 表示所有的地址都可以访问。
ExtendedStatus On 表示的是待会访问的时候能看到详细的请求信息,另外该设置仅能用于全局设置,不能在特定的虚拟主机中打开或关闭。启用扩展状态信息将会导致服务器运行效率降低。
3)重启apache
[root@localhost /]# cd /usr/local/apache/bin/
[root@localhost bin]# apachectl start 启动
[root@localhost bin]# apachectl stop 停止
4)访问
http://你的IP地址:端口/c-server-status
http://你的IP地址:端口/c-server-status ?refresh=N
N将表示访问状态页面可以每N秒自动刷新一次
linux下通过命令监控
除了上面的方式监控性能,我们也可以通过命令来查看进程数与当前连接数。
1、用 ps 来看 httpd 进程数
# ps -ef | grep httpd | wc -l
用这个命令统计当前的httpd进程数,当然这结果包含 grep httpd 的进程输出,一般来说实际进程数比输出结果少1。Apache启动的时候,默认就起来几个进程,如果连接数多了,它就会生出更多的进程来处理请求。
2、用 netstat 来看当前的连接数
# netstat -ant | grep ":80 " | wc -l
连接数目并不等于httpd线程数目,当然连接数目越多,httpd进程数就有可能数会增多。上面的返回结果数目,有可能包括多种连接状态,比如 LISTEN、ESTABLISHED、TIME_WAIT等等,可以加入状态关键字进一步过滤,得到想要的结果。
Win7 64 下通过server-status监控
Win7 64位下的apache并不多,Apache和PHP均未出现官方的64位版本 。下面是CSDN上的网友贡献的,本人验证可用。
http://download.csdn.net/detail/yetilion/4468168
下载后对其进行解压,我解压到了D盘当前目录下。开始---运行---cmd
进入d:\httpd-2.2-x64\bin目录(当前以管理员身份)
d:\httpd-2.2-x64\bin> httpd -k install 安装
如果提示有误的话,请检查当前用户是否是管理员员,或修改http.conf文件里设置的端口是否被占用。
现在用记事本打开conf/目录下的httpd.conf
---------------------------------------------------------------------------------------------------------------------------------------------------------
搜索ServerRoot,把后面的目录改为当前目录,即"/httpd-2.2-x64"
搜索DocumentRoot,把后面的目录改为自己的网页的目录
搜索DirectoryIndex,在后面添加默认主页名字index.html index.htm index.php
搜索ServerName,去掉#号,把后面的网址改成自己的,如: 127.0.0.1:80
在httpd.conf末尾添加如下代码:yourpath你的网站目录
<Directory "d:/yourpath/">
Allow from all
</Directory>
注意:如果电脑安装了IIS的话,要和Apache监听的端口要不同,不然Apache启动不了
----------------------------------------------------------------------------------------------------------------------
使用Apache,在CMD下,进入\httpd-2.2-x64\bin目录,输入以下命令:
d:\httpd-2.2-x64\bin> httpd -k start 启动Apache:
d:\httpd-2.2-x64\bin> httpd -k restart 重启Apache
d:\httpd-2.2-x64\bin> httpd -k shutdown 关闭Apache
http://你的IP地址:端口/c-server-status
Apache Server Status for localhost
Server Version: Apache/2.2.19 (Win64)
Server Built: May 28 2011 15:18:56
Current Time: Sunday, 11-Nov-2012 17:44:21 Öйú±ê׼ʱ¼ä
Restart Time: Sunday, 11-Nov-2012 17:36:28 Öйú±ê׼ʱ¼ä
Parent Server Generation: 1
Server uptime: 7 minutes 52 seconds
Total accesses: 0 - Total Traffic: 0 kB
0 requests/sec - 0 B/second -
1 requests currently being processed, 63 idle workers
______________________________________________________________W_
................................................................
Scoreboard Key:"_" Waiting for Connection, "S" Starting up, "R" Reading Request,"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,"C" Closing connection, "L" Logging, "G" Gracefully finishing,"I" Idle cleanup of worker, "." Open slot with no current process
Srv PID Acc M SS Req Conn Child Slot Client VHost Request
0-1 4140 0/0/0 W 0 287636364 0.0 0.00 0.00 127.0.0.1 192.168.0.100 GET /c-server-status HTTP/1.1
Srv Child Server number - generation
PID OS process ID
Acc Number of accesses this connection / this child / this slot
M Mode of operation
SS Seconds since beginning of most recent request
Req Milliseconds required to process most recent request
Conn Kilobytes transferred this connection
Child Megabytes transferred this child
Slot Total megabytes transferred this slot
参数分析:
参数分析:
字段 说明
Server Version Apache 服务器的版本。
Server Built Apache 服务器编译安装的时间。
Current Time 目前的系统时间。
Restart Time Apache 重新启动的时间。
Parent Server Generation Apache 父程序 (parent process) 的世代编号,就是 httpd 接收到 SIGHUP 而重新启动的次数。
Server uptime Apache 启动后到现在经过的时间。
Total accesses 到目前为此 Apache 接收的联机数量及传输的数据量。
CPU Usage 目前 CPU 的使用情形。
_SWSS.... 所有 Apache process 目前的状态。每一个字符表示一个程序,最多可以显示 256 个程序的状态。
Scoreboard Key 上述状态的说明。以下为每一个字符符号所表示的意义:
* _:等待连结中。
* S:启动中。
* R:正在读取要求。
* W:正在送出回应。
* K:处于保持联机的状态。
* D:正在查找DNS。
* C:正在关闭连结。
* L:正在写入记录文件。
* G:进入正常结束程序中。
* I:处理闲置。
* .:尚无此程序。
Srv 本程序与其父程序的世代编号。
PID 本程序的process id。
Acc 分别表示本次联机、本程序所处理的存取次数。
M 该程序目前的状态。
CPU 该程序所耗用的CPU资源。
SS 距离上次处理要求的时间。
Req 最后一次处理要求所耗费的时间,以千分之一秒为单位。
Conn 本次联机所传送的数据量。
Child 由该子程序所传送的数据量。
Slot 由该 Slot 所传送的数据量。
Client 客户端的地址。
VHost 属于哪一个虚拟主机或本主机的IP。
Request 联机所提出的要求信息。