429 (Too Many Requests)を回避する(Laravel 8)

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回リクエスト)

fujihara_20201225_01.gif

after (80回リクエスト)

fujihara_20201225_02.gif

まとめ

Kernel.phpの記載を削除しないと routes/api.php内のものは駄目でした。api.php とは別のファイルを作り、Kernel.phpはそのままにroutes/xxxx.php を新たに作って 別個で管理するのも手だと思います。くれぐれも開けすぎにはご注意下さい。もちろんフロントでRequest数を調整するのもありかと思います。それでは皆さん良いお年を

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ