如何在Apache中增加并发连接

今天,我再次与您谈谈世界上最常用的Web服务之一:Web服务器 Apache2.

这个话题已经讨论了很多次,但是现在我要告诉您有关此服务要考虑的另一个功能: 同时连接的限制。 不管我们是拥有i7处理器和32 GB内存的非常基本的还是一艘太空飞船...

除非我们采取适当的措施,否则同时连接的限制将始终是相同的,这意味着,如果我们希望同时连接许多人,我们不仅需要好的硬件,而且也需要好的配置。

在这种情况下,没有必要安装任何东西,所有东西都基于简单的概念,在配置apache时必须考虑这些概念; 想要进行任何更改之前必须非常清楚的概念。

apache2_标志

首先要考虑的是:我的团队有什么能力? 如果我尽可能强加设备,可以支持多少个同时连接? 所有这些都取决于一个因素。 RAM(随机存取存储器)。

尽管没有固定值(即每个X ram有X个客户端),但RAM越大,连接的数量就越大,这就是为什么首先在Web服务器上进行一些小计算很重要的原因,为了知道我们的极限。

您应该知道的第一件事是,与Apache的每个连接平均要消耗多少RAM内存,因为建立的每个连接都假设系统中有一定的RAM消耗。显然,并非所有连接都消耗相同的ram,而媒体.. 。所有这些都可以通过以下命令获得:

ps -ylC apache2 --sort:rss | awk'{SUM + = $ 8; I + = 1} END {打印总和/ I / 1024}'

所获得的结果将以兆字节为单位,并且可能会根据活动连接的数量,访问的页面的类型等而有所不同。 如果可能的话,它们每个都显示不同的内容。 以我为例,结果是9.5458,如果我们将其向上舍入到顶部,将得到 10 MB 每个连接平均消耗的RAM。

知道系统中其余活动进程要消耗多少RAM也很重要,因为Web服务不是唯一在操作系统中运行的服务,因此必须在服务器上保留可用的RAM内存。服务器,以便它可以执行其余任务。 可以通过以下命令获得此信息:

ps -N -ylC apache2 --sort:rss | awk'{SUM + = $ 8} END {print SUM / 1024}'

所获得的结果也将以兆字节表示,它将非常准确地向我们显示其余进程消耗的RAM数量; 就我而言 800 MB。 有了这些信息,我们就可以对可以同时连接的数量进行一般性的计算。 我计算出可以通过一个非常简单的操作获得。

(RAMTOTAL-RAM_RESTOPROCESOS)/RAM_POR_CONNEXIÓN

有了这个公式,让我们想象一下,我们有一台具有4 GB RAM(即4096 MB)的计算机,并且我们的计算机已经显示了上述结果。 计算结果为:

(4096-800)/ 10 = 329个并发连接

这种计算的问题是,一个计算过于极端,因为它将消耗所有RAM(使服务器消耗交换空间),而且在拥有数据库(例如MySQL或任何其他数据库)的情况下,与该数据库的连接也将消耗RAM,使用它可以将获得的数字视为乌托邦数字。 因此,为了释放内存以用于可能的其他进程,并考虑执行与数据库的连接的可能性,我们将减少与数据库的连接数。 250.

现在我们有了最大的同时连接数,我们必须准备让Apache接收此数量,这在此调用的配置文件中完成 apache2.conf,位于 / etc / apache2.

有问题的文件采用以下结构: módulos,每个都有其对应的名称,但我们只会对其中一个名为  mpm_prefork_模块。 默认情况下,所涉及的模块具有以下数据:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

这个模块有一系列非常重要的参数,尽管其中有一个参数我们特别感兴趣,称为 MaxClients的。 此参数指定最大同时连接数,应修改为 250.

要记住的一个细节是,当在所述参数中指定了默认值以外的值时,有必要在此值之前再添加一个。 这个参数叫做 将ServerLimit 并设置服务器即使超出限制也可以“保持”的连接限制。

ServerLimit参数始终必须比MaxClients稍高,在这里,由于操作空间很小,因此限制为 270。 这将使模块如下所示:

StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 270 MaxClients 250 MaxRequestsPerChild 0

现在只需使用以下命令重新启动Apache服务: 

/etc/init.d/apache2重新启动

这样,我们就可以享受我们优化的Web服务器。

问候。


发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责数据:MiguelÁngelGatón
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。

  1.   泽塔蒂诺

    感谢您的帖子!

    1.    德拉西尔

      很高兴您发现它有用。

      问候。

  2.   米格尔·安赫尔

    有一种将Apache和两台服务器组成群集的方法,您能解释一下它是如何工作的吗?

    1.    德拉西尔

      尽管我已经读过一些有关它的理论,但我从未将其应用于实践。 即使这样,尽管我重申我还没有机会将其付诸实践,但也许本文可以在这方面为您提供一些指导:

      http://www.muspells.net/blog/2011/04/alta-disponibilidad-con-apache2-y-heartbeat-en-debian-squeeze/

    2.    爱德华多·贾里尔(Eduardo Jalil)

      如果您没有解决,您已经询问了一段时间; 我有一个与第三方充当文件系统的平衡方案,您将var / www / html /(在我的情况下)中的文件夹指向文件系统,以便它们共享相同的信息,并且可能您会需要一个虚拟ip来响应并重定向到apches的ip,为此,您可以占用haproxy,如果您希望它具有高可用性,则可以集成keepalive以防万一一个跌倒,另一个继续响应,或者如果您已经拥有应用程序的域,您可以平衡两个服务器的后端开销,对于特定情况(例如,moodle或连接到mysql中数据库的某些应用程序),您必须为每个应用程序服务器创建一个指向同一数据库的用户。

  3.   夏丸

    非常感谢您的帖子,您说的很对,ram是主要计算,尽管我想我们也可以计算处理器可以处理的最大进程数(当然,首先要进行主内存的计算)以及如何硬分配磁盘(示例分区/ var = 1TR)。

    1.    德拉西尔

      你是对的; 一切都很重要,例如温度控制等。 显然,功能强大的处理器可以高效地同时执行更多任务,但是本文的目的是解释RAM对于同时连接数的重要性。

      控制所有这些因素并查看我们的处理器是否未饱和或可用内存很少的一个好方法是使用bash脚本。 也许我几天前发表的这篇文章对您来说很有趣,我将其留在以下链接中; 这是一个全局监视,但对于以下情况可能很有趣:

      http://bytelearning.blogspot.com.es/2015/07/controlando-la-salud-del-equipo-con-bash.html

      问候

  4.   塞尔吉奥S

    很好的提示,非常感谢!

    1.    德拉西尔

      非常感谢! 希望您能够利用它。

  5.   小丑

    我不想成为一个混蛋...
    …但是,通过增加连接数量,您不会更容易受到DDoS攻击吗?

    1.    德拉西尔

      这不是一个安静的克里斯汀问题。 事实是,通过增加并发连接数,我们在一定程度上增强了Apache抵抗DDOS攻击的能力,因为您必须考虑到服务器上建立的最大并发连接数是总最大连接数,而不是来自最大连接数的连接数。一个用户。 因此,尽管一开始我们只能支持150个并发连接(无论它们是否来自合法来源),但现在我们可以依靠服务器支持的连接数,同时需要保留更多数量的连接没有服务。 显然,增加最大连接数并不是保护自己免受此类攻击的一种方法,而应该实施防火墙策略。 例如,如果您要放置的Web服务将暴露给Internet,则可以实施的安全措施是在防火墙中添加以下几行:

      iptables -A INPUT -p tcp -syn -dport 80 -m connlimit -connlimit-upto 10 -m state -state NEW -j ACCEPT

      iptables -A输入-p tcp –dport 80 -m状态–状态已建立,相关-j接受

      iptables -A输入-p tcp –dport 80 -j DROP

      1.    小丑

        DDoS攻击的特征之一是,攻击者似乎可以从几个不同的方向发送数据包,这阻止了数据包流仅来自一个方向。

    2.    德拉西尔

      从某种意义上来说,您是正确的,因为我建立的防火墙对DDOS攻击不是很有效,因为它来自不同的来源。 尽管如此,最好将这些源中的每个源的连接数限制为10个,而不是没有限制,以使每个源都可以建立一百个或更多个连接。

      无论如何,问题的解决方案是服务器支持的同时连接越多,通过DDOS攻击将其击倒的难度就越大,这将使攻击者更难以击倒该页面。 。

      问候。

  6.   埃利奥时间3000

    好。 现在,我继续在我的网站上使用NGINX,以免折磨我拥有的VPS。

  7.   布鲁诺·卡西欧(Bruno Cascio)

    好帖子@Drassill!

    我想贡献一些可能比配置更多的统计信息。
    尽管最简单,最快的方法是计算消耗参数,但也许我们可以更严格一些,使用“中位数”代替“均值”。 它将为我们带来什么? 万一连接消耗了大量内存,数字就会消失。 例如,假设以下客户端以其所需的内存单位(KB,MB,MiB等)消耗以下值:

    10、15、150、5、7、10、11、12

    平均值约为30

    这是因为我们有一个很大的端(150),并且计算很疯狂。 中位数包括对这些数据进行排序,将样本数除以2(我们的中心),然后获得该位置的数。 有了这个,我们将有类似

    5、7、10、10、11、12、15、150

    所以我们的平均值是:8/2 = 4等于〜10

    在这里,您可以看到,无论极端情况多么疯狂,它总会给我们带来更现实的价值。 如果我们添加一个消费200的客户,我们的中位数将为11,而平均值可能会变为……。

    这只是一个贡献,而且值得商bat,因为它没有拧紧连接。

    拥抱人们linuxera🙂

  8.   卡洛斯

    您好,我的专用服务器出现问题,那就是每当大约有250个人在线访问时,根据google实时分析,我的服务器就崩溃了,连接变慢,直到断开连接到网站上,并且从来没有在线上传超过该数量的用户,但是当我看到专用服务器的性能为8gb ram时,它显示了10%的使用率,cpu:5%的使用率和1.99%的硬盘使用。
    你能帮助我吗? 我找不到该怎么办,执行这些步骤是否是解决方案?

    1.    德拉西尔

      好卡洛斯。

      当服务器准备不充分时,您描述的问题非常普遍。 您的服务器可能会接受较少数量的同时连接,当达到250个连接时,它将崩溃。 遵循手册,您应该能够解决问题,尽管如果该服务器上有数据库,则还必须优化该数据库。

      问候。

      1.    卡洛斯

        Drassill,我已经完成了您提到的配置,并且令人满意,昨天我在线达到了280个用户,服务器没有崩溃,对此结果我感到非常满意,我还想做另一件事您告诉我进行优化在数据库中,该如何实现?

    2.    德拉西尔

      数据库的概念很开放。 使用mysql与postgres不同(例如)。 显然我不知道所有的数据库。 我已经尝试了mysql和postgres,并且这些中的同时连接的增加将基于参数max connections; mysql优化将在/etc/my.conf中完成,并且必须更改max connections参数(以及其他参数)。 对于postgres,我在博客上有一篇文章介绍了如何优化它,这可能对您有用,或者您可以将其用作数据库的参考:

      http://bytelearning.blogspot.com.es/2016/02/postgresql-una-alternativa-mysql-en.html

      问候。

  9.   埃里克森·瓦克斯

    您好,当我抛出第一个命令时,它显示的值为0。这可能是什么?

  10.   丹尼尔·奥耶达

    感谢您对这篇文章。

  11.   罗兰多·阿奎莱拉·萨拉查

    多么好的手册,这些信息是我正在寻找的信息的一部分……谢谢!

    但是现在,如果我希望当超过 250 个访问者时,访问者 251 进入等待页面或虚拟队列,我可以从相同的配置中做到这一点吗?

    问候和感谢!