如何在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接收此數量,這在此調用的配置文件中完成 配置文件,位於 / etc / apache2.

有問題的文件採用以下結構: 模組,每個都有其對應的名稱,但我們只會對其中一個名為  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的ips,為此,您可以佔用一個haproxy,如果您希望它具有高可用性,則可以集成keepalive以防其中一個崩潰,另一個繼續響應,或者如果您已經擁有該應用程序的域,則可以用磅來平衡對兩個服務器都進行後端處理,對於特定情況(例如,moodle或連接到mysql中數據庫的某些應用程序),您必須為每個應用程序服務器創建一個指向同一數據庫的用戶。

  3.   夏丸 他說:

    非常感謝您的帖子,您是完全正確的,ram是主要計算,儘管我想我們也可以計算處理器可以處理的最大進程數(當然,首先要進行主內存的計算)以及如何分配磁盤硬(示例分區/ var = 1TR)。

    1.    德拉西爾 他說:

      你是對的; 一切都很重要,例如溫度控制等。 顯然,功能強大的處理器可以高效地同時執行更多任務,但是本文的目的是解釋RAM對於同時連接數的重要性。

      控制所有這些因素並查看我們的處理器是否未飽和或者我們是否剩下很少的可用 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,而平均值可能會變為……。

    這只是一個貢獻,值得商de,因為它沒有擰緊連接。

    擁抱人們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 進入等待頁面或虛擬隊列,我可以從相同的配置中做到這一點嗎?

    問候和感謝!