ホームページ  >  記事  >  運用・保守  >  nginxで単位時間当たりのアクセス頻度を制限する方法

nginxで単位時間当たりのアクセス頻度を制限する方法

WBOY
WBOY転載
2023-05-15 13:43:06774ブラウズ

まず最初に言っておきますが、私がこの問題に遭遇したのは、Web サイトが攻撃を受けて Alibaba Cloud が警察に通報したためで、IP アドレスを制限する代わりに、アクセス頻度を制限しようと考えました (IP アドレスを制限する計画は後で説明します)。 )。接続リソースが枯渇したときに nginx から返されるステータス コードは 502 です。このソリューションの制限を追加すると、通常のステータス コードとは異なる 599 が返されます。
手順は次のとおりです:

最初に次の内容を nginx.conf に追加します:

map $http_x_forwarded_for  $clientrealip {
    "" $remote_addr;
    ~^(?p<firstaddr>[0-9\.]+),?.*$  $firstaddr;
    }

    ###safe setting to limit the request number per second
    limit_req_status 599;
    limit_req_zone $clientrealip zone=allips:70m rate=5r/s;

セッション プールのサイズは 70m です。制限された IP が多数ある場合は、調整できます。制限された IP が少ない場合は、アクセス可能な IP が多い場合は、
を 1 秒あたり 5 リクエストに増やす必要があります。これも状況に応じて調整されます。5 は、より適切であるか、少し大きすぎます。

次に、www.xxoo.com.conf (これは各仮想ホストの lnmp 構成ファイルです) を変更します。サーバーで、場所の上に次の行を追加します:

limit_req zone=allips burst=5 nodelay;

Restart nginx in this同時実行性をテストするスクリプトを作成できます。

Python 同時実行スクリプトは次のように提供されます:

import threading
import time,urllib2


url = &#39;http://sf.gg/&#39;
def worker():
  try:
   response = urllib2.urlopen(url)
   print response.getcode()
  except urllib2.httperror, e:
   print e.code

for i in range(2000):
  t = threading.thread(target=worker)
  t.start()

2000 と http://sf.gg/ の両方を変更し、python *.py > out を実行して分析します。ファイル内のステータス コードは分散されており、特に 599 が一般的である場合は、頻度制限が影響します。

以上がnginxで単位時間当たりのアクセス頻度を制限する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。