Pengguna API Laravel sering menemui HTTP 429 Too Many Requests ketika batas request terlampaui. Artikel ini memberikan solusi teknis lengkap untuk mengatasi dan menyesuaikan rate limiting sehingga API tetap stabil.
Langkah 1: Periksa Konfigurasi Rate Limiting Default
Laravel menggunakan RateLimiter yang didefinisikan di app/Providers/RouteServiceProvider.php. Buka file tersebut dan pastikan definisi tidak terlalu ketat.
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Http\Request;
public function boot()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->ip()); // ubah 60 sesuai kebutuhan
});
}
Langkah 2: Sesuaikan Batas di .env
Supaya mudah mengubah tanpa menyentuh kode, tambahkan variabel di .env dan pakai di RouteServiceProvider:
# .env
API_RATE_LIMIT=120
RateLimiter::for('api', function (Request $request) {
$limit = env('API_RATE_LIMIT', 60);
return Limit::perMinute($limit)->by($request->ip());
});
Langkah 3: Terapkan Middleware Throttle pada Route
Jika ingin mengatur limit per route, gunakan middleware throttle di file routes/api.php:
Route::middleware(['throttle:api'])->group(function () {
Route::get('/products', 'ProductController@index');
// route lain
});
// contoh limit khusus 30 request per menit untuk endpoint tertentu
Route::get('/search', 'SearchController@index')->middleware('throttle:30,1');
Langkah 4: Buat Middleware Kustom untuk Penanganan 429
Jika ingin mengirim respons JSON yang lebih informatif, buat middleware baru:
php artisan make:middleware CustomThrottle
Isi app/Http/Middleware/CustomThrottle.php:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class CustomThrottle
{
public function handle(Request $request, Closure $next, $maxAttempts = 60, $decayMinutes = 1)
{
$key = sha1($request->ip());
$attempts = cache()->increment($key);
cache()->add($key, 0, $decayMinutes * 60);
if ($attempts > $maxAttempts) {
return response()->json([
'message' => 'Terlalu banyak permintaan. Coba lagi dalam ' . $decayMinutes . ' menit.',
'retry_after' => cache()->get($key . ':timer')
], Response::HTTP_TOO_MANY_REQUESTS);
}
$response = $next($request);
return $response;
}
}
Daftarkan di app/Http/Kernel.php:
'custom.throttle' => \App\Http\Middleware\CustomThrottle::class,
Lalu gunakan pada route:
Route::post('/order', 'OrderController@store')->middleware('custom.throttle:100,1');
Langkah 5: Monitor dan Tuning dengan Laravel Telescope atau Grafana
- Pasang Laravel Telescope untuk melihat statistik request per IP.
- Jika menggunakan server Nginx, aktifkan
limit_req_zonesebagai lapisan tambahan.
# /etc/nginx/conf.d/api_rate_limit.conf
limit_req_zone $binary_remote_addr zone=api:10m rate=120r/m;
server {
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://127.0.0.1:8000;
}
}
"Dengan mengkombinasikan Laravel RateLimiter, middleware kustom, dan kontrol di level server, kami di AN Media berhasil menurunkan error 429 hingga 95% pada proyek klien kami di Jember," kata Rizky Pratama, Lead Engineer AN Media.
Langkah 6: Uji Coba dengan Skrip Bash
Gunakan curl dalam loop untuk memastikan limit berfungsi:
#!/bin/bash
url="http://localhost/api/products"
for i in {1..130}; do
curl -s -o /dev/null -w "%{http_code}\n" $url
sleep 0.5
done
Jika konfigurasi benar, Anda akan melihat kode 429 muncul setelah batas tercapai.
Kesimpulan & Call to Action
Dengan mengikuti enam langkah di atas, error 429 pada API Laravel dapat diidentifikasi, dikonfigurasi ulang, dan dipantau secara real‑time. Optimalkan rate limiting sesuai pola penggunaan klien Anda untuk menjaga performa dan menghindari pemblokiran tidak sengaja.
Butuh bantuan implementasi atau audit API? Hubungi tim AN Media sekarang dan dapatkan solusi khusus untuk proyek Anda.