Apache服务器访问过慢分析及解决

上传人:ji****72 文档编号:37534778 上传时间:2018-04-18 格式:DOC 页数:57 大小:1.22MB
返回 下载 相关 举报
Apache服务器访问过慢分析及解决_第1页
第1页 / 共57页
Apache服务器访问过慢分析及解决_第2页
第2页 / 共57页
Apache服务器访问过慢分析及解决_第3页
第3页 / 共57页
Apache服务器访问过慢分析及解决_第4页
第4页 / 共57页
Apache服务器访问过慢分析及解决_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《Apache服务器访问过慢分析及解决》由会员分享,可在线阅读,更多相关《Apache服务器访问过慢分析及解决(57页珍藏版)》请在金锄头文库上搜索。

1、Apache 服务器访问过慢分析及解决起因:线上的一台服务器,最近总是出现 访问 很慢的情况发生,点击一个链接要 2 秒钟以上才能打开,按照我们对于访问人数的估计,服务器应该不至于响应这么慢,从而需要针对这个问题进行分析,来解决网站访问过慢。分析:1、首先,在页面访问变慢情况发生时,使用 top 命令查看了服务器的负载情况,发现负载并不高,初步估计不是程序的问题。 2、然后,查看了线程中的 httpd 的数量, ps -aux | grep httpd | wc -l 发现,线程数已经达到了 apache 设置的最大值。由此断定是网站访问人数过多造成了访问过慢。 3、为了验证,查看了连接数和当

2、前的连接数,分别是 netstat -ant | grep $ip:80 | wc -l netstat -ant | grep $ip:80 | grep EST | wc -l 发现果然,连接数特别多,远远超过我们的估计值。 4、刚开始的时候,对于服务器的 MPM 配置方式不是特别的熟悉,认为修改服务器配置可以解决问题。主要的配置部分包括 prefork 模式 或者 work 模式的配置,下面是一些简单的介绍。prefork 模式: 以 prefork 模式工作的 apache 的默认配置: ServerLimit 2000 StartServers 5 #指定服务器启动时建立的子进程数量

3、 MinSpareServers 5 #指定空闲子进程的最小数量 MaxSpareServers 10 #指定空闲子进程的最大数量 MaxClients 150 #指定同一时间客户端最大接入请求的数量(单个进程并发线程数),任何超过该限制的请求都将进入等候队列,一旦一个连接被释放,队列中的请求将得到服务 MaxRequestsPerChild 0 #指定每个子进程在其生存周期内允许伺服的最大请求数量,默认为 10000,0 表示子进程永远不结束 prefork 控制进程在最初建立“StartServers”个子进程后,为了满足 MinSpareServers 设置的需要创建一个进程,等待一秒钟

4、,继续创建两个,再等待一秒钟,继续创建四个如此按指数级增加创建的进程数,最多达到每秒 32 个,直到满足 MinSpareServers 设置的值为止。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。 MaxSpareServers 设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache 会自动 kill 掉一些多余进程。这个值不要设得过大,但如果设的值比 MinSpareServers 小,Apache 会自动把其调整为 MinSpareServers+1。如果站点负载较大,可考虑同时加大 MinSpareServers 和 MaxSpareServers。

5、 MaxClients 是这些指令中最为重要的一个,设定的是 Apache 可以同时处理的请求,是对 Apache性能影响最大的参数。其缺省值 150 是远远不够的,如果请求总数已达到这个值(可通过 ps -ef|grep httpd|wc -l 来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而 HTTP 访问却很慢的主要原因。虽然理论上这个值越大,可以处理的请求就越多,但 Apache 默认的限制不能大于 256。在 apache2 中通过 ServerLimit 指令无须重编译 Apache 就可以加大MaxClients。 虽然通过设置 ServerL

6、imit,我们可以把 MaxClients 加得很大,但是往往会适得其反,系统耗光所有内存。以一台服务器为例:内存 2G,每个 apache 进程消耗大约 0.5%(可通过 ps aux 来确认)的内存,也就是 10M,这样,理论上这台服务器最多跑 200 个 apache 进程就会耗光系统所有内存,所以,设置MaxClients 要慎重。 worker 模式: 以 worker 模式工作的 apache 的默认配置为: StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25

7、MaxRequestsPerChild 0 Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的 ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程, MinSpareThreads 和 MaxSpareThreads 设置了最少和最多的空闲线程数;而 MaxClients 设置了同时连入的 clients 最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。 MinSpareThreads 和 MaxSpareThreads 的最大缺省值分别是 75 和 250。这两个参数对 Apa

8、che的性能影响并不大,可以按照实际情况相应调节。ThreadsPerChild 是 worker MPM 中与性能相关最密切的指令。 ThreadsPerChild 的最大缺省值是 64,如果负载较大,64 也是不够的。这时要显式使用 ThreadLimit 指令,它的最大缺省值是 20000。 Worker 模式下所能同时处理的请求总数是由子进程总数乘以 ThreadsPerChild 值决定的,应该大于等于 MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是 16,加大时也需要显式声明 ServerLimit(最大值是 2000

9、0)。需要注意的是,如果显式声明了 ServerLimit,那么它乘以 ThreadsPerChild 的值必须大于等于 MaxClients,而且MaxClients 必须是 ThreadsPerChild 的整数倍,否则 Apache 将会自动调节到一个相应值。服务器的 apache 采用的是 prefork 的工作模式,对 MaxClients 进行了相应的调整,发现服务启动后很短时间,连接数就能够达到最大。 5、后来想到需要查看用户都是访问的那些页面,将配置中的 access_log 打开,发现 85%以上的访问都是直接访问的资源文件,由此判定,用户可能使用了多线程的下载工具,或者这些

10、资源遭受了盗链。 6、找到了问题所在,进行解决也就比较好办了。想到了两个方法: A、对单个 IP 进行连接的线程限制,不允许多线程连接资源。 对于 IP 限制,我采用了 mod_limitipconn 这个模块。这个模块的好处是比较简单,缺点是不能够针对单独的文件夹或者文件进行设置,而且不支持虚拟主机。 在 apache 中安装了这个模块后,在配置文件中添加如下几段就可以生效了: ExtendedStatus On # 所有虚拟主机的/目录 MaxConnPerIP 3 # 每 IP 只允许 3 个并发连接 NoIPLimit image/* # 对图片不做 IP 限制 # 所有主机的/mp3

11、 目录 MaxConnPerIP 1 # 每 IP 只允许一个连接请求 OnlyIPLimit audio/mpeg video # 该限制只对视频和音频格式的文件 B、添加 URL 重写,防止盗链。 防止盗链,一个重要的方法就是判断请求的 refer,但是如果使用一些浏览器发出请求的时候将 refer 去掉,或者伪装,这个办法就无能为力了。但是貌似还有更高级的方法,还是可以实现这个功能。 安装 apache 的 mod_rewrite 模块后,在 apache 配置文件中添加 RewriteEngine On RewriteCond %HTTP_REFERER !http:/ NC Rewr

12、iteCond %HTTP_REFERER !http:/$ NC RewriteCond %HTTP_REFERER !http:/ NC RewriteCond %HTTP_REFERER !http:/$ NC RewriteRule .*.(gif|jpg|swf)$ http:/ R,NC 这样盗链的请求会被重定向到一个错误页面,从而减少下载带给服务器的压力。参考资料: 1、部署 Apache 的一些技巧。 2、Apache Server 负载能力测试 3、Apache AB 4、Apache 的参数设置 5、Ab 的用法 6、Apache 限制连接数和并发数 7、Apache 安装

13、 mod_rewrite 模块 8、Apache 防盗链的简单实现 Windows 系统下如果优化 Apache 的性能主要是通过专门针对 Windows NT 优化的 MPM(多 路处理模块)mpm_winnt.c 来优化的,它使用一个单独的父进程产生一个单独的子进程, 在这个子进程中轮流产生多个线程来处理请求。也就是说 mpm_winnt 只能启动父子两个进 程, 不能像 Linux 下那样同时启动多个进程。 mpm_winnt 主要通过 ThreadsPerChild 和 MaxRequestsPerChild 两个参数来优化 Apache。 ThreadsPerChild 这个参数用于

14、设置每个进 程的线程数, 子进程在启动时建立这些线程后就不再建立新的线程了. 一方面因为 mpm_winnt 不能启动多个进程, 所以这个数值要足够大,以便可以处理可能的请求高峰; 另一方面该参数以服务器的响应速度为准的, 数目太大的反而会变慢。因此需要综合均衡 一个合理的数值。mpm_winnt 上的默认值是 64, 最大值是 1920. 这里建议设置为 100-500 之间,服务器性能高的话值大一些,反之值小一些。 MaxRequestsPerChild 该参数表示每 个子进程能够处理的最大请求数, 即同时间内子进程数目.设置为零表示不限制, mpm_winnt 上的默认值就是 0. 官方

15、参考手册中不建议设置为 0, 主要基于两点考虑: (1) 可以防止(偶然 的)内存泄漏无限进行,从而耗尽内存; (2) 给进程一个有限寿命,从而有助于当服务器负载 减轻的时候减少活动进程的数量。 因此这个参数的值更大程度上取决于服务器的内存,如 果内存比较大的话可以设置为 0 或很大的数字,否则设置一个小的数值。需要说明的是, 如果这个值设置的太小的话会造成 Apache 频繁重启,在日志文件中会看到如下的文字: Process exiting because it reached MaxRequestsPerChild. Signaling the parent,这样一来降低 了 Apache 的总体性能。 另外,可以通过查看 Apache 提供的 server-status(状态报告)来验 证当前所设置数值是否合理,在 httpd.conf 文件中做如下设置来打开它: # 首先需要加载mod_status 模块 LoadModule status_

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号