最近、Fessを公開していると、AIクローラーなどが激しくクロールしてきて、サーバーに負荷がかかることがあります。このような問題に対応するため、Fess 15.4でIPベースのリクエスト制限機能を追加しました。
リクエスト制限機能とは
この機能は、特定のIPアドレスからの短時間での大量リクエストを検出し、自動的にブロックすることでサーバーを保護します。デフォルトでは無効になっているので、必要に応じて有効にしてください。
主な特徴は以下の通りです。
- IPアドレスごとにリクエスト数をカウント
- 一定時間内に許可されたリクエスト数を超えると自動的にブロック
- ブロックされたIPは一定時間後に自動解除
- ホワイトリストで特定のIPを除外可能
- ブラックリストで特定のIPを常時ブロック可能
設定方法
fess_config.propertiesに以下の設定を追加することで有効にできます。
# リクエスト制限を有効にする
rate.limit.enabled=true
# 1分間に許可するリクエスト数(デフォルト: 100)
rate.limit.requests.per.window=100
# 計測するウィンドウサイズ(ミリ秒、デフォルト: 60000 = 1分)
rate.limit.window.ms=60000
# 制限超過時のブロック時間(ミリ秒、デフォルト: 300000 = 5分)
rate.limit.block.duration.ms=300000
# Retry-Afterヘッダーの値(秒、デフォルト: 60)
rate.limit.retry.after.seconds=60
ホワイトリストとブラックリスト
特定のIPアドレスを制限から除外したり、常時ブロックしたりすることができます。
# 制限から除外するIPアドレス(カンマ区切り)
rate.limit.whitelist.ips=127.0.0.1,::1,192.168.1.100
# 常時ブロックするIPアドレス(カンマ区切り)
rate.limit.blocked.ips=203.0.113.50,198.51.100.25
リバースプロキシ環境での設定
NginxやApacheなどのリバースプロキシを使用している場合、クライアントの実際のIPアドレスを取得するために、信頼できるプロキシのIPアドレスを設定する必要があります。
# 信頼するプロキシのIPアドレス(カンマ区切り)
rate.limit.trusted.proxies=127.0.0.1,::1,10.0.0.1
この設定がない場合、すべてのリクエストがプロキシのIPアドレスとして認識されてしまい、正しく制限が機能しません。
制限超過時の動作
リクエスト制限を超えた場合、HTTPステータス429(Too Many Requests)が返されます。レスポンスにはRetry-Afterヘッダーが含まれ、何秒後に再試行できるかが示されます。
ブラックリストに登録されたIPからのアクセスの場合は、HTTPステータス403(Forbidden)が返されます。
注意事項
- この機能はFess 15.4以降で利用可能です
- デフォルトでは無効になっています
- 設定値は環境に応じて適切に調整してください
- ホワイトリストにはローカルホスト(127.0.0.1, ::1)がデフォルトで含まれています