Apache+PHP性能优化方案.doc_第1页
Apache+PHP性能优化方案.doc_第2页
Apache+PHP性能优化方案.doc_第3页
Apache+PHP性能优化方案.doc_第4页
Apache+PHP性能优化方案.doc_第5页
免费预览已结束,剩余11页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Apache 性 能 优 化 方 案 -针对Apache和PHP配置优化修订历史记录日期版本说明作者目 录1. 引言31.1. 编写目的31.2. 参考资料32. 任务概述32.1. 目标32.2. 运行环境32.3. 条件与限制33. 问题描述及原因分析43.1. Apache服务器进程连接数急剧增加43.2. 网络连接出现大量“TIME_WAIT”43.3. Memcache无法连接53.4. 其他54. Apache服务器性能测试64.1. Apache AB工具介绍压力测试64.2. Apache AB压力测试75. Apache与PHP优化方案95.1. Apache优化95.2. PHP优化146. 防止DDOS攻击156.1. DDoS攻击时的现象156.2. 防御DDoS攻击策略151. 引言1.1. 编写目的随着的业务发展,使用官网的会员快速增长,为确认官网能稳定并快速响应会员的各种业务请求,因此,需对官网的性能进一步优化,本文主要针对现在官网在性能在Apache和PHP方面的配置进行优化尝试。1.2. 参考资料1) Apache配置文件参数详细介绍.doc2) LAMP系统性能调优+优化Apache和PHP.doc3) Apache 2.2参考手册2. 任务概述2.1. 目标1) 提升Apache服务性能2) 提供性能综合解决方案2.2. 运行环境1) 操作系统:Linux2) Apache版本:2.23) PHP版本:5.2.84) 负载均衡:F52.3. 条件与限制3. 问题描述及原因分析3.1. Apache服务器进程连接数急剧增加1) 问题描述:Apache服务器在某一时刻出现的进程连接数很高,CPU占用率达到100%,导致官网访问临时性缓慢或瘫痪。2) 原因分析:a) 同一时间需要处理的业务骤增,如多个会员同时登入官网、查询房态、预订操作和访问论坛等。b) 操作系统处理其他非官网业务。c) 黑客攻击。如DDOS攻击或使用压力测试工具访问官网,耗尽服务器资源。3.2. 网络连接出现大量“TIME_WAIT”1) 问题描述:当Apache服务器进程连接数很高时,伴随出现大量的TIME_WAIT,占用服务器连接资源,导致官网访问临时性缓慢或瘫痪。2) 原因分析:a) Apache配置文件httpd.conf里面中的keepalive处于 off 状态,导致每次请求都要建立新的tcp连接,请求完成以后关闭,增加了很多time_wait的状态。这种问题通常发生在Apache服务器。b) 服务器使用了短连接方式,所以会造成大量处于TIME_WAIT状态的连接,根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证。这种问题通常发生在Mysql服务器,通常是由于PHP程序代码中没有使用mysql.colse(),才导致大量的mysql TIME_WAIT 。3.3. Memcache无法连接1) 问题描述:当Apache进程数很多时,偶尔会出现Memcache warning:Could not connect,导致无法访问指定的页面。2) 原因分析:a) Memcache未启动或非正常运行b) 网页客户端连接数过多,连接数接近或超过了启动memcached的时候设置的 -c 数目(默认是1024)3.4. 其他Apache服务器可能由于硬件故障、操作系统配置引发性能问题。4. Apache服务器性能测试4.1. Apache AB工具介绍压力测试Apache压力测试工具apache bench 简称ab.主要是从系统设计和开发的角度去评价系统在一定压力下的表现,就正如下面的介绍一样,看每秒系统能支持的并发请求.从而进行相关的调优操作. 下面是ab的官方介绍.ab is a tool for benchmarking your Apache Hypertext Transfer Protocol (HTTP) server. It is designed to give you an impression of how your current Apache installation performs. This especially shows you how many requests per second your Apache installation is capable of serving.支持的参数和参数的介绍如下:ab -A auth-username:password -c concurrency -C cookie-name=value -d -e csv-file -g gnuplot-file -h -H custom-header -i -k -n requests -p POST-file -P proxy-auth-username:password -q -s -S -t timelimit -T content-type -v verbosity -V -w -x -attributes -X proxy:port -y -attributes -z -attributes http:/hostname:port/pathOptions are: -n requests Number of requests to perform -c concurrency Number of multiple requests to make例如:./ab -n 1000 -c 50 16/info.phpAB将同时向16/info.php 共发出1000个请求,每次的并发请求为50个,共。测试结果将可能是这样的:Server Software: Apache/2.0.16Server Hostname: localhostServer Port: 80Document Path: /info.phpDocument Length: 1311 bytesConcurrency Level: 50Time taken for tests: 8.794 secondsComplete requests: 1000Failed requests: 0Total transferred: 1754000 bytesHTML transferred: 1311000 bytesRequests per second: 113.71Transfer rate: 199.45 kb/s receivedConnection Times (ms)min avg maxConnect: 0 0 5Processing: 111 427 550Total: 111 427 555info.php每秒钟可以处理的请求数为113.71个。将请求数增加,看看服务器能否处理更大的压力。你也需要调节Apache的 MaxClients,ThreadsPerChild,MaxThreadsPerChild等参数,基于你的httpd.conf中的MPM模块选择。4.2. Apache AB压力测试1) 针对prefork MPM不同参数进行并发量测试服务器配置测试目标AB命令测试结果说明StartServers=5MinSpareServers=5MaxSpareServers=10MaxClients=150MaxRequestsPerChild=0请求数: 1000个并发数:100/次Ab -n 1000 -c100 16请求量和并发量在较小的范围内时,性能变化不大StartServers=5MinSpareServers=16MaxSpareServers=32MaxClients=300MaxRequestsPerChild=100StartServers=5MinSpareServers=5MaxSpareServers=10MaxClients=150MaxRequestsPerChild=0请求数:3000个并发数:300/次Ab -n 3000 -c300 16当大量请求和大并发量时性能明显提高,Requests per second从66.16/秒提高到287.34/秒StartServers=5MinSpareServers=16MaxSpareServers=32MaxClients=300MaxRequestsPerChild=100说明:Time taken for tests:整个测试持续的时间Complete requests:完成的请求数量Failed requests:失败的请求数量 Requests per second:每秒请求完成处理的事务数Time per request:平均事务响应时间Transfer rate:平均每秒网络上的流量5. Apache与PHP优化方案5.1. Apache优化2) 关闭DNS和名字解析v HostnameLookups on | off | doubleApache 1.3之前HostnameLookups默认是打开的。这样客户端在访问服务器时,服务器将要解析客户端的主机名,并将其保存在日志文件中。对客户端进行域名反向解析会大幅降低服务器速度,所以最好将其设置为Off。关闭指令如下:HostnameLookups offv UseCanonicalName on | off | dns打开UseCanonicalName是Web服务器的标准做法。这是因为客户发送的大部分请求都是对本服务器的引用,打开该项设置就能使用 ServerName和Port选项的设置内容构建完整的URL。如果将这个参数设置为Off,那么Apache将使用从客户请求中获得服务器名字和端口值,重新构建URL。如果你不需要在Apache中架设虚拟主机,建议设置为:UseCanonicalName on3) 关闭多余模块Apache采用了模块化设计,管理员可以有选择地加载一些模块来加强服务器的功能。这些模块,可以在创建服务器时静态编译到服务器的二进制代码中,也可以编译成一些独立服务器程序的Dynamic Shared Objects(DSO)文件,在Apache启动的时候根据需要,动态加载。事实证明,不加载多余的模块总是可以提高Apache的性能。Apache的DSO模块是在httpd.conf中以:LoadModule access_module modules/mod_access.so方式加载。当不需要某个模块时,只要在其前添加“#”,注释掉该行。不需要加载以下模块:mod_include.so:/服务器端包含,是一种已经过时的技术。mod_autoindex.so: /如果不希望Apache列目录显示,可以删除。mod_access.so、mod_auth.so:/如果不需要进行安全验证,不须加载。最好加载以下模块:mod_dir.so:/用于定义缺省文档index.php、index.jsp等。mod_log_config.so:/用于定义记录文件格式。mod_mime.so:/定义文件类型的关联。最后需要说明一点的是,并不是加载所有的模块都会降低Apache性能。比如mod_zip可以把文件压缩之后再传给客户端,这样就可以减少 40%左右的网络流量,而mod_expires则可以减少10%左右的重复请求。4) 取消.htaccess验证除非确定需要使用.htaccess文件来控制客户端对相应目录的访问权限,否则设置“AllowOverride None”,可以免除Apache在每个目录搜索.htaccess文件所带来的性能降低。5) 取消符号链接FollowSymLinks允许使用符号连接,这将使用浏览器有可能访问文档根目录(DocumentRoot)之外的内容,并且只有符号连接的目的与符号连接本身为同一用户所拥有时(SymLinksOwnerMatch),才允许访问,这个设置将增加一些安全性,但将耗费Apache大量的资源。建议:Options FollowSymLinks但是不要启用SymLinksOwnerMatch。6) 打开KeepAlive支持在HTTP 1.0中和Apache服务器的一次连接只能发出一次HTTP请求,而KeepAlive参数支持HTTP 1.1版本的一次连接,多次传输功能,这样就可以在一次连接中发出多个HTTP请求。从而避免对于同一个客户端需要打开不同的连接。很多请求通过同一个 TCP连接来发送,可以节约网络和系统资源。在Apache的配置文件httpd.conf中,设置:KeepAlive onKeepAliveTimeout 15这样就能限制每个连接的保持时间是15秒。评测发现,打开KeepAlive之前,ab测试的数据为:Requests per second: 201.32 #/sec (mean)Time per request: 298.031 ms (mean)Time per request: 4.967 ms (mean, across all concurrent requests)Transfer rate: 839.49 Kbytes/sec received而打开KeepAlive支持之后,ab测试数据为:Requests per second: 341.70 #/sec (mean)Time per request: 175.594 ms (mean)Time per request: 2.927 ms (mean, across all concurrent requests)Transfer rate: 1437.04 Kbytes/sec received最能反应Apache服务器性能的Requests per second,即每秒完成的请求次数从201.32提升到341.70,提升幅度为70%。虽然在现实环境中,不可能有这么多的同一连接发出的请求,但启用KeepAlive确实在一定程度上可以提高Apache服务器的吞吐量和反应速度。另外,可以设置:MaxKeepAliveRequests 100把MaxKeepAliveRequests设置的尽量大,可以在一次连接中进行更多的HTTP请求。但在我们的测试中还发现,把 MaxKeepAliveRequests设置成1000,则评测的客户端容易出现“Send requesttimed out”的错误,所以具体数值还要根据自己的情形来设置。7) 多路处理(MPM)的prefork模式和worker 模式Apache 2.x 支持插入式并行处理模块,称为多路处理模块(MPM)。在编译Apache时你必须选择也只能选择一个MPM,这里有几个针对非UNIX系统的MPM:beos, mpm_netware, mpmt_os2, mpm_winnt。对类UNIX系统,有几个不同的MPM可供选择,他们都会影响到httpd的速度和可伸缩性:l Worker MPM模式:使用多个子进程,每个子进程中又有多个线程。每个线程处理一个请求。该MPM通常对高流量的服务器是一个不错的选择。因为它比preforkMPM需要更少的内存且更具有伸缩性。l PreforkMPM模式:使用多个子进程,但每个子进程并不包含多线程。每个进程只处理一个链接。在许多系统上它的速度和workerMPM一样快,但是需要更多的内存。这种无线程的设计在某些情况下优于workerMPM:它可以应用于不具备线程安全的第三方模块(比如php3/4/5),且在不支持线程调试的平台上易于调试,而且还具有比workerMPM更高的稳定性。l Prefork和Worker模式的比较prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并且对于那些线程调试困难的平台而言,它也更容易调试一些。worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起”死掉”.由于线程共享内存空间,所以一个程序在运行时必须被系统识别为”每个线程都是安全的”。总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。l PreforkMPM模式参数详解Linux下的Apache预设工作在prefork模式下(由每个进程处理连接请求),这种工作模式的调整参数包括以下5个:参数名称说明StartServers 该参数决定Linux启动时,自动打开的Apache服务器的数目。它对Apache服务器的性能没有太大的影响。因为如果 MinSpareServers设置的比较大,Apache服务器进程数会马上调整到不小于MinSpareServers的数目。在Linux下,我们可以通过:ps aux |grep httpd来查看当前打开的Apache服务进程数MinspareServers该参数用于配置在任何时候可用的最小Apache进程个数。一般情况下,当目前可用的Apache进程数不能满足需求时,Apache会自动打开新进程以服务客户。所以设置MinspareServers为较大的值只是为了让在比较繁忙的Web环境,让Apache可以尽快地满足客户端的访问需求。对于每天有百万访问量的网站来说,下面的数值是比较合适的:MinspareServers 32MaxSpareServers 较大的MinSpareServers可以保证Apache有较快的反应速度,过大的MinSpareServers又会占用更多的系统内存。如果你的系统内存不是很充足或者运行有其他的服务,把MaxSpareServers设置小一些可以为其他服务空出一些内存。当空闲Apache进程超过 MaxSpareServers指定的数值时,Apache主进程会杀掉多余的空闲进程而保持空闲进程在MaxSpareServers指定的数值。 对于每天百万访问量的网站来说,配置大容量的内容,并且设置如下的值是比较合适的: MaxSpareServers 64MaxClientsMaxClients用于规定服务器支持的最多并发访问的客户数。如果MaxClients设置得过大,系统在繁忙时不得不在过多的进程之间来回切换为更多的客户服务。这样对每个客户的反应就会变慢;如果设置得过小,系统繁忙时就会拒绝客户连接请求。我们的设想原则是,当服务器性能较高时,可以适当增加这个值的设置。如果繁忙出现拒绝访问现象,说明需要升级服务器硬件了。如果你不在意访问速度,或者认为反应速度慢也总比拒绝连接好,可以把该值设置大一些。MaxRequestsPerChild当设置KeepAlive为off时,Apache服务器是用单独的子进程为一次连接服务,这样,每次连接都需要生成、关闭子进程,这些额外的操作浪费了计算机的大量处理能力。最好的方式是一个子进程可以为多次连接请求服务。但子进程在接受访问请求时,需要不断地申请和释放内存,次数多了就会造成内存垃圾,影响系统稳定性。为了解决这个问题,可以规定每一个子进程处理的最大请求数,超过此数值,就让该子进程退出,再从原始的httpd进程中重新复制一个干净的副本,从而提高系统的稳定性。每个子进程能够处理服务请求的最大次数由MaxRequestsPerChild定义。RedHat Enterprise Linux AS 3.0 Update 2缺省的设置值为1000这个值比较适合(设置为0支持每个副本进行无限次的服务处理)。 在测试过程中发现,默认配置的Apache并不能很好地应付大负荷站点。我们需要打开KeepAlive,并加大StartServers、 MinSpareServers、MaxSpareServers和MaxClients的数值。这些参数对于Apache性能的改善有很大的影响。小知识:默认最大MaxClients只能设置到256。如果你需要设置其为更高,需要在MaxClients前面添加:ServerLimit xxx其中xxx不能少于MaxClients的数值。该设置方法适用于Apache 2.0系列。8) 调整Linux操作系统内核参数系统存在大量TIME_WAIT状态的连接,也可以通过调整内核参数解决,编辑/etc/sysctl.conf文件,加入以下内容:net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 30然后执行 /sbin/sysctl -p 让参数生效。参数说明net.ipv4.tcp_syncookies = 1表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭。net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭。net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。net.ipv4.tcp_fin_timeout修改系統默认的 TIMEOUT 时间 5.2. PHP优化 1) 调整PHP配置参数PHP 的配置是在 php.ini 中完成的。四个重要的设置控制 PHP 可使用多少系统资源,如表所列。设置描述建议值max_execution_time一个脚本可使用多少 CPU 秒30max_input_time一个脚本等待输入数据的时间有多长(秒)60memory_limit在被取消之前,一个脚本可使用多少内存(字节)32Moutput_buffering数据发送给客户机之前,有多少数据(字节)需要缓存4096表 1. php.ini 中与资源相关的设置具体数字主要取决于您的应用程序。如果要从用户处接收大文件,那么max_input_time可能必须增加,可以在 php.ini 中修改,也可以通过代码重写它。与之类似,CPU 或内存占用较多的程序也可能需要更大的设置值。目标就是缓解超标程序的影响,因此不建议全局禁用这些设置。关于max_execution_time,还有一点需要注意:它表示进程的 CPU 时间,而不是绝对时间。因此一个进行大量 I/O 和少量计算的程序的运行时间可能远远超过max_execution_time。这也是max_input_time可以大于max_execution_time的原因所在。PHP 可执行的日志记录数是可配置的。在生产环境中,禁用除最重要的日志以外的一切日志记录能够减少磁盘写操作。如果需要使用日志来排除问题,那么可以按需启用日志记录。error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR将启用足够的日志记录,使您发现问题,同时从脚本中消除大量无用的内容。2) 优化PHP代码 访问Mysql结束后,调用mysql.colse()用于关闭与Mysql服务器的连接 优化PHP的各种算法6. 防止DDOS攻击6.1. DDoS攻击时的现象 被攻击主机上有大量等待的TCP连接 网络中充斥着大量的无用的数据包,源地址为假 制造高流量无用数据,造成网络拥塞,使受害主机无法正常和外界通讯 利用受害主机提供的服务或传输协议上的缺陷,反复高速的发出特定的服务请求,使受害主机无法及时处理所有正常请求 严重时会造成系统死机6.2. 防御DDoS攻击策略1) 定期扫描要定期扫描现有的网络主节点,清查可能存在的安全漏洞,对新出现的漏洞及时进行清理。骨干节点的计算机因为具有较高的带宽,是黑客利用的最佳位置,因

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论