Apacheで同時接続を増やす方法

今日は、世界で最も使用されているWebサービスのXNUMXつであるWebサーバーについてもう一度お話しします。 Apache2.

これは何度も話題になっているトピックですが、このサービスで考慮すべき別の機能について説明します。 同時接続の制限。 非常に基本的なものか、i7プロセッサと32GBのRAMを搭載した宇宙船があるかは関係ありません...

適切な対策を講じない限り、同時接続の制限は常に同じです。つまり、同時に多くの人を接続したい場合は、優れたハードウェアだけでなく、優れた構成も必要になります。

この場合、何もインストールする必要はありません。すべては、Apacheを構成するために考慮しなければならない単純な概念に基づいています。 変更を加える前に非常に明確でなければならない概念。

apache2_logo

最初に考えることは、私のチームにはどのような能力があるかということです。 可能な限り強制した場合、機器はいくつの同時接続をサポートできますか? これはすべて、単一の要因に依存します。 RAM(ランダムアクセスメモリ)。

RAMが大きいほど、接続数は多くなりますが、固定値はありません(つまり、X RAMごとにXクライアント)。そのため、まずWebサーバーで小さな計算を行うことが重要です。私たちの限界を知るために。

確立された各接続はシステム内のRAMの特定の消費を想定しているため、最初に知っておくべきことは、Apacheへの各接続が平均してどれだけのRAMを消費するかです...明らかに、すべての接続が同じRAMを消費するわけではありません。メディア...これはすべて、次のコマンドで取得できます。

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

得られた結果はメガバイトで表され、アクティブな接続の数、アクセスされたページのタイプなどによって異なる場合があります。このため、さまざまなタブを開いた状態でテストを実行することをお勧めします。 可能であれば、それぞれが異なるコンテンツを表示します。 たとえば、私の場合、結果は9.5458になります。これを上に切り上げると、次のようになります。 10 MB 接続ごとに平均して消費されるRAM。

オペレーティングシステムで実行されるのはWebサービスだけではなく、空きRAMメモリを残しておく必要があるため、システムでアクティブな残りのプロセスによって消費される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.

問題のファイルは、に基づく構造に従います。 モドゥロス、それぞれに対応する名前がありますが、名前が  mpm_prefork_module。 問題のモジュールには、デフォルトで次のデータがあります。

StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0

このモジュールには一連の非常に重要なパラメータがありますが、特に関心のあるパラメータがXNUMXつあります。 MaxClientsの。 このパラメーターは、同時接続の最大数を指定し、次のように変更する必要があります。 250.

考慮すべき詳細のXNUMXつは、デフォルト以外の値が上記のパラメーターで指定されている場合、この値の直前にもうXNUMXつ追加する必要があるということです。 このパラメータはと呼ばれます ServerLimitの 制限外の場合でもサーバーが「保持」できる接続の制限を設定します。

ServerLimitパラメーターは常にMaxClientsよりもわずかに高くする必要があります。ここでは、操作の余地がほとんどないため、 270。 これにより、モジュールは次のようになります。

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

これで、次のコマンドを使用してApacheサービスを再起動するだけで済みます。 

/etc/init.d/apache2 restart

これにより、最適化されたWebサーバーをすでに楽しむことができました。

ご挨拶。


記事の内容は、次の原則に準拠しています。 編集倫理。 エラーを報告するには、 ここで.

21コメント、あなたのコメントを残してください

コメントを残す

あなたのメールアドレスが公開されることはありません。 必須フィールドには付いています *

*

*

  1. データの責任者:MiguelÁngelGatón
  2. データの目的:SPAMの制御、コメント管理。
  3. 正当化:あなたの同意
  4. データの伝達:法的義務がある場合を除き、データが第三者に伝達されることはありません。
  5. データストレージ:Occentus Networks(EU)がホストするデータベース
  6. 権利:いつでも情報を制限、回復、削除できます。

  1.   ゼタチノ

    投稿ありがとうございます!

    1.    ドラシル

      お役に立ててうれしいです。

      ご挨拶。

  2.   ミゲル·アンヘル

    ApacheとXNUMXつのサーバーでクラスター化する方法がありますが、それがどのように機能するかを説明できますか?

    1.    ドラシル

      私はそれについていくつかの理論を読みましたが、それを実践に適用したことはありません。 それでも、おそらくこの記事はこの点に関してあなたにいくつかのガイダンスを与えることができますが、私はそれを実践する機会がなかったことを繰り返します:

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

    2.    エドゥアルド・ジャリル

      あなたが解決しなかった場合、あなたはしばらくの間尋ねました。 私はファイルシステムとして機能するサードパーティとのバランシングスキームを持っています。var/ www / html /(私の場合)にあるフォルダをファイルシステムにポイントするので、それらは同じ情報を共有します。おそらく、応答する仮想IPが必要になります。 apachesのipsにリダイレクトします。このため、haproxyを占有できます。高可用性が必要な場合は、一方が失敗した場合、もう一方が応答し続けた場合、またはアプリケーションのドメインがすでにある場合は、ポンドとバランスを取ることができます。両方のサーバーにバックエンドを実行する場合、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.    ドラシル

      それは静かなクレチン病の問題ではありません。 真実は、同時接続の数を増やすことで、DDOS攻撃に対してApacheを部分的に強化します。これは、サーバー上で確立される最大同時接続の数が、シングルユーザー。 したがって、最初は150の同時接続しかサポートできませんでしたが(正当なソースからの接続であるかどうかに関係なく)、サーバーがサポートする数だけ信頼できるようになり、同時により多くの接続を残す必要があります。サービスなし。 明らかに、接続の最大数を増やすことは、このタイプの攻撃から保護する方法ではなく、ファイアウォールポリシーを実装する必要があります。 たとえば、配置したいWebサービスがインターネットに公開される場合、実装できるセキュリティ対策は、ファイアウォールに次の行を追加することです。

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

      iptables -A INPUT -p tcp –dport 80 -m state –state ESTABLISHED、RELATED -j ACCEPT

      iptables -A 入力 -p tcp –dport 80 -j ドロップ

      1.    ピエロ

        DDoS攻撃の特徴のXNUMXつは、攻撃者が複数の異なる方向からパケットを送信しているように見える可能性があることです。これにより、パケットのフローが一方向からのみ来るのを防ぎます。

    2.    ドラシル

      私が設定したようなファイアウォールは、さまざまなソースからのものであるため、DDOS攻撃に対してあまり効率的ではないという意味であなたは正しいです。 それでも、各ソースが10以上の接続を確立できるように、これらのソースごとに接続数を制限しないよりもXNUMXに制限することをお勧めします。

      いずれにせよ、問題のキットは、サーバーがサポートする同時接続が多いほど、DDOS攻撃でサーバーをノックダウンするのが難しくなり、攻撃者がページをノックダウンするのが難しくなるということです。 。

      ご挨拶。

  6.   eliotime3000

    良い。 今のところ、VPSを苦しめないように、自分のサイトでNGINXを使い続けています。

  7.   ブルーノカシオ

    良い投稿@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になりますが、平均は……になります。

    それは単なる貢献であり、接続ではネジ止めされていないため、非常に議論の余地があります。

    ハグピープルlinuxera🙂

  8.   カルロス

    こんにちは、私は専用サーバーで問題が発生しました。リアルタイムのgoogle analyticsによると、オンラインで約250人が近づくたびに、サーバーが崩壊し、接続が切断されるまで接続が遅くなります。ウェブサイトにアップロードし、オンラインでその数を超えるユーザーをアップロードすることはありませんが、8GBのRAMである専用サーバーのパフォーマンスを見ると、使用率が10%、CPUが5%、ハードディスクが1.99%であることがわかります。使用の。
    手伝って頂けますか? 私は何をすべきかを見つけることができません、これらのステップを実行することは解決策ですか?

    1.    ドラシル

      良いカルロス。

      あなたが説明する問題は、サーバーが適切に準備されていない場合に非常に一般的です。 サーバーはおそらく、はるかに少ない数の同時接続を受け入れ、250接続に達するとクラッシュします。 マニュアルに従うことで問題を解決できるはずですが、そのサーバーにデータベースがある場合は、そのデータベースも最適化する必要があります。

      ご挨拶。

      1.    カルロス

        Drassill、私はあなたが言及した構成を行い、それは満足のいくものでした。昨日、オンラインで280ユーザーに到達し、サーバーがハングしませんでした。この結果に非常に満足しています。また、最適化するように指示された他のことも実行したいと思います。データベース、¿どうすればこれを達成できますか?

    2.    ドラシル

      データベースの概念は非常にオープンです。 mysqlの使用はpostgresと同じではありません(たとえば)。 明らかに、私はすべてのデータベースを知っているわけではありません。 mysqlとpostgresを試しましたが、これらの同時接続の増加は、パラメーターmaxconnectionsに基づいています。 mysqlの最適化は/etc/my.confで行われ、最大接続パラメータを変更する必要があります(とりわけ)。 代わりに、postgresの代わりに、自分に役立つ可能性がある、またはデータベースの参照として使用できる最適化の方法を説明する記事がブログにあります。

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

      ご挨拶。

  9.   エリクソンバスケス

    こんにちは、最初のコマンドをスローすると、値0が表示されます。これは何でしょうか。

  10.   ダニエル・オジェダ

    この投稿をありがとうございます。