DDoS攻撃やBotによる大量のスパムアクセス(不正アクセス)が発生した際、最も避けるべきは「サーバー側でデータベース検索やプログラム実行(PHP等)が大量に走り、サーバーがダウンすること」です。
不正アクセスと判断したリクエストに対して、動的な処理を行わずに「キャッシュされた軽量なデータ」や「静的なエラーレスポンス」を即座に返すことで、オリジンサーバーのCPUやメモリの消費をほぼゼロに抑えることができます。
| 処理方法 | サーバー負荷 | 特徴 |
|---|---|---|
| 動的処理でエラー応答(WordPress等でブロック) | 高い | PHPやDBが起動するため、大量アクセスに耐えきれずダウンするリスクがある |
| Webサーバー / CDNでキャッシュ応答(429/403) | 極めて低い | 重い処理をスキップし、あらかじめ用意した静的ファイルやメモリキャッシュを返すため高耐久 |
最も効果的なのは、自社のオリジンサーバーにアクセスが届く手前のCDN(Cloudflare、AWS CloudFrontなど)で防御する方法です。
CDNを導入していない場合やWebサーバー側で直接防ぐ場合は、Nginxのレート制限機能(limit_req)などを活用します。アプリケーション(PHP)に処理を渡す前に、Webサーバー層で即座に拒否・応答します。
以下は、Nginxで一定のリクエスト数を超えたアクセスに対し、即座に静的なエラーページ(429)を返してサーバー負荷を抑える設定例です。
# httpブロック内に記述(IPごとのリクエストレート制限ゾーンを定義)
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;
server {
listen 80;
server_name example.com;
location / {
# 制限を超えた場合は即座に429エラーを返す
limit_req zone=mylimit burst=10 nodelay;
limit_req_status 429;
proxy_pass http://backend;
}
# 429エラー時はPHPを通さず、軽量な静的HTMLファイルを返す設定
error_page 429 /custom_429.html;
location = /custom_429.html {
root /var/www/html/errors;
internal;
}
}
不正アクセスが猛烈で特定IPの遮断が追いつかない場合、一時的にページ全体を静的キャッシュ化(FastCGI CacheやNginx Proxy Cache)し、すべてのユーザーに対してキャッシュ済みの静的ファイルだけを返す状態にします。
データベース接続が発生しないため、通常時の数千倍のリクエストにも耐えうる強靭な状態を作ることができます。
💡 ワンポイントアドバイス
「WordPressのセキュリティプラグインでブロックする」のも手軽で有効ですが、超大量のアクセスに対しては「プラグインが起動する=PHPやDBが動く」ため、結局サーバーがダウンしてしまいます。大規模な不正アクセスには「CDN」や「Webサーバーレベル」でのキャッシュ・応答処理が鉄則です。
不正アクセスと判断したアクセスに対しては、「できるだけ手前のレイヤー(CDN > Webサーバー > アプリケーション)で」「処理負荷の最も低いキャッシュや静的レスポンスを返す」ことがサーバーを守る鍵となります。
平常時からCDNの導入やWebサーバーのレート制限を設定しておき、万が一の攻撃時にもサーバーダウンを起こさない堅牢な環境を作っておきましょう。