php - Laravel Rate Limiter dont work on production (Digitalocean)

I have a problem, in my Laravel application I use Rate Limiter, which normally works on localhost it throws error 429 normally, but after uploading to digitalocean it doesn't work as if it doesn't exist at all and I can spam requets endlessly. Do you know what to do ? Thanks
Otherwise I am using nginx and CACHE_DRIVER=memcached on hosting and on localhost apache and CACHE_DRIVER=file.
php -v 7.4
Laravel -v 7.30

I hope I'm not missing anything here.

web.php

Route::middleware('throttle:1,5')->group(function () {
  Route::post('/', 'LandingPageController@store')->name('index.store')->middleware(ProtectAgainstSpam::class);
});

I also used my own middleware (config in RouteServiceProdiver.php), which again works on localhost but not on hosting

Route::middleware('throttle:test')->group(function () {
  Route::post('/', 'LandingPageController@store')->name('index.store')->middleware(ProtectAgainstSpam::class);
});

Middleware (config in RouteServiceProdiver.php)

protected function configureRateLimiter()
    {
        RateLimiter::for('test', function (Request $request){
            return Limit::perMinute(1);
        });
    }

Answer

Solution:

Rate limiter use RateLimiter.php class that use cache. Probably permissions issue deny hits writing on remote host.

Search this code in Illuminate\Cache\RateLimiter:

public function hit($key, $decaySeconds = 60)
    {
        $key = $this->cleanRateLimiterKey($key);

        $this->cache->add(
            $key.':timer', $this->availableAt($decaySeconds), $decaySeconds
        );

        $added = $this->cache->add($key, 0, $decaySeconds);

        $hits = (int) $this->cache->increment($key);



        // log $hits here 
        Log::info('Throttling hits: '.$hits);



        if (! $added && $hits == 1) {
            $this->cache->put($key, 1, $decaySeconds);
        }

        return $hits;
    }

  • Add temporarly something like this:

Log::info('Throttling hits: '.$hits);

under $hits variable definition

  • in remote .env set temporarly APP_DEBUG to true

  • upload on remote host

  • spamming it endlessly :)

  • check laravel.log

In this manner you can analyze if the issue is cache writing.

Source