429 (Too Many Requests)を回避する(Laravel 8)
どうもfujiharaです。先日ステータスコード429というのに出会いました。 調べると利用していたLaravel8が出していました、今回はこれを回避する方法をご紹介します。
背景
先日アップした分割アップロードの バックエンドの処理をLaravel8で行っていました。ローカルでは問題なく動いてたのですが本番で動作確認を行うと ファイルが大きいときにエラーを出していました。
レスポンスコードを見ると、"429 (Too Many Requests)"とはじめはNginx側で制限とかあるのかなと 調べていたのですが、LaravelのApi Routeは1分間で60回のリクエスト制限があることがわかりました。
解決方法
変更方法は本サイトのRate Limiting を参考にRouteServiceProviderに以下のようにしました。
protected function configureRateLimiting()
{
//元々設定された 1分間60分
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
});
//追加分
RateLimiter::for('seventy', function () {
return Limit::perMinute(70);
});
}
また元々設定されているKernel.php内の $middlewareGroups 内のthrottleをコメントアウトします。
'api' => [
//'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
最後にapi.phpを以下のように変えました。
Route::get('/get', [CheckController::class, 'get']);
↓
Route::middleware(['throttle:seventy'])->group(function() {
Route::get('/get', [CheckController::class, 'get']);
});
結果
before (70回リクエスト)
after (80回リクエスト)
まとめ
Kernel.phpの記載を削除しないと routes/api.php内のものは駄目でした。api.php とは別のファイルを作り、Kernel.phpはそのままにroutes/xxxx.php を新たに作って 別個で管理するのも手だと思います。くれぐれも開けすぎにはご注意下さい。もちろんフロントでRequest数を調整するのもありかと思います。それでは皆さん良いお年を