- 浏览: 2511443 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (676)
- linux运维 (157)
- php (65)
- mysql (78)
- nginx (27)
- apche (18)
- framework (6)
- windows (9)
- IDE工具 (23)
- struts2 (7)
- java (13)
- 移动互联网 (14)
- memcache redis (23)
- shell基础/命令/语法 (37)
- shell (50)
- puppet (4)
- C (11)
- python (9)
- 产品经理 (27)
- Sphinx (4)
- svn (12)
- 设计构建 (12)
- 项目管理 (44)
- SEO (1)
- 网站架构 (26)
- 审时度势 (42)
- 网络 (14)
- 激发事业[书&视频] (81)
- 其它 (12)
- 摄影 (8)
- android (21)
最新评论
-
zhongmin2012:
原文的书在哪里
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
renzhengzhi:
你好,请问个问题,从master同步数据到slave的时候,s ...
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
ibc789:
你好,看了你的文章,我想请教个问题, 我在用 redis的时候 ...
redis 的两种持久化方式及原理 -
iijjll:
写得非常好
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
iijjll:
写得非常好
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
起因:线上的一台服务器,最近总是出现 访问 很慢的情况发生,点击一个链接要2秒钟以上才能打开,按照我们对于访问人数的估计,服务器应该不至于响应这么慢,从而需要针对这个问题进行分析,来解决网站访问过慢。
分析:
1、首先,在页面访问变慢情况发生时,使用 top 命令查看了服务器的负载情况,发现负载并不高,初步估计不是程序的问题。
2、然后,查看了线程中的 httpd 的数量,
ps -aux | grep httpd
ps -aux | grep httpd | wc -l
发现,线程数已经达到了 apache 设置的最大值。由此断定是网站访问人数过多造成了访问过慢。
3、为了验证,查看了连接数和当前的连接数,分别是
netstat -ant | grep $ip:80 | wc -l
netstat -ant | grep $ip:80 | grep EST | wc -l
发现果然,连接数特别多,远远超过我们的估计值。
4、刚开始的时候,对于服务器的 MPM 配置方式不是特别的熟悉,认为修改服务器配置可以解决问题。主要的配置部分包括 prefork 模式 或者 work 模式的配置,下面是一些简单的介绍。
prefork 模式:
以 prefork 模式工作的 apache 的默认配置:
<IfModule mpm_prefork_module>
ServerLimit 2000
StartServers 5 #指定服务器启动时建立的子进程数量
MinSpareServers 5 #指定空闲子进程的最小数量
MaxSpareServers 10 #指定空闲子进程的最大数量
MaxClients 150 #指定同一时间客户端最大接入请求的数量(单个进程并发线程数),任何超过该限制的请求都将进入等候队列,一旦一个连接被释放,队列中的请求将得到服务
MaxRequestsPerChild 0 #指定每个子进程在其生存周期内允许伺服的最大请求数量,默认为10000,0表示子进程永远不结束
</IfModule>
prefork 控制进程在最初建立“StartServers”个子进程后,为了满足 MinSpareServers
设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足
MinSpareServers设置的值为止。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。
MaxSpareServers
设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但如果设的值比
MinSpareServers小,Apache会自动把其调整为
MinSpareServers+1。如果站点负载较大,可考虑同时加大MinSpareServers和MaxSpareServers。
MaxClients是这些指令中最为重要的一个,设定的是
Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值150是远远不够的,如果请求总数已达到这个值(可通过ps
-ef|grep httpd|wc
-l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。虽然理论上这个值越大,可以
处理的请求就越多,但Apache默认的限制不能大于256。在 apache2
中通过ServerLimit指令无须重编译Apache就可以加大MaxClients。
虽然通过设置ServerLimit,我们可以把MaxClients加得很大,但是往往会适得其反,系统耗光所有内存。以一台服务器为例:内存2G,每
个apache进程消耗大约0.5%(可通过ps
aux来确认)的内存,也就是10M,这样,理论上这台服务器最多跑200个apache进程就会耗光系统所有内存,所以,设置MaxClients要慎
重。
worker 模式:
以 worker 模式工作的 apache 的默认配置为:
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
Worker 由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,
MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients 设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。
MinSpareThreads和 MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。
ThreadsPerChild是worker MPM中与性能相关最密切的指令。
ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。
Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild
值决定的,应该大于等于MaxClients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时
也需要显式声明ServerLimit(最大值是20000)。需要注意的是,如果显式声明了ServerLimit,那么它乘以
ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则
Apache将会自动调节到一个相应值。
服务器的apache采用的是 prefork 的工作模式,对 MaxClients 进行了相应的调整,发现服务启动后很短时间,连接数就能够达到最大。
5、后来想到需要查看用户都是访问的那些页面,将配置中的
access
_log 打开,发现
85%以上的访问都是直接访问的资源文件,由此判定,用户可能使用了多线程的下载工具,或者这些资源遭受了盗链。
6、找到了问题所在,进行解决也就比较好办了。想到了两个方法:
A、对单个IP进行连接的线程限制,不允许多线程连接资源。
对于IP限制,我采用了 mod_limitipconn 这个模块。这个模块的好处是比较简单,缺点是不能够针对单独的文件夹或者文件进行设置,而且不支持虚拟主机。
在 apache 中安装了这个模块后,在配置文件中添加如下几段就可以生效了:
ExtendedStatus On
< IfModule mod_limitipconn.c >
< Location / > # 所有虚拟主机的/目录
MaxConnPerIP 3 # 每IP只允许3个并发连接
NoIPLimit image/* # 对图片不做IP限制
< /Location >
< Location /mp3 > # 所有主机的/mp3目录
MaxConnPerIP 1 # 每IP只允许一个连接请求
OnlyIPLimit audio/mpeg video # 该限制只对视频和音频格式的文件
< /Location >
< /IfModule >
B、添加URL重写,防止盗链。
防止盗链,一个重要的方法就是判断请求的 refer,但是如果使用一些浏览器发出请求的时候将 refer 去掉,或者伪装,这个办法就无能为力了。但是貌似还有更高级的方法,还是可以实现这个功能。
安装apache的 mod_rewrite 模块后,在apache配置文件中添加
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^
http://abc.com/.*
$ [NC]
RewriteCond %{HTTP_REFERER} !^
http://abc.com
$ [NC]
RewriteCond %{HTTP_REFERER} !^
http://www.abc.com/.*
$ [NC]
RewriteCond %{HTTP_REFERER} !^
http://www.abc.com
$ [NC]
RewriteRule .*\.(gif|jpg|swf)$
http://www.abc.com/about/nolink.png
[R,NC]
这样盗链的请求会被重定向到一个错误页面,从而减少下载带给服务器的压力。
发表评论
-
伪静态
2011-11-29 17:34 1394--------------------Apache ... -
关于Apache (httpd)服务器防DDOS模块mod_evasive的使用说明
2011-03-21 22:34 4058http://www.docin.com/p-83334545 ... -
[shell]Nginx/Apache日志分析脚本
2011-03-21 12:47 8448http://junlee.blog.51cto.com/22 ... -
http.conf优化,安全配置
2010-10-31 17:19 2752---------------------- apache日 ... -
【汇总】apache
2010-10-31 17:17 1208----------------apache SetEnv ... -
如何让apache支持.shtml 让apache支持include标签
2009-10-11 15:23 3614打开conf目录下的httpd.conf文件,搜索“AddTy ... -
[CentOS]apache+mod_ssl中证书生成方法
2009-10-07 10:58 3831--------------------------- ... -
启用Apache2 的mod_deflate(gzip)來压缩网页提高传输效能
2009-08-22 21:25 2634Apache2之后的版本,模块名不叫gzip,而叫mod_de ... -
apache的缓存mod_cache设置----待更新
2009-08-16 14:38 3807Apache模块 mod_cache 手册:http://la ... -
apache的prefork和workder模式
2009-08-16 14:12 6934如何知道当前apache的应用模式 ht ... -
Apache中的mod_proxy模块应用
2009-08-16 13:39 9747Apache模块 mod_proxy手册:http://lam ... -
ubuntu apache2配置详解
2009-08-16 12:48 5923ubuntu apache2配置 1.apache2.con ... -
查看Apache的请求数和开启Apache Server Status
2009-08-16 11:58 6017在Linux下查看Apache的负 ... -
【维护】apache 配置和日志+shell
2009-08-13 09:49 1673apache安装目录 在phpinfo ... -
【汇总】Apache压测命令ab
2009-06-30 21:14 3981ab的全称是ApacheBench,是Apache附带的一 ... -
虚拟主机配置教程,包括apache mod_vhost_alias模块
2009-06-29 22:52 5285----------- /htdocs/test ... -
伪静态页面生成教程mod_rewrite
2009-06-23 09:48 2953从phpchina.com转载过来的,教程写的不错,容易理解 ...
相关推荐
课程设计污水处理
PHP基于Web的subversion用户管理系统(源代码+设计说明书).zip
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
The Experiment 3 of Engineering Electromagnetics.pdf
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
JSP网络购物中心毕业设计(源代码+设计说明书).zip
卷积神经网络 卷积神经网络_基于VGGNet实现的遥感图像分类算法
node-v0.12.10.tar
转型计划gl.ppt
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
led.zip
ASP+ACCESS实验室设备管理系统(源代码+设计说明书).zip
jsp网上超市设计与实现(源代码+设计说明书).zip
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
商业分析工具:常用战略分析工具gl.ppt
行业分析模板--初学者必备gl.ppt
dephi+sqlserver2000题库与试卷生成系统.zip
基于matlab实现阵列信号处理MVDR程序,高分辨方位估计从事人员可供参考。.rar
一种全新的基于python 用于疲劳强度迟滞回线的脚本分析.rar
基于matlab实现的对数据进行傅立叶分析,从时域转换到频域,观察信号的频谱结构,从分析信号的特点.rar