概要
Fess には、システムの安定性とパフォーマンスを維持するためのレート制限機能があります。 この機能により、過度なリクエストからシステムを保護し、公平なリソース配分を実現できます。
レート制限は以下の場面で適用されます:
検索APIやAIモードAPIを含む全HTTPリクエスト(
RateLimitFilter)クローラーのリクエスト(クロール設定による制御)
HTTPリクエストのレート制限
Fess へのHTTPリクエスト数をIPアドレス単位で制限できます。 この制限は検索API、AIモードAPI、管理画面などすべてのHTTPリクエストに適用されます。
設定
app/WEB-INF/conf/fess_config.properties:
# レート制限を有効にする(デフォルト: false)
rate.limit.enabled=true
# ウィンドウあたりの最大リクエスト数(デフォルト: 100)
rate.limit.requests.per.window=100
# ウィンドウサイズ(ミリ秒)(デフォルト: 60000)
rate.limit.window.ms=60000
動作
レート制限を超えたリクエストは HTTP 429 (Too Many Requests) を返します
ブロックIPリストに含まれるIPからのリクエストは HTTP 403 (Forbidden) を返します
制限はIPアドレス単位で適用されます
IPごとに最初のリクエストからウィンドウが開始し、ウィンドウ期間経過後にカウントがリセットされます(固定ウィンドウ方式)
制限超過時はIPが
rate.limit.block.duration.msの期間ブロックされます
AIモードのレート制限
AIモード機能にはLLM APIのコストとリソース消費を制御するためのレート制限があります。 AIモードには上記のHTTPリクエストレート制限に加えて、AIモード固有のレート制限も設定できます。
AIモード固有のレート制限設定については AIモード機能の設定 を参照してください。
注釈
AIモードのレート制限は、LLMプロバイダー側のレート制限とは別に適用されます。 両方の制限を考慮して設定してください。
クローラーのレート制限
クローラーがターゲットサイトに過度な負荷をかけないよう、リクエスト間隔を設定できます。
Webクロール設定
管理画面の「クローラー」→「ウェブ」で以下を設定:
リクエスト間隔: リクエスト間の待機時間(ミリ秒)
スレッド数: 並列クロールスレッド数
推奨設定:
# 一般的なサイト
intervalTime=1000
numOfThread=1
# 大規模サイト(許可がある場合)
intervalTime=500
numOfThread=3
robots.txtの尊重
Fess はデフォルトでrobots.txtのCrawl-delay指示を尊重します。
# robots.txtの例
User-agent: *
Crawl-delay: 10
レート制限の全設定項目
app/WEB-INF/conf/fess_config.properties で設定可能なすべてのプロパティです。
| プロパティ | 説明 | デフォルト |
|---|---|---|
rate.limit.enabled | レート制限を有効にする | false |
rate.limit.requests.per.window | ウィンドウあたりの最大リクエスト数 | 100 |
rate.limit.window.ms | ウィンドウサイズ(ミリ秒) | 60000 |
rate.limit.block.duration.ms | 制限超過時のIPブロック期間(ミリ秒) | 300000 |
rate.limit.retry.after.seconds | Retry-Afterヘッダー値(秒) | 60 |
rate.limit.whitelist.ips | レート制限から除外するIPアドレス(カンマ区切り) | 127.0.0.1,::1 |
rate.limit.blocked.ips | ブロックするIPアドレス(カンマ区切り) | (空) |
rate.limit.trusted.proxies | 信頼するプロキシIP(X-Forwarded-For/X-Real-IPの取得元) | 127.0.0.1,::1 |
rate.limit.cleanup.interval | メモリリーク防止のためのクリーンアップ間隔(リクエスト数) | 1000 |
高度なレート制限設定
カスタムレート制限
特定の条件に基づいて異なるレート制限ロジックを適用する場合は、 カスタムコンポーネントの実装が必要です。
// RateLimitHelperのカスタマイズ例
public class CustomRateLimitHelper extends RateLimitHelper {
@Override
public boolean allowRequest(String ip) {
// カスタムロジック
}
}
除外設定
特定のIPアドレスをレート制限から除外したり、ブロックしたりできます。
# ホワイトリストIP(レート制限から除外、カンマ区切り)
rate.limit.whitelist.ips=127.0.0.1,::1,192.168.1.100
# ブロックIPリスト(常にブロック、カンマ区切り)
rate.limit.blocked.ips=203.0.113.50
# 信頼するプロキシIP(カンマ区切り)
rate.limit.trusted.proxies=127.0.0.1,::1
注釈
リバースプロキシを使用している場合は、rate.limit.trusted.proxies に プロキシのIPアドレスを設定してください。信頼するプロキシからのリクエストのみ、 X-Forwarded-ForおよびX-Real-IPヘッダーからクライアントIPを取得します。
監視とアラート
レート制限の状況を監視するための設定:
ログ出力
レート制限が適用された場合、ログに記録されます:
<Logger name="org.codelibs.fess.helper.RateLimitHelper" level="INFO"/>
トラブルシューティング
正当なリクエストがブロックされる
原因: 制限値が厳しすぎる
解決方法:
rate.limit.requests.per.windowを増やす特定のIPをホワイトリストに追加(
rate.limit.whitelist.ips)ウィンドウサイズ(
rate.limit.window.ms)を調整
レート制限が効かない
原因: 設定が正しく反映されていない
確認事項:
rate.limit.enabled=trueが設定されているか設定ファイルが正しく読み込まれているか
Fess を再起動したか
パフォーマンスへの影響
レート制限のチェック自体がパフォーマンスに影響する場合:
ホワイトリストを活用して信頼できるIPのチェックをスキップ
レート制限を無効にする(
rate.limit.enabled=false)
参考情報
AIモード機能の設定 - AIモード機能の設定
ウェブクロール - Webクロール設定ガイド
APIの概要 - API概要