# PHP ile Redis Kullanarak Ubuntu 20.04’te Hız Sınırlama Nasıl Uygulanır?
Web sitenize her saniye binlerce istek gelirse ne olur? Sunucunuz çöker mi? Kullanıcılarınız hata mesajlarıyla mı karşılaşır? Bu sorunları önlemek için hız sınırlama (rate limiting) mekanizmaları kullanılır. Bu makalede, Ubuntu 20.04 üzerinde PHP ve Redis veritabanını kullanarak güçlü ve ölçeklenebilir bir hız sınırlama sistemi nasıl uygulanacağını adım adım öğreneceksiniz. Redis’in yüksek performanslı yapısı, hız sınırlama için ideal bir çözüm sunar. Bu rehber, yeni başlayanlardan ileri seviye geliştiricilere kadar herkes için faydalı bilgiler içermektedir.
Öğrenme Yol Haritası
Bu makale, hız sınırlamayı adım adım öğrenmenizi sağlayacak üç farklı seviyeye ayrılmıştır:
* Yeni Başlayan: Temel kavramlar, basit kod örnekleri ve adım adım uygulama.
* Orta: Gerçek dünya senaryoları, optimizasyon ipuçları ve daha gelişmiş teknikler.
* İleri Düzey: Performans analizi, edge case’ler (olağan dışı durumlar) ve gelişmiş optimizasyon stratejileri.
Temel Kavramlar: Hız Sınırlama ve Redis
Hız sınırlama, belirli bir zaman dilimi içinde bir kullanıcı veya IP adresinden gelen istek sayısını sınırlama işlemidir. Bu, sunucunuzun aşırı yüklenmesini ve hizmetin kesintiye uğramasını önler. Redis, bellek içi bir veritabanıdır ve bu nedenle hız sınırlama için mükemmel bir performans sunar. Hızlı okuma ve yazma işlemleri, gerçek zamanlı hız sınırlamanın etkin bir şekilde uygulanmasını sağlar.
Redis’i kullanarak hız sınırlama uygulamanın temel mantığı, her istek için Redis’te bir sayaç tutmaktır. Bu sayaç, belirli bir zaman dilimi içindeki istek sayısını takip eder. Eğer sayaç belirlenen limiti aşarsa, istek reddedilir. Aksi takdirde, sayaç artırılır ve istek işlenir.
PHP ve Redis Kurulumu
Öncelikle, Ubuntu 20.04 sunucunuza PHP ve Redis’i kurmanız gerekir. Aşağıdaki komutları kullanarak bunu yapabilirsiniz:
sudo apt update
sudo apt install php php-redis
sudo apt install redis-server
Redis sunucusunun çalıştığından emin olmak için aşağıdaki komutu çalıştırın:
sudo systemctl status redis-server
PHP’de Redis’e bağlanmak için Predis kütüphanesini kullanacağız. Composer kullanarak kütüphaneyi yükleyin:
composer require predis/predis
Redis Kullanarak Hız Sınırlama Nasıl Uygulanır? (Yeni Başlayan)
Bu bölümde, basit bir hız sınırlama mekanizması oluşturacağız. Her IP adresinden 10 saniyede en fazla 5 istek kabul edeceğiz.
<?php
require 'vendor/autoload.php';
use Predis\Client;
$redis = new Client();
$ip = $_SERVER['REMOTE_ADDR'];
$key = 'rate_limit:' . $ip;
$limit = 5;
$time = 10;
$requests = $redis->get($key);
if ($requests === null || $requests < $limit) {
$redis->incr($key);
$redis->expire($key, $time); // 10 saniye sonrasında sayaç sıfırlanır
// İsteği işleme kodu buraya eklenir
echo "İstek kabul edildi.";
} else {
// İstek reddedildi
header('HTTP/1.1 429 Too Many Requests');
echo "Çok fazla istek. Lütfen daha sonra tekrar deneyin.";
}
?>
Bu kod, öncelikle kullanıcının IP adresini alır. Sonrasında Redis’te ilgili IP adresi için bir anahtar oluşturur ve mevcut istek sayısını kontrol eder. Limit aşılırsa, 429 Too Many Requests hatası döndürülür. Aksi halde, istek sayısı artırılır, süre belirlenir ve istek işlenir. Bu basit örnek, hız sınırlamanın temel prensiplerini göstermektedir.
Gerçek Dünya Senaryoları ve Optimizasyon İpuçları (Orta)
Yukarıdaki örnek, basit bir senaryo için yeterli olsa da, gerçek dünya uygulamalarında daha gelişmiş tekniklere ihtiyaç duyabilirsiniz. Örneğin, farklı kullanıcı türleri için farklı limitler belirleyebilirsiniz. Yönetici kullanıcılarının hız sınırlaması dışı tutulması gibi özel durumları ele almanız gerekebilir.
Örnek Senaryo: Bir e-ticaret sitesi düşünün. Kayıtlı kullanıcılar için daha yüksek bir istek limiti belirlemek isteyebilirsiniz. Bu durumda, kullanıcı kimliğini de anahtara ekleyerek farklı limitler uygulayabilirsiniz:
$key = 'rate_limit:' . $ip . ':' . $userId; // userId, oturum açmış kullanıcının ID'si
Optimizasyon İpuçları:
* Lua Scriptleri: Redis’in Lua script desteği, atomik işlemler yapmanıza olanak tanır. Bu, yarış koşullarını (race conditions) önlemek ve performansı artırmak için önemlidir.
* Verimli Anahtar Adlandırma: Anahtar adlandırma stratejinizi dikkatlice seçin. Çok uzun anahtarlar performansı düşürebilir.
* Redis’in Veri Yapıları: Listeler, kümeler gibi Redis’in diğer veri yapılarını kullanarak daha karmaşık hız sınırlama mekanizmaları oluşturabilirsiniz.
Hız Sınırlama Performans Analizi ve Edge Case’ler (İleri Düzey)
Gerçek dünya uygulamalarında, performans analizi ve edge case’leri ele almak kritik öneme sahiptir. Yüksek trafik altında sisteminizin nasıl performans gösterdiğini izlemek ve olası sorunları önceden tespit etmek önemlidir.
Performans Analizi:
* Profil Oluşturma: PHP kodunuzu profilleyerek performans darboğazlarını belirleyebilirsiniz. Xdebug gibi araçlar bu konuda yardımcı olabilir.
* Yük Testi: Sisteminizi farklı trafik seviyelerinde test ederek kapasitesini belirleyebilirsiniz. JMeter gibi yük test araçları kullanabilirsiniz.
* Redis Performansı: Redis sunucunuzun performansını izleyin. Bellek kullanımı, işlem süresi gibi metrikleri takip edin.
Edge Case’ler:
* DDoS Saldırıları: Hız sınırlama, DDoS saldırılarına karşı tam bir koruma sağlamaz. Başka güvenlik önlemleriyle birlikte kullanılmalıdır. Fatih Soysal’ın [https://fatihsoysal.com](https://fatihsoysal.com) sitesinde DDoS saldırıları hakkında daha fazla bilgi bulabilirsiniz. (Buraya DDoS saldırılarıyla ilgili bir makaleye link eklenebilir.)
* Yanlış Kullanıcı Davranışı: Botlar veya kötü amaçlı yazılımlar hız sınırlama mekanizmalarını atlatmaya çalışabilir. Bu durumları tespit etmek ve önlemek için gelişmiş teknikler kullanmanız gerekebilir.
* Sistem Arızaları: Redis sunucusunun çökmesi durumunda, hız sınırlama mekanizması da çalışmayacaktır. Bu gibi durumlar için yedekleme ve hata yönetimi planları oluşturmalısınız.
Sonuç
Bu makalede, PHP ve Redis kullanarak Ubuntu 20.04’te hız sınırlama nasıl uygulanacağını öğrendiniz. Basit bir örnekten başlayarak, gerçek dünya senaryoları ve ileri düzey teknikleri ele aldık. Unutmayın ki, hız sınırlama, sisteminizin güvenliği ve performansı için kritik öneme sahiptir. Uygulamanızı sürekli olarak izleyin ve geliştirmeye devam edin.
Sıkça Sorulan Sorular:
1. Redis’i başka bir veritabanıyla değiştirebilir miyim? Evet, Memcached gibi diğer bellek içi veritabanlarını da kullanabilirsiniz, ancak Redis’in performansı genellikle daha iyidir.
2. Hız sınırlama limitini nasıl dinamik olarak değiştirebilirim? Limit değerini bir konfigürasyon dosyasından veya bir veritabanından okuyarak dinamik olarak değiştirebilirsiniz.
3. Birden fazla hız sınırlama mekanizması kullanabilir miyim? Evet, farklı kriterlere (IP adresi, kullanıcı kimliği vb.) dayalı farklı hız sınırlama mekanizmaları kullanabilirsiniz.
4. Hız sınırlamasını atlatmanın yolları var mı? Evet, ancak gelişmiş teknikler kullanarak bu riskleri azaltabilirsiniz.
5. Hız sınırlama ile ilgili hataları nasıl yönetirim? Hata yönetimi stratejileri oluşturarak, hataları yakalayıp uygun şekilde ele alabilirsiniz.
Yazar: Fatih Soysal
