Bloğa geri dön

Ubuntu 20.04 Üzerinde Redis Kullanarak PHP Hız Sınırlama Uygulama: Bir Öğretici

Ubuntu 20.04 Üzerinde Redis Kullanarak PHP Hız Sınırlama Uygulama: Bir Öğretici

Redis, aynı zamanda Remote Dictionary Server, açık kaynaklı bir bellek içi (in-memory) veritabanıdır. Bir sunucunun RAM’i üzerinde çalışan, en hızlı Katı Hal Sürücüsünden (SSD) çok daha hızlı olan veri yapılı bir depolama sistemidir. Sonuç olarak, Redis çok hızlı yanıt verir ve hız sınırlama için mükemmel bir seçimdir.

Hız sınırlama, bir kullanıcının bir sunucudan bir kaynağı talep etme sayısını kısıtlar. Birçok hizmet, bir kullanıcının çok fazla yük ile sunucuyu aşırı yüklemeye çalışması gibi hizmet suistimallerini durdurmak için hız sınırları kullanır. Örneğin, web uygulamanız için genel bir PHP kullanarak genel bir API (Uygulama Programlama Arayüzü) geliştirirken hız kısıtlamaları gereklidir. Bunun nedeni, bir API'yi herkese açık hale getirdiğinizde, bir kişinin belirli bir süre içinde bir eylemi kaç kez tekrarlayabileceğini sınırlamak istemenizdir. Sisteminiz üzerinde hiçbir yetkisi olmayan kullanıcılar sistemi durma noktasına getirebilir.

Hız sınırlama, belirlenen sınırı aşan kullanıcı isteklerini reddederek uygulamanızın sorunsuz çalışmasını sağlar. Çok sayıda istemciniz varsa, hız sınırlaması her kullanıcının uygulamanıza yüksek hızlarda erişmesine izin veren adil kullanım politikası uygular. Hız sınırlama, sunucunuzdaki yoğunluğu azaltarak bant genişliğinden tasarruf etmenize de yardımcı olabilir.

Kullanıcı etkinliğini MySQL gibi bir veritabanında izleyerek bir hız sınırlama programı oluşturmak mümkün olabilir. Ancak, bu tür verilerin diskten indirilmesi ve tanımlanan sınıra göre değerlendirilmesi gerektiğinden, birden fazla kişi sisteme bağlandığında nihai sonuç ölçeklenebilir olmayabilir. Bu sadece verimsiz olmakla kalmaz, aynı zamanda ilişkisel veritabanı yönetim çözümleri bunun için oluşturulmamıştır.

Redis, bellek içi bir veritabanı olarak çalıştığı ve bunun için güvenilirliği kanıtlandığı için hız sınırlayıcı yapmak adına iyi bir seçimdir. Bu eğitimde, size Ubuntu 20.04 üzerinde Redis kullanarak PHP hız sınırlamasını uygulama.

Başlayalım!

Gereksinimler

Bu eğitimi takip etmek için aşağıdakilere ihtiyacınız olacak:

Adım 1: PHP için Redis Uzantısını Kurun

Başlamadan önce, paket çakışmalarını önlemek için depoları güncelleyelim:

Ardından, php-redis uzantısını (PHP programlarında Redis kullanmayı mümkün kılan bir paket) kurun. Kurmak için aşağıdaki sudo komutunu çalıştırın: php-redis:

Bundan sonra, Apache sunucusunu yeniden başlatarak php-redis kütüphanesini yükleyin:

Bir sonraki adım, yazılım dizininizdeki bilgileri güncellemek ve PHP için Redis kütüphanesini kurmaktır. Ardından, bir kullanıcının IP adresine göre erişimi kısıtlayan bir PHP kaynağı oluşturacağız.

Adım 2: Hız Sınırlama için bir PHP Web Kaynağı Oluşturun

Bu adımda, bir demo.php dosyasını web sunucunuzun kök dizininde ( /var/www/html/) oluşturacaksınız. Bu dosya herkese açık olacak ve kullanıcılar URL'yi tercih ettikleri web tarayıcısında açabilecekler. Daha sonra, kullanmak istediğimiz kaynağın erişilebilirliğini doğrulamak için curl komutunu kullanacağız. Kullanıcılar örnek kaynak dosyasına 15 saniyelik bir süre içinde üç kez erişebilirler. Sınırı aşan bir girişim hata mesajı döndürecektir.

Bu dosyanın birincil işlevselliği büyük ölçüde Redis sunucusuna bağlıdır. Dosyadaki PHP kodu, kullanıcı kaynağa ilk kez eriştiğinde kullanıcının IP adresine bağlı olarak Redis sunucusunda bir anahtar oluşturur. Kod, kullanıcının IP adresini Redis sunucusunda kayıtlı anahtarlarla eşleştirmeye çalışacak ve kullanıcı kaynağa geri döndüğünde anahtar mevcutsa değeri bir artıracaktır. PHP kodu, yeni değerin maksimum miktara ulaşıp ulaşmadığını kontrol etmeye devam edecektir.

15 saniye sonra, kullanıcının IP adresine dayalı olan Redis anahtarının süresi dolacak ve kullanıcının web kaynağına ziyaretlerinin takibi yeniden başlayacaktır. Şunu açın: /var/www/html/demo.php dosyasını nano metin düzenleyicide açın:

Ardından, Redis sınıfını başlatmak için tüm alanları doldurun. Şunu ayarlamayı unutmayın: REDIS_PASSWORD doğru değere:

Redis->auth Redis sunucusu düz metin kimlik doğrulamasını destekler. Yerel olarak (localhost üzerinden) çalışıyorsanız bu iyi çalışır, ancak uzak bir Redis sunucusuyla çalışıyorsanız, SSL kimlik doğrulaması önerilir.

Ardından, aynı dosyada aşağıdaki değişkenleri varsayılan değerlerine ayarlayın:

Bu ifadeleri ayrıntılı olarak inceleyelim:

  • $max_calls_limit: Bir kullanıcı, kaynağa bu maksimum çağrı sınırının üzerinde erişemez.

  • $time_period: Bu bir zaman dilimi olarak kullanılır ve saniye cinsinden sayılır. Burada, kullanıcının kaynağa şu sınırda belirtilen limitlere göre erişmesine izin verilir: $max_calls_limit .

  • $total_user_calls: Bir kullanıcının belirli bir zaman diliminde calls limitine kadar erişim talebinde bulunma sayısını toplar.

Ardından, web sayfasına erişmek isteyen istemcinin IP adresini almak için aşağıdaki kodu ekleyin:

Gösterim amacıyla, bu kod kullanıcıların eylemlerini IP adreslerine göre kaydeder. Sunucuda kimlik doğrulaması gerektiren korumalı bir kaynağınız varsa, kullanıcıların eylemlerini kullanıcı adlarını veya erişim belirteçlerini kullanarak takip edebilirsiniz.

Kılavuzumuzda, sisteminize giriş yapan her kullanıcıya benzersiz bir kimlik atanacaktır (örneğin, bir müşteri kimliği, geliştirici kimliği, satıcı kimliği veya hatta bir kullanıcı kimliği). Şunun yerine bu kimlikleri kullanmayı unutmayın: $user_ip address eğer eğitimimizi takip ediyorsanız.

Burada, kavramı göstermek için kullanıcının IP adresi yeterlidir. Önceki kod parçacığından kullanıcının IP adresini aldıktan sonra dosyanıza aşağıdaki kod bloğunu ekleyin:

İşte bu ifadelerin genel bir özeti:

  • if...else: Bu ifade, Redis sunucusunda IP adresiyle tanımlanmış bir anahtar olup olmadığını doğrular.

    • Anahtar bulunamazsa, if (!$redis->exists($user_ip_address)) {...}, anahtarı ayarlayabilir ve değerini kullanarak 1 olarak tanımlayabilirsiniz$redis->set($user_ip_address, 1).

  • $redis->expire($user_ip_address, $time_period): Anahtarın belirtilen bir sürede sona ermesini sağlar. Bu kılavuzda bunu olarak ayarladık15 saniye.

  • Kullanıcının IP adresi Redis anahtarında bulunamazsa, $total_user_calls değerini olarak ayarlayın1.

  • else {...}: İfade bloğu, Redis anahtarının değerini artırmak için$redis->INCR($user_ip_address); komutunu kullanır ve değeri 1 kadar artırır. Bu, anahtarla eşleşen her bir IP adresine uygulanacaktır.

    • Note: Bunu yalnızca anahtar Redis sunucusunda zaten ayarlanmışsa ve yinelenen bir istek olarak sayıldığında gerçekleştirebilirsiniz.

  • $total_user_calls = $redis->get($user_ip_address): Bu ifade, Redis sunucusundaki ilgili IP adresi tabanlı anahtarı doğrulayarak toplam istekleri alır.

  • if ($total_user_calls > $max_calls_limit) {... }..: Bu if ifadesi, aşılan sınırı doğrulamak için kullanılır. Sınır aşılmışsa, kullanıcıyı ile bilgilendirirsinizecho "Kullanıcı" . $user_ip_address . " sınırı aşıldı.";.

Son olarak, echo "Hoş geldiniz" . $user_ip_address . "toplam çağrı sayısı" . $total_user_calls . "/" . $time_period . "saniye"; ifadesini kullanarak kullanıcıya belirli bir süre içindeki ziyaret sayısını bildiriyorsunuz.

Bundan sonra, /var/www/html/demo.php dosyanıza aşağıdaki kod satırlarını ekleyin:

Değişiklikleri yaptıktan sonra /var/www/html/demo.php dosyasını kaydedip kapatın. demo.php web sayfasında, artık kullanıcıları hız sınırlandırmak için gereken mantığı oluşturdunuz. Bir sonraki adımda betiğimizi test edelim.

Adım 3: Redis Hız Sınırlandırma Testini Çalıştırma

Bu adımda, curl komutunu kullanarak Adım 2'de yazdığınız web kaynağını talep edeceksiniz. Betiği kapsamlı bir şekilde test etmek için, kaynağı beş kez talep eden tek bir komut çalıştırın. Bu işlem, demo.php dosyasına geçici bir URL parametresi eklenerek gerçekleştirilebilir. dosyasının sonu. Gerçekleştirmek için curl talimatları beş kez uygulamak için, şu değeri kullanın: ?[1-5] isteğinizin sonunda.

Aşağıdaki curl komutunu aşağıda çalıştırın:

Kodu çalıştırdığınızda, şuna benzer bir sonuç almalısınız:

Gördüğünüz gibi ilk üç istek sorunsuz bir şekilde gerçekleşti. Ancak dördüncü ve beşinci sorgular, betiğiniz tarafından oran sınırına tabi tutuldu. Redis sunucusunun, kullanıcıların sorgu yapma hızını yavaşlatıyor olma ihtimali yüksek.

Bu kılavuzda aşağıda listelenen iki değişken için düşük değerler belirlediniz:

Uygulamanızı canlı ortama aldığınızda, insanların uygulamayı ne sıklıkta kullanacağını düşündüğünüze bağlı olarak daha büyük sayılar kullanmayı düşünebilirsiniz.

Bu sayıları ayarlamadan önce gerçek zamanlı istatistikleri incelemek iyi bir fikirdir. Bu örnekte, sunucu günlükleriniz ortalama bir kullanıcının uygulamanızı her 60 saniyede bir 1.000 kez ziyaret ettiğini gösteriyorsa, ne kadar sınırlama uygulayacağınıza örnek olarak bu sayıyı kullanabilirsiniz.

Sonuç

Bu kılavuzda, Ubuntu 20.04 üzerinde PHP ile bir Redis sunucusunu nasıl kullanacağınızı öğrendiniz. Bu yazı Redis ile oran sınırlamanın nasıl çalıştığını gösterse de, bunu web uygulamanızın taleplerini karşılayacak şekilde özelleştirebilirsiniz. Oran sınırlama konusundaki bilginizi artırmak için Twitter’ın maksimum istek sınırı, Google’ın Özel Arama JSON API'si, ve benzeri diğer belgeleri incelemenizi ve farklı zaman limitleri kullanarak kendiniz denemeler yapmanızı öneririz.

Ayrıca, Redis ve PHP hakkında erişebileceğiniz pek çok diğer öğrenme materyali bulunmaktadır: bloglarımız:

Keyifli Çalışmalar!

author

Shreyas Patil

Yazar · CloudSigma

Preslav Dobrev, CloudSigma'da Kreatif Tasarımcı olarak görev yapmakta olup geleneksel ve yenilikçi pazarlama kanallarını kullanarak tutarlı bir kurumsal kimlik oluşturmaya odaklanmaktadır. Sanatsal vizyonu stratejik pazarlamayla harmanlayarak etkili marka anlatıları oluşturma konusunda oldukça yeteneklidir.

Yorumlar

Henüz yorum yapılmamış. İlk siz olun.