ホームページ > バックエンド開発 > PHPチュートリアル > PHP nginx は IP リクエストの数と同時実行数を制限します

PHP nginx は IP リクエストの数と同時実行数を制限します

WBOY
リリース: 2016-07-30 13:31:28
オリジナル
1560 人が閲覧しました

特定の IP への一定期間内でのアクセス数に制限を設定する方法は、特に悪意のある DDoS 攻撃に直面した場合に頭の痛い問題です。このうち、CC 攻撃 (Challenge Collapsar) は DDOS (分散型サービス妨害) の一種で、攻撃者がプロキシ サーバーやブロイラーを介して被害ホストに大量のデータ パケットを継続的に送信し、相手のサーバーのリソースは、マシンがクラッシュするまで枯渇します。 CC 攻撃は通常、限られた数の IP を使用して、攻撃の目的を達成するためにサーバーに頻繁にデータを送信します。nginx は、CC 攻撃を防ぐために、HttpLimitReqModul および HttpLimitZoneModule の構成を通じて、同じ期間内の IP アクセスの数を制限できます。 HttpLimitReqModul は、単位時間あたりの接続数を制限するために使用されるモジュールです。制限を達成するには、limit_req_zone 命令と limit_req 命令を併用します。同時接続数が指定された数を超えると、503 エラーが返されます。 HttpLimitConnModul は、単一 IP の同時接続数を制限するために使用されます。limit_zone 命令と limit_conn 命令を使用する 2 つのモジュールの違いは、前者は一定期間内の接続数を制限するのに対し、後者は接続数を制限することです。同時に。

HttpLimitReqModul は、一定期間内に同じ IP によってアクセスされるインスタンスの数を制限します

<span>http<span>{<span>    <span>...<span>
    <span>#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,<span>    <span>#以$binary_remote_addr 为key,限制平均每秒的请求为20个,<span>    <span>#1M能存储16000个状态,rete的值必须为整数,<span>    <span>#如果限制两秒钟一个请求,可以设置成30r/m<span>
    limit_req_zone $binary_remote_addr zone<span>=<span>allips<span>:<span>10m<span> rate<span>=<span>20r<span>/<span>s<span>;<span>    <span>...<span>    server<span>{<span>        <span>...<span>        location <span>{<span>            <span>...<span>
            <span>#限制每ip每秒不超过20个请求,漏桶数burst为5<span>            <span>#brust的意思就是,如果第1秒、2,3,4秒请求为19个,<span>            <span>#第5秒的请求为25个是被允许的。<span>            <span>#但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。<span>            <span>#nodelay,如果不设置该选项,严格使用平均速率限制请求数,<span>            <span>#第1秒25个请求时,5个请求放到第2秒执行,<span>            <span>#设置nodelay,25个请求将在第1秒执行。<span>
            limit_req zone<span>=<span>allips burst<span>=<span>5<span> nodelay<span>;<span>            <span>...<span>        <span>}<span>        <span>...<span>    <span>}<span>    <span>...<span><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
ログイン後にコピー

HttpLimitZoneModule は、同時接続の数を制限します

limit_zone は http スコープでのみ定義でき、limit_conn はhttp サーバーの場所のスコープで定義されています

nginx ホワイトリスト設定

上記の設定では、検索エンジンのスパイダーを制限したくない場合や、ホワイトリストに登録された IP を自分でテストすることができます。これを実現するには geo コマンドを使用します。

1.

<span>http<span>{<span>    <span>...<span>
    <span>#定义一个名为one的limit_zone,大小10M内存来存储session,<span>    <span>#以$binary_remote_addr 为key<span>    <span>#nginx 1.18以后用limit_conn_zone替换了limit_conn<span>    <span>#且只能放在http作用域<span>    limit_conn_zone   one  $binary_remote_addr  <span>10m<span>;<span>  
    <span>...<span>    server<span>{<span>        <span>...<span>        location <span>{<span>            <span>...<span>           limit_conn one <span>20<span>;<span>          <span>#连接数限制<span>
           <span>#带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k<span>           limit_rate <span>500k<span>;<span>            

            <span>...<span>        <span>}<span>        <span>...<span>    <span>}<span>    <span>...<span><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
ログイン後にコピー

geo ディレクティブはホワイトリストの $limited 変数を定義します。デフォルト値は 1 です。クライアント IP が上記の範囲内にある場合、$limited の値は 0 です

2。map ディレクティブを使用して検索をマップします。エンジン クライアント IP は空の文字列です。検索エンジンでない場合は、実際の IP が表示されます。このように、検索エンジンの IP は、limit_req_zone メモリ セッションに保存できません。

map $limited $limit {

1 $binary_remote_addr ;

0 "";
}

3.limit_req_zoneとlimit_reqを設定します

limit_req_zone $limit z rate=10r/m;


limit_req zburst=5;

最後に、上記のために ab を使用して php-fpm を抑制します。この方法の効果を実際にテストします。

例 1: この制限により、1 つの IP が 1 分間に設定にアクセスできるのは 60 回のみであり、これは平均 1 回です。毎秒

まず、php スクリプトを準備し、ルート ディレクトリ $document_root

test に配置します。php

nginx 設定を追加しました

<span>http<span>{<span>     geo $limited<span>{<span>        <span>default<span> <span>1<span>;<span>        <span>#google <span>        <span>64.233<span>.<span>160.0<span>/<span>19<span> <span>0<span>;<span>        <span>65.52<span>.<span>0.0<span>/<span>14<span> <span>0<span>;<span>        <span>66.102<span>.<span>0.0<span>/<span>20<span> <span>0<span>;<span>        <span>66.249<span>.<span>64.0<span>/<span>19<span> <span>0<span>;<span>        <span>72.14<span>.<span>192.0<span>/<span>18<span> <span>0<span>;<span>        <span>74.125<span>.<span>0.0<span>/<span>16<span> <span>0<span>;<span>        <span>209.85<span>.<span>128.0<span>/<span>17<span> <span>0<span>;<span>        <span>216.239<span>.<span>32.0<span>/<span>19<span> <span>0<span>;<span>        <span>#M$<span>        <span>64.4<span>.<span>0.0<span>/<span>18<span> <span>0<span>;<span>        <span>157.60<span>.<span>0.0<span>/<span>16<span> <span>0<span>;<span>        <span>157.54<span>.<span>0.0<span>/<span>15<span> <span>0<span>;<span>        <span>157.56<span>.<span>0.0<span>/<span>14<span> <span>0<span>;<span>        <span>207.46<span>.<span>0.0<span>/<span>16<span> <span>0<span>;<span>        <span>207.68<span>.<span>192.0<span>/<span>20<span> <span>0<span>;<span>        <span>207.68<span>.<span>128.0<span>/<span>18<span> <span>0<span>;<span>        <span>#yahoo<span>        <span>8.12<span>.<span>144.0<span>/<span>24<span> <span>0<span>;<span>        <span>66.196<span>.<span>64.0<span>/<span>18<span> <span>0<span>;<span>        <span>66.228<span>.<span>160.0<span>/<span>19<span> <span>0<span>;<span>        <span>67.195<span>.<span>0.0<span>/<span>16<span> <span>0<span>;<span>        <span>74.6<span>.<span>0.0<span>/<span>16<span> <span>0<span>;<span>        <span>68.142<span>.<span>192.0<span>/<span>18<span> <span>0<span>;<span>        <span>72.30<span>.<span>0.0<span>/<span>16<span> <span>0<span>;<span>        <span>209.191<span>.<span>64.0<span>/<span>18<span> <span>0<span>;<span>        <span>#My IPs<span>        <span>127.0<span>.<span>0.1<span>/<span>32<span> <span>0<span>;<span>        <span>123.456<span>.<span>0.0<span>/<span>28<span> <span>0<span>;<span> <span>#example for your server CIDR<span>    <span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
ログイン後にコピー
limit_req_zone 和 limit_reqab -n 5 -c 1 http://www.weizhang.org/test。 php

118.144.94.193 - - [22/Dec/2012:06:27:06 + 0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"

118.144.94.193 - - [ 22/Dec/2012:06:27:06 +0000] "GET /test.php HTTP /1.0" 503 537 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/Dec/2012:06:27 :07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/2012:06:27:07 +0000] "GET /test .php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/2012:06:27:07 +0000] "GET /test.php HTTP/1.0" 503 537 " -" "ApacheBench/2.3"

brust と nolay が設定されていません。この構成では、1 秒あたり 1 回のアクセスのみが許可され、超過したリクエストは 503 エラーを返します

<span>http<span>{<span>    <span>...<span>    limit_req_zone $binary_remote_addr zone<span>=<span>allips<span>:<span>10m<span> rate<span>=<span>60r<span>/<span>m<span>;<span>    <span>...<span>    server<span>{<span>        <span>...<span>        location <span>{<span>            <span>...<span>            limit_req zone<span>=<span>allips<span>;<span>            <span>...<span>        <span>}<span>        <span>...<span>    <span>}<span>    <span>...<span><span>}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
ログイン後にコピー

ab -n 5 -c 1 http://www .weizhang.org/test.php

118.144.94.193 - - [22/Dec/2012:07 :01:00 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/Dec/2012:07:01:00 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/ Dec/2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
118.144.94.193 - - [22/Dec/2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

brust=1 と nolay を設定した後 2 つのリクエストを処理するのに 1 秒かかります。

上記は、PHP nginx がどのように IP リクエスト数と同時実行数を制限するかを内容も含めて紹介しました。PHP チュートリアルに興味のある友人の参考になれば幸いです。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート