`
zhengdl126
  • 浏览: 2511443 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

Apache查看连接数和限制当前的连接数

阅读更多

起因:线上的一台服务器,最近总是出现 访问 很慢的情况发生,点击一个链接要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]
        这样盗链的请求会被重定向到一个错误页面,从而减少下载带给服务器的压力。

分享到:
评论

相关推荐

    钢筋混凝土污水池及提升泵站施工方案.doc

    课程设计污水处理

    PHP基于Web的subversion用户管理系统(源代码+设计说明书).zip

    PHP基于Web的subversion用户管理系统(源代码+设计说明书).zip

    node-v12.22.10-linux-armv7l.tar.xz

    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

    The Experiment 3 of Engineering Electromagnetics.pdf

    node-v12.11.0-darwin-x64.tar.xz

    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

    JSP网络购物中心毕业设计(源代码+设计说明书).zip

    卷积神经网络-基于VGGNet实现的遥感图像分类算法.zip

    卷积神经网络 卷积神经网络_基于VGGNet实现的遥感图像分类算法

    node-v0.12.10.tar.xz

    node-v0.12.10.tar

    转型计划gl.ppt

    转型计划gl.ppt

    node-v10.24.1-linux-ppc64le.tar.xz

    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

    led.zip

    ASP+ACCESS实验室设备管理系统(源代码+设计说明书).zip

    ASP+ACCESS实验室设备管理系统(源代码+设计说明书).zip

    jsp网上超市设计与实现(源代码+设计说明书).zip

    jsp网上超市设计与实现(源代码+设计说明书).zip

    node-v11.12.0-linux-ppc64le.tar.xz

    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

    行业分析模板--初学者必备gl.ppt

    行业分析模板--初学者必备gl.ppt

    dephi+sqlserver2000题库与试卷生成系统.zip

    dephi+sqlserver2000题库与试卷生成系统.zip

    基于matlab实现阵列信号处理MVDR程序,高分辨方位估计从事人员可供参考 .rar

    基于matlab实现阵列信号处理MVDR程序,高分辨方位估计从事人员可供参考。.rar

    一种全新的基于python 用于疲劳强度迟滞回线的脚本分析.rar

    一种全新的基于python 用于疲劳强度迟滞回线的脚本分析.rar

    基于matlab实现的对数据进行傅立叶分析,从时域转换到频域,观察信号的频谱结构,从分析信号的特点.rar

    基于matlab实现的对数据进行傅立叶分析,从时域转换到频域,观察信号的频谱结构,从分析信号的特点.rar

Global site tag (gtag.js) - Google Analytics