まず最初に言っておきますが、私がこの問題に遭遇したのは、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 = 'http://sf.gg/' 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 サイトの他の関連記事を参照してください。