php网站历练三 apache优化


Apache 2.0引入了Apache Portable Runtime (APR)组件,添加了新的多重处理模块(MPM)并改进了现有模块。此外,Apache 2.0增强了核心功能,如新的Apache应用编程接口(API)、IP版本6 (IPv6) 支持、新的构建系统以及简单的配置。从而成为具有一套丰富特性的Web服务器, 并且变得便携、可靠和高效。


Apache Portable Runtime
APR是使几乎所有平台都能够支持Apache功能的关键组件。一旦程序人员编写完程序代码,可以使用ANSI C编译器来编译并在任何平台上运行。而且,APR可以随时使用本机的OS调用。因此,当Apache在 Microsoft® Windows®  OS上运行,它就像本机的Windows程序,而在 UNIX®  OS上,它就像UNIX程序。由于使用本机调用不涉及仿真或OS子系统转换,程序代码可以更快地运行,从而提高性能,增强可移动性。

多重处理模块 在Apache处理多个请求时MPM控制如何运行,并负责打开接口(Socket),然后把这些请求映射到线程和流程。Apache 2.0中的APR和MPM使HTTP服务器能够在非UNIX平台上更迅速、更可靠的运行,同时使UNIX用户能够选择适用于操作系统和满足需求的preforked或线程MPM。 Apache 2.0中的新MPM不使用在非UNIX操作系统中构建的 POSIX®  (便携式操作系统接口) 子系统。


模块更改
Apache服务器在提供灵活的方式以向核心系统添加新特性方面拥有很高的声誉。Apache 2.0秉承了这一传统,现在几乎整个都是基于模块。核心系统提供基本的功能,但几乎服务器的所有其它组件实际上都是可承载的模块。已经完全重写了多个Apache模块并添加了一些新模块。通过模块的使用,Apache核心增强了大量特性。

了解流程、线程和混合服务器

在了解如何优化Apache 2.0之前,管理员必须了解MPM及他们与流程和线程的关系。Apache 1.3是一种基于流程的服务器: 它启动一个父流程,该父流程创建(fork)与自身一样的副本,称为子流程(见图1 )。 每个子流程可以服务一个请求,与其它子流程无关。这种方法提供可扩展性:如果子流程之一未正确运行(misbehave),可以立即终止且不影响服务器的其它子流程。但是,这种增加的可扩展性会导致性能下降:每个子流程要占用额外的内存,并且OS要花费额外的时间来进行上下文切换-也就是为每个子流程分配处理器时间。此外,流程也是相互隔离,使得流程通信和数据共享变得繁琐。

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window';}" border=0>

图1.流程、线程和混合服务器模式

线程服务器与基于流程的服务器类似,只有一种区别:线程可以与其它线程共享内存和数据(见图1 )。由于线程是同一流程的一部分,无需进行上下文切换,从而可以提高性能。但是, 未正确运行的线程会覆盖和破坏属于其它线程的数据和程序代码,导致整台服务器不能正常运行。

Apache 2.0是一种混合服务器,这样做的原因是基于线程和流程的服务器都有自己的优势和不足。当配置为混合服务器时,Apache 2.0可以创建不同的流程,每个流程都包含多个线程(见图1 )。

配置过程中选择MPM

Apache 2.0配置流程中最重要的决策是决定运行哪种MPM。当从源代码进行编译时,管理员必须在配置过程中选择MPM并把它编译到服务器中(对于二进制文件来说,如 RPMTM  [Red Hat®  Program Manager] 文件,软件分销商将预先选定并编译了MPM)。由于UNIX上的某些MPM使用线程,而某些MPM不使用线程,如果管理员在配置期间选择了MPM并把它编译到Apache中,Apache将能更好地运行。管理员通过在运行configure脚本程序时包括自变量-with-mpm=NAME 来规定把MPM编译到服务器中,其中NAME是希望的MPM的名称。在编译服务器之后,管理员可以通过发布指令httpd -l来列出所有编译的模块,包括MPM。对于UNIX平台来说,与Apache 2.0一同提供的三个主要MPM为prefork、worker和perchild。


prefork MPM
管理员应选择prefork MPM来实施基于流程的Web服务器。虽然基于流程的服务器有一些速度较慢的性能,它们通过模块来提供稳定性和兼容性,这些模块不支持线程。为了改进性能,服务器的父流程fork多个子流程并使它们能够用于应答请求。当接收到请求时,服务器把其分配给子流程。如果没有子流程可用,服务器创建新的子流程并把它添加到库中。但是,子流程的创建会导致延迟。当配置这一MPM时,管理员可以限制启动时可以创建的子流程数、最大的子流程数等。这一MPM有利于形成一个稳定的Apache服务器,但同时会影响性能和占用内存,因为单个流程的大小会占很大一部分。

The worker MPM 为了实施混合服务器,管理员可以选择worker MPM,它提供比prefork MPM更卓越的可靠性、故障恢复能力和可扩展性。启动时父流程创建规定数量的子流程,反过来每个子流程包含多个线程。每个子流程中只有一个线程聆听网络,它简化了程序代码,减少了流程之间的协作,从而提高性能。虽然这一MPM稳定且性能优于prefork,由于它是基于线程,与其一同使用的所有模块都必须是完全的线程-安全。大多数Apache 1.3模块不是线程安全,并且由于worker MPM不向后兼容,因此,使用这一MPM的管理员也不能一同使用Apache 1.3模块和Apache 2.0。但是使用prefork MPM来编译服务器允许管理员使用Apache 1.3模块。


The perchild MPM
如果遇到这样一种情况,考虑到安全性和性能,需要Apache流程基于不同的用户ID来运行,管理员可以使用perchild MPM 来编译混合服务器。互联网服务供应商(ISP)通常使用这一MPM来实现虚拟托管。当perchild启动时,它创建规定数量的流程,每个流程有规定数量的线程和专用的用户ID。如果服务器上的负载增加,它使用现有流程之一来创建新线程,而不是创建新流程。这种MPM是最可扩展,但也最不可靠。

调整Apache 2.0和服务器硬件以实现卓越性能

Apache管理员必须同时考虑Web服务器的性能和可扩展性。由于服务器访问者增加,并且如果未事先采取适当的措施来支持更多的工作负载,随着服务器上负载的增加,服务器的性能会下降。

虽然大多数Linux分销包括Apache的二进制安装程序,考虑到性能和安全性,Apache应使用Configure脚本程序从源代码进行编译。在这种方式下,管理员可以只包括需要的选项并度身定制Apache来满足他们特殊的环境,因为不需要的特性会降低性能。MPM应被编译到服务器中以获得最佳性能。如果可能的话,线程应用于提高性能。

为了进一步缩短Apache的应答时间,管理员可以增加限制流程和线程数量的OS设置。在Linux 2.2.x内核中,这一流程需要增加NR_TASKS的值, 它规定OS同时支持的流程的最大数,并重新编译内核。在2.4.x内核中,应增加/proc/sys/kernel/threads-max的值,它定义线程的最大数。建议使用2.4.x内核,因为这一内核系列支持发送文件系统呼叫;这些呼叫取消了单独的读取和发送机制,从而提高性能。


硬件考虑因素
基本硬件严重影响Web服务器的性能。Web服务器将不需要切换,因为切换会增加每次请求的等待时间。当在 DellTM PowerEdgeTM  服务器上运行Apache时,管理员应确保服务器有足够的RAM。他们还应获得快速的CPU、磁盘和网卡。


设置指示(directive)
当配置Apache时,管理员应设置MaxClients 指示为一合理的高数值,它规定服务器流程(同时连接客户机)的最大值;在服务器开始切换时这一操作阻止服务器创建如此多的子流程。HostnameLookups指示应设为关闭,因为域名服务器(DNS)查找每次请求的延长等待时间。如果在服务器日志文件中需要DNS信息来生成报告,管理员可以使用日志分析(logresolve) 指令来后处理(postprocess)日志文件。最理想的状况是后处理在别处执行,而不是在生产Web机器。

如果使用mod_include和server-side includes (SSI),管理员应对Apache进行配置,从而它不分析所有的HTML文件,这需要额外的处理时间。实际上,服务器应只分析具有特定文件扩展名的文件(SSI将被替换的文件,使用最常用的文件扩展名以外的扩展名),如.shtml。

管理员可以在所有目录上设置AllowOverride None,从而Apache不检测基于目录的配置文件,这些文件通常命名为.htaccess。提高性能的另一种方式是禁用mod_status模块,确保ExtendedStatus设为关闭。这些设置收集服务器、连接和请求的统计数据,它会降低Apache的性能。

应避免用于根据浏览器功能和语言喜好自动向客户机提供内容的内容协商,以实现高性能。但是,如果需要内容协商,管理员应使用type-map文件,它提供比使用MultiViews选项更卓越的性能。

为了阻止频繁存取的文件的磁盘存取,管理员可以使用mod_file_cache模块把这些文件映射到存储器。要映射的文件列表规定作为全局MmapFile指示的自变量。另一个指求CacheFile读取一些文件并把文件缓冲到文件描述符中,从而可以缩短时间,节约资源。


负载测试
在为Apache服务器配置编译优化和运行优化之后,管理员应对Web网站进行负载测试。Apache应用版本中包括称为ApacheBench (ab)的负载测试工具。例如,下面指令将使用50台同时使用的客户机,在任何指定时间段内请求 http://www.companyxyz.com 主页5,000次:

/usr/local/apache2/bin/ab -n 5000 -c 50 / http://www.companyxyz.com/

完成测试需要一些时间,但结果容易理解并可用于微调性能。管理员还可以使用高负载测试(Flood load-testing)实用程序,它由Apache Software Foundation提供。


负载平衡
提高Web网站性能的另一种方式是使用硬件负载平衡器,如Dell PowerEdge Load Balancing Server-BIG-IP®  Powered, 在多台服务器之间分摊负载。这种设备在多台服务器中分摊网络和HTTP业务,使Web网站看起来就像是由一台服务器提供服务。

管理员还可以使用软件负载平衡器,如Apache服务器自己。另一种选项是提供一台或多台单独的版本服务器,为大型版本文件和其它静态内容提供服务。基于内核的HTTP加速器,如TUX,可以配置有Apache来进一步加速为静态页面提供服务。


代理支持
转发代理,或代理接收一台或多台内部客户机的Web网站请求,联系远程Web服务器并返回应答。逆向代理可以用于对Web网站进行负载平衡。逆向代理部署在其它服务器的前面,为后台Web服务器提供统一的前台。例如,如果客户机请求 http://www.companyxyz.com ,请求发送到逆向代理服务器来应答这一URL。逆向代理服务器然后联系一台后台服务器来服务客户机的请求。客户机只与逆向代理服务器通信。Apache的代理支持已经完全重写,以遵循最新的HTTP标准。为了实现代理支持,管理员在编译期间把-with-proxy自变量传送到配置脚本程序。proxy_module应在Apache配置文件中列出:

LoadModule proxy_module modules/mod_proxy.so

两个指示可以与这一模块一同使用:ProxyPass和ProxyPassReverse。如图2 中所示, Dell PowerEdge2650服务器可以配置作为逆向代理,并把所有动态内容和安全套接层(SSL)业务重新传送到Dell PowerEdge 6650后台服务器,同时允许PowerEdge 2650为所有静态页面和版本提供服务。此外,管理员可以在Apache中激活缓冲支持,从而可以把一些内容缓冲到PowerEdge 2650。为了实现这一目标,Apache应使用具有-enable-cache、 -enable-disk-cache和-enable-mem-cache自变量的Configure脚本程序,然后装载和配置适当的模块来构建。提供内容的最快方式是使用缓冲而不是重复提供静态页面。

screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window';}" border=0>

图2.配置作为逆向代理的Dell PowerEdge 2650服务器

未来性能增强

Apache 2.0 Web服务器是功能强大和广泛流行的HTTP服务器,有大量的配置选项和丰富的应用。通过优化Apache 2.0构建和配置设置,管理员可以更有效地使用Apache在其上运行的硬件。试验各种配置选项,使用为Apache提供的大量文档有助于进一步提高性能。

Simon Jandreski ( simon_jandreski@dell.com ) 是Dell在拉丁美洲企业专家中心的网络工程师兼顾问。他的兴趣包括UNIX和Linux安装和管理,以及性能调整。此外,还包括Apache的排障、优化和管理。Simon获得了计算机科学学位,并获得了RHCE、SCSA、SCNA、MCSE、MCSE+I、MCSA、CCNA和A+证书。

apache2.conf部分:
# prefork MPM
# StartServers ......... number of server processes to start
# MinSpareServers ...... minimum number of server processes which are kept spare
# MaxSpareServers ...... maximum number of server processes which are kept spare
# MaxClients ........... maximum number of server processes allowed to start
# MaxRequestsPerChild .. maximum number of requests a server process serves
<IfModule prefork.c>
StartServers         10
MinSpareServers      10
MaxSpareServers     15
ServerLimit         5000
MaxClients          2800
MaxRequestsPerChild  1000
</IfModule>
# perchild MPM
# NumServers ........... constant number of server processes
# StartThreads ......... initial  number of worker threads in each server process
# MinSpareThreads ...... minimum  number of worker threads which are kept spare
# MaxSpareThreads ...... maximum  number of worker threads which are kept spare
# MaxThreadsPerChild ... maximum  number of worker threads in each server process
# MaxRequestsPerChild .. maximum  number of connections per server process (then it dies)
<IfModule perchild.c>
NumServers           5
StartThreads         5
MinSpareThreads      5
MaxSpareThreads     10
MaxThreadsPerChild  20
MaxRequestsPerChild  0
AcceptMutex fcntl
</IfModule>

User  apache
Group  apache

# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
LogFormat "%h %l %u %t /"%r/" %>s %b /"%{Referer}i/" /"%{User-Agent}i/"" combined
LogFormat "%h %l %u %t /"%r/" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent


# Global error log.
ErrorLog /var/log/apache2/error.log

# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

# Include all the user configurations:
Include /etc/apache2/httpd.conf

# Include ports listing
Include /etc/apache2/ports.conf

# Include generic snippets of statements
Include /etc/apache2/conf.d/[^.#]*

#Let's have some Icons, shall we?
Alias /icons/ "/usr/share/apache2/icons/"
<Directory "/usr/share/apache2/icons">
    Options MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/[^.#]*
ServerSignature Off
ServerTokens Prod
<Directory /var/www/[^.#]*>
    Options   none
        AllowOverride   none
  </Directory>
虚拟配置
/etc/apache2/sites-available
主文件:default--内容:
NameVirtualHost 10.12.111.6
<VirtualHost *>
        ServerAdmin admin@admin.com
        DocumentRoot "/var/www/"
        <Directory />
                Options FollowSymLinks -Indexes
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options FollowSymLinks MultiViews -Indexes
                AllowOverride None
                Order allow,deny
                allow from all
                # Uncomment this directive is you want to see apache2's
                # default start page (in /apache2-default) when you go to /
                #RedirectMatch ^/$ /apache2-default/
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
        ServerSignature On

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>
<VirtualHost 10.12.111.6>
ServerName www.xixihe.com
ServerAdmin admin@admin.com
DocumentRoot "/var/www/"
</VirtualHost>

网站名做文件名内容:
<VirtualHost 10.12.111.6>
ServerName www.xixihe.com
ServerAdmin admin@admin.com
DocumentRoot "/var/www/ 站目录/"
</VirtualHost>

<VirtualHost 10.12.111.66>
ServerName bbs.xixihe.com
ServerAdmin admin@admin.com
DocumentRoot "/var/www/ 站目录/bbs/"
</VirtualHost>

<VirtualHost 10.12.111.6>
ServerName images.xixihe.com
DocumentRoot "/var/www/ 站目录/images/"
</VirtualHost>
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值