私は重いCPUパブリックWebサービスをホストしています。Apache2を構成して、IPアドレスごとに手元の場所への同時接続を1つだけ許可し、単一のクライアントがリソースを使いすぎないようにします。
これを行うためのきちんとしたApache2ソリューションはありますか?私はmod_bwを調べましたが、これはうまくいっていないようです(MaxConnectionsは、IPごとではなく、すべてのユーザーにのみ適用されます)。 Apache2-mod-limitipconnと呼ばれるモジュールもありますが、これにはプリコンパイルされたパッケージがなく、ウェブサイトが死んでいるため、より長く維持されていると思います。私はUbuntuに正式な依存関係として含めることができるものを好みます。
私の経験から言うと、 "IPごとに1つの接続"を制限するよりも少し複雑です(恐らく、常にそうではありませんね:-))。
ただし、「MinSpareServers、MaxSpareServers、StartServers」などの他の構成可能なパラメーターがありました(これらがまだ存在するかどうかはわかりませんが、Apache 2.0に含まれていたことは確かです)。
また、出力を圧縮すると、必要に応じて帯域幅のニーズを改善し、「mod_deflate」を使用して応答時間を最大75%高速化できる場合があります。
「mod_bandwidth」は、単一の接続を制限しようとするのではなく、いくつかの支援を提供する可能性があり、おそらく、圧縮を調べた後に下がるルートでしょう。
または、Cを記述できる場合は、IPごとの接続をカウントするモジュールを自分で作成できます。
IPに単一の接続が提供されたときに何が起こるかは、注意する必要があります。通常、それはかなりの光景ではないと言ってみましょう! 「サーバービジー」ページなどにドロップすることもできますが、サーバーを最適化する道をたどるので、面倒な訪問者よりも良いでしょう。
Apacheモジュールについてはわかりませんが、iptablesを使用できます。これがconnlimitモジュールの使い方です: http://www.cyberciti.biz/faq/iptables-connection-limits-howto/
あなたの状況では、次のようなものがうまくいきます:
/sbin/iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset
ただし、他の質問で述べたように、注意してください。このルールは、NATを使用し、多数のユーザーに対して単一のIPアドレスを共有するISPや組織などの正当なロボット(Googleクローラーなど)をブロックする可能性があります。
Mod_qos httpdモジュールを使用できます。
QS_SrvMaxConnPerIP
<number>
[<connections>]
このサーバー(仮想ホスト)のソースIPアドレスごとの最大接続数を定義します。 「connections」引数は、この制限を有効にするサーバー(すべての仮想ホスト)のビジー接続の数を定義します。デフォルトは0です(つまり、サーバーがアイドル状態であっても、制限は常に有効です)。
詳細は http://mod-qos.sourceforge.net にあります。
例:
LoadModule qos_module path_to_module/mod_qos.so
<IfModule mod_qos.c>
# max connection per IP is
QS_SrvMaxConnPerIP 15
</IfModule>
<VirtualHost *:80>
...
</VirtualHost>
IPアドレスごとに1つの接続は機能しません。 Webブラウザーは、1つの接続を使用してWebページをダウンロードし、次に10以上の同時接続を使用してすべての画像、CSS、javacriptsなどを取得します。そのため、IPで制限すると、ユーザーはメインページを取得します。画像とそれがすべてです。
IPによる制限が機能する唯一の使用例は、ダウンロードアクセラレータを使用したくない専用のダウンロードサーバーがある場合です。別名、RapidShare。
ウェブサイトの悪用者があなたのサービスをどのように悪用しているかを調査し、それらを標的にする必要があります。全員を制限すると、誰もが傷つきます。
トラフィックが多すぎる場合は、サイトを最適化するか、より多くの/より高速なハードウェアでCPUサイクルを追加する必要があります。