一、web服务器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 架构图。
服务器提供服务的方式
网络服务器由于要同时为多个客户提供服务,就必须使用某种方式来支持这种多任务的服务方式。一般情况下可以有三种方式来选择,多进程方式、多线程方式及异步方式。其中,多进程方式中服务器对一个客户要使用一个进程来提供服务,由于在操作系统中,生成一个进程需要进程内存复制等额外的开销,这样在客户较多时的性能就会降低。为了克服这种生成进程的额外开销,可以使用多线程方式或异步方式。在多线程方式中,使用进程中的多个线程提供服务,由于线程的开销较小,性能就会提高。事实上,不需要任何额外开销的方式还是异步方式,它使用非阻塞的方式与每个客户通信,服务器使用一个进程进行轮询就行了。
虽然异步方式最为高效,但它也有自己的缺点。因为异步方式下,多个任务之间的调度是由服务器程序自身来完成的,而且一旦一个地方出现问题则整个服务器就会出现问题。因此,向这种服务器增加功能,一方面要遵从该服务器自身特定的任务调度方式,另一方面要确保代码中没有错误存在,这就限制了服务器的功能,使得异步方式的Web
服务器的效率最高,但功能简单。例如Unix 平台上的thttpd
就是这样的一种服务器,然而由于它提供的功能少,只能是满足少部分人的需要。即便如此,thttpd
每隔一段时间还会出现一些问题,幸运的是,它出问题时从不是进入死循环,而是被操作系统杀死,这样就可以使用一个shell
循环立即重启动thttpd,从而基本不影响Web 服务。
由于多线程方式使用线程进行任务调度,这样服务器的开发由于遵从标准,从而变得简单并有利于多人协作。然而多个线程位于同一个进程内,可以访问同样的内存空间,因此存在线程之间的影响,并且申请的内存必须确保申请和释放。对于服务器系统来讲,由于它要数天、数月甚至数年连续不停的运转,一点点错误就会逐渐积累而最终导致影响服务器的正常运转,因此很难编写一个高稳定性的多线程服务器程序。微软的IIS 就是使用的多线程方式,由于微软聚集了相当多优秀程序员,所以IIS
基本上还是值得信赖的,当然我也遇到过很多系统管理员,他们根据经验定期启动所管理的NT 服务器,以预防不可预料的Web 服务停止现象。
多进程方式的优势就在于稳定性,因为一个进程退出的时候,操作系统会回收其占用的资源,从而使它不会留下任何垃圾。即便程序中出现错误,由于进程是相互隔离的,那么这个错误不会积累起来,而是随着这个进程的退出而得到清除。
预生成进程方式的性能
由于Apache 是采用的多进程方式提供服务,为了提高性能,Apache 采用了一种特别的方式,即预生成进程模型。分析多进程方式比其他两种方式开销大的主要原因,是对每一次客户请求,都要生成一个子进程以便进行处理,因此为了避免这种开销,可以使用预先生成的进程来提供服务,并且每个进程在提供一次服务之后也不会立即退出,而是仍然保留在系统中,等待下一次请求。
这里就可以看出,在理想情况下,预先生成的多个进程可以全速回应相应数量的浏览器客户请求,而没有额外的性能开销,因此就完全可以和线程或异步方式相媲美。然而在实际运行当中,由于预先生成的进程毕竟要占用系统资源,如系统内存和CPU 处理能力,
这样如果预先生成的进程超过需要,性能反而会降低。因此Apache 就采用了这样的一种策略,在系统中保持一定的空闲进程,当空闲进程较少时就自动生成,当空闲进程较多时就让一些进程退出。
由于Apache
采用这样的预生成进程模型,就导致预先要生成多少进程、保留多少空闲进程、一个进程提供多少次服务等等成为与性能密切相关的问题,然而,这些设置都是与具体条件密切相关的。例如,越多的进程需要占用越多的内存,所分得的CPU
处理时间就越少,因此系统的物理内存和CPU 处理能力就决定了进程的最大数量。而Apache
提供的基本配置是为了适应大多数情况,在客户请求较少时也不占用过多资源,因此并不是最高性能的设置。而大多数Web 服务器测试的条件下,服务器的内存、CPU
处理能力都不是问题,甚至内存大到足以将所有要访问的文档都可以放在系统缓冲中,因而无须考虑磁盘处理能力,这种情况和实际应用完全不同。因此,SGI
的一位开发者通过调整设置,并使用他自己对Apache 代码的一些改动,在同一个SGI Origin 200 服务器上使用SPECweb96
进行测试,调整后的服务器可以比原始设置提高10 倍的速度,当然这是针对SPECweb96
这个测试程序进行的调整,在实际使用中不可能会有这样巨大的差别。这至少从侧面说明了测试结果并不是绝对的。
此外,Apache 的另一个特点是它的功能特别丰富,而每种功能通常就需要进行特别的处理,这会影响Apache
的性能,然而对于具体的情况,却不是每种特性都是必要的,因此可以通过减少这些功能来增加性能。此外,操作系统的调整对于增强Apache
的性能也是非常重要的。如何根据服务器的实际情况调整操作系统以及Apache 的参数,这些内容在Apache
的文档中都有非常详细的描述。这些文档包含在每个Apache 安装文件中,也可以直接从它的主页得到。
Apache 2.0 展望
虽然Apache
服务器使用预生成进程的方式提高了服务器的性能,然而,程方式本身的不足仍然存在,随着访问数量的增多,进程方式比其他两种方式需要消耗更多的内存和CPU
处理能力,这就限制了单台计算机提供更大负载的能力。如果在低端计算机上想服务更多的请求的话,使用异步方式的thttpd
更为适合。例如,一台512MB 内存双CPU的Linux 服务器提供1000 个并发访问时,其负载就会变得相当高,常常会由于内存用光而无法运行程序,这种情况是由于Linux 重视物理内存,不重视交换空间的原因,如果使用同样配置的FreeBSD
作操作系统,情况会有所改变,然而此时由于需要进行内存交换,就无法达到最优性能了。
因此,这些情况下为了支持更改的负载,完全采用进程方式就不太合适了,而应该利用线程节约资源的优点。
然而,在即将到来的Apache 2.0 中,一切都会变得更完美,Apache 2.0 将充分考虑到进程带来的稳定性特征,以及线程带来高效率的特点。它会预生成多个进程,而每个进程中使用多个线程提供Web 服务。由于存在多个进程,即使一个进程死了也不会影响整个Web 服务。对于不支持进程的操作系统,如Windows,那么就使用多个线程提供服务,反之也是一样。然而,只有同时支持线程和进程的操作系统,才能充分利用Apache 2.0带来的稳定性和高负载能力。
事实上当前的Apache 并不是与线程无关,Windows 版本的Apache 是使用线程的,但按照Apache
文档的说法,Windows 版本的Apache 性能并不好,主要原因是它在移植过程中是使用的Windows 的POSIX
子系统,而Windows 本身的有些特性效率更高。而在Apache2.0 中,使用了APR(Apache Portable
Run-time)特性,这种特性对不同的操作系统提供了一个抽象层,以便Apache 能利用Windows 的一些非POSIX 的特性。
Apache2.0在性能上的改善最吸引人.在支持POSIX线程的Unix系统上,Apache可以通过不同的MPM运行在一种多进程与多线程相混合的模式下,增强部分配置的可扩充性能.相比于Apache1.3,2.0版本做了大量的优化来提升处理能力和可伸缩性,并且大多数改进在默认状态下即可生效.但是在编译和运行时刻,2.0也有许多可以显著提高性能的选择.
MPM(Multi-ProcessingModules,多道处理模块)是Apache2.0中影响性能的最核心特性.
我主要来说一下prefork和worker工作模式。
prefork的工作原理
如果不用“——with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM.它所采用的预派生子进程方式也是Apache1.3中采用的模式.prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一.
prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止.这就是预派生(prefork)的由来.这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能.
worker的工作原理
相对于prefork,worker是2.0版中全新的支持多线程和多进程混合模型的MPM.由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器.但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性.这种MPM的工作方式将是Apache2.0的发展趋势.
worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求.同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数.如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程.
Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients.如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程.默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)
需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值).
采用传统的生成子进程的方式来提供服务的Apache,适合服务比较复杂的情况,但性能没有单进程的服务器高,尤其在高负载的情况下更是如此。
对于重负载的Apache专业服务器,可以简单的将以上SpareServers、StartServers、MaxClients四值设相同。
Squid是单进程的服务器,处理静态页面比Apache提高一个数量级。同样,Windows平台的IIS在静态页面上的处理性能也较Apache高几倍的性能(但不如Apache稳定)。
如有两台Apache服务器,第一个Apache服务器只提供静态内容和代理服务,可将MaxClients设置较大。第二个Apache服务器要提供消耗处理器能力的动态网页服务,要将MaxClients设置较小。
因此,应充分利用Apache的原理特性及工作平台,合理地配置以下参数,在运行时动态调整,以使Apache达到最合理的状态:
MaxKeepAliveRequests 100
# 一次连接可以进行的HTTP请求的最大请求次数(比如客户一次连接中请求几十个页面)。
MinSpareServers 5
MaxSpareServers 10
# Apache预先生成多个空余的子进程驻留系统中,用于处理客户请求。两个参数用于设置最小的空余子进程数量及最多的空闲子进程数量。
StartServers 5
# 设置httpd启动时启动的子进程数量。这个参数应设置为前两个值之间的一个数值。小于或大于前两个数值都没有意义。
MaxClients 150
# 服务器支持的最大并发访问的客户数。
# 应根据服务器的物理内存及处理器动态调整。
MaxRequestsPerChild 30
# 每个子进程处理的服务请求次数。超过此值后,子进程副本退出,重新由原始的htttd进程中重新复制一个干净的副本,以提高系统的稳定性。
# 对于静态页面,产生的内存垃圾少,可设置为2000,甚至更高;如服务器载入各种不同的功能模块,产生内存垃圾多,可将此值降低。
# 对于高稳定的系统,如FreeBSD,可设成1000,或更高。
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时,由于是使用线程来处理,所以可以处理海量的请求,而系统资源的开销要小于基于进程的服务器。
- 支持实时监视服务器状态和定制服务器日志
- 支持通用网关接口
- 支持基于IP和基于域名的虚拟主机
- 集成代理服务器模块
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更高的稳定性。
二、apche服务搭建:
A:搭建方式yum 安装apache
默认没有修改apache的http.conf配置文件
实验环境,实验主机为redhat5.8,IP地址为:192.168.137.11
[[email protected] ~]
# yum -y install httpd
查看软件是否已经安装
[[email protected] ~]# rpm -qa httpd
httpd-2.2.3-63.el5
安装完成后查看安装文件:
[[email protected] ~]
rpm -ql httpd
对应的文件做一些简单说明:
服务脚本:/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
运行目录:/etc/httpd
配置文件:
主配置文件:/etc/httpd/conf/httpd.conf
扩展配置:/etc/httpd/conf.d/*.conf
监听的Socket:80/tcp,443/tcp
文档根目录:/var/www/html
CGI:/var/www/cgi-bin/
默认主页:index.html
在实验之前,须确保在httpd.conf配置文件中:
httpd服务监听的端口为80【Listen 80】
开启DocumentRoot "/var/www/html/"
启动服务查看进程和端口状态
[[email protected] ~]# /etc/init.d/httpd start
Stopping httpd: [ OK ]
Starting httpd: httpd: Could not reliably determine the server‘s fully qualified domain name, using 192.168.137.11 for ServerName
[[email protected] ~]# ps -ef | grep httpd
root 11211 1 0 21:56 ? 00:00:00 /usr/sbin/httpd
apache 11212 11211 0 21:56 ? 00:00:00 /usr/sbin/httpd
apache 11213 11211 0 21:56 ? 00:00:00 /usr/sbin/httpd
apache 11214 11211 0 21:56 ? 00:00:00 /usr/sbin/httpd
apache 11215 11211 0 21:56 ? 00:00:00 /usr/sbin/httpd
apache 11217 11211 0 21:56 ? 00:00:00 /usr/sbin/httpd
apache 11218 11211 0 21:56 ? 00:00:00 /usr/sbin/httpd
apache 11219 11211 0 21:56 ? 00:00:00 /usr/sbin/httpd
apache 11220 11211 0 21:56 ? 00:00:00 /usr/sbin/httpd
root 11249 10953 0 22:01 pts/3 00:00:00 grep httpd
[[email protected] ~]# netstat -tulnp | grep 80
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 4280/sendmail
tcp 0 0 :::80 :::* LISTEN 11211/httpd
[[email protected] ~]#
访问http://IP:80
如果想自定义内容,可以通过修改文档根目录的内容
[[email protected] html]# pwd
/var/www/html
[[email protected] html]# cat index.html
my first website1 !!
[[email protected] html]#
语法检测
[[email protected] ~]# httpd -t
httpd: Could not reliably determine the server‘s fully qualified domain name, using 192.168.137.11 for ServerName
Syntax OK
[[email protected] ~]#
重新加载配置
[[email protected] ~]# /etc/init.d/httpd reload
Reloading httpd: [ OK ]
[[email protected] ~]#
B:搭建方式rpm搭建apache
参考地址:
http://blog.tianya.cn/blogger/post_show.asp?BlogID=40003&PostID=4585547
http://www.cnblogs.com/fnng/archive/2012/11/08/2761713.html