Zurück zum Blog

Implementierung von PHP-Ratenbegrenzung mit Redis auf Ubuntu 20.04: Ein Tutorial

Implementierung von PHP-Ratenbegrenzung mit Redis auf Ubuntu 20.04: Ein Tutorial

Redis, auch genannt Remote Dictionary Server, ist eine Open-Source-In-Memory-Datenbank. Es handelt sich um ein datenstrukturiertes Speichersystem, das im RAM eines Servers läuft, was viel schneller ist als das schnellste Solid-State-Drive (SSD). Infolgedessen ist Redis sehr reaktionsschnell und eignet sich hervorragend für die Ratenbegrenzung.

Rate limiting schränkt die Häufigkeit ein, mit der ein Benutzer eine Ressource von einem Server anfordern kann. Viele Dienste nutzen Ratenbegrenzungen, um Missbrauch zu verhindern, beispielsweise wenn ein Benutzer versucht, einen Server mit zu viel Last zu überlasten. Wenn Sie beispielsweise PHP verwenden, um eine öffentliche API (Application Programming Interface) für Ihre Webanwendung zu entwickeln, sind Ratenbeschränkungen erforderlich. Das liegt daran, dass Sie, wenn Sie eine API für die Öffentlichkeit freigeben, einschränken möchten, wie oft eine Person eine Aktivität in einem bestimmten Zeitraum wiederholen kann. Benutzer, die keine Autorität über Ihr System haben, könnten es sonst zum Stillstand bringen.

Die Ratenbegrenzung sorgt dafür, dass Ihre Anwendung reibungslos funktioniert, indem sie Benutzeranfragen ablehnt, die ein festgelegtes Limit überschreiten. Wenn Sie eine große Anzahl von Clients haben, setzt die Ratenbegrenzung eine Fair-Use-Richtlinie durch, die es jedem Benutzer ermöglicht, mit hoher Geschwindigkeit auf Ihre Anwendung zuzugreifen. Die Ratenbegrenzung kann Ihnen auch helfen, Geld bei der Bandbreite zu sparen, indem sie die Überlastung Ihres Servers verringert.

Durch die Verfolgung von Benutzeraktivitäten in einer Datenbank wie MySQL, wäre es möglich, ein Ratenbegrenzungsprogramm zu erstellen. Da solche Daten jedoch von der Festplatte geladen und mit dem definierten Limit abgeglichen werden müssen, ist das Endergebnis möglicherweise nicht skalierbar, wenn mehrere Personen gleichzeitig auf das System zugreifen. Dies ist nicht nur ineffizient, sondern relationale Datenbankmanagementsysteme wurden auch nicht für diesen Zweck entwickelt.

Redis ist eine gute Wahl für die Erstellung eines Ratenbegrenzers, da es als In-Memory-Datenbank arbeitet und sich dafür als zuverlässig erwiesen hat für dies. In diesem Tutorial führen wir Sie durch die Schritte zur Implementierung einer PHP-Ratenbegrenzung mit Redis auf Ubuntu 20.04.

Fangen wir an!

Voraussetzungen

Um diesem Tutorial folgen zu können, benötigen Sie Folgendes:

Schritt 1: Installieren der Redis-Erweiterung für PHP

Bevor wir beginnen, aktualisieren wir die Repositories, um Paketkonflikte zu vermeiden:

Installieren Sie als Nächstes die php-redis-Erweiterung, ein Paket, das die Verwendung von Redis in PHP-Programmen ermöglicht. Führen Sie den folgenden sudo-Befehl aus, um php-redis:

Starten Sie danach den Apache-Server neu, um die php-redis-Bibliothek zu laden:

Der nächste Schritt besteht darin, die Informationen in Ihrem Software-Index zu aktualisieren und die Redis-Bibliothek für PHP zu installieren. Anschließend erstellen wir eine PHP-Ressource, die den Zugriff basierend auf der IP-Adresse eines Benutzers einschränkt.

Schritt 2: Erstellen einer PHP-Webressource für die Ratenbegrenzung

In diesem Schritt erstellen Sie eine demo.php-Datei im Stammverzeichnis Ihres Webservers ( /var/www/html/). Diese Datei wird öffentlich zugänglich sein, und Benutzer können die URL in ihrem bevorzugten Webbrowser aufrufen. Später werden wir den Befehl curl verwenden, um die Erreichbarkeit der Ressource zu überprüfen, die wir nutzen möchten. Benutzer können innerhalb eines Zeitraums von 15 Sekunden dreimal auf die Beispiel-Ressourcendatei zugreifen. Ein Versuch, der das maximale Limit überschreitet, führt zu einer Fehlermeldung.

Die Hauptfunktionalität dieser Datei hängt stark vom Redis-Server ab. Der PHP-Code in der Datei erstellt beim ersten Zugriff des Benutzers auf die Ressource einen Schlüssel auf dem Redis-Server, der auf der IP-Adresse des Benutzers basiert. Der Code versucht, die IP-Adresse des Benutzers mit den auf dem Redis-Server gespeicherten Schlüsseln abzugleichen, und erhöht den Wert um eins, wenn der Schlüssel existiert, wenn der Benutzer zur Ressource zurückkehrt. Der PHP-Code prüft kontinuierlich, ob der neue Wert das Maximum erreicht hat.

Nach 15 Sekunden läuft der Redis-Schlüssel, der auf der IP-Adresse des Benutzers basiert, ab und die Verfolgung der Besuche des Benutzers auf der Webressource beginnt von neuem. Öffnen Sie die /var/www/html/demo.php-Datei im nano-Texteditor:

Füllen Sie dann alle Felder aus, um die Redis-Klasse zu initialisieren. Vergessen Sie nicht, das REDIS_PASSWORD auf den richtigen Wert zu setzen:

Redis->auth unterstützt die Klartext-Authentifizierung des Redis-Servers. Dies funktioniert gut, wenn Sie lokal arbeiten (über localhost), aber wenn Sie es mit einem entfernten Redis-Server zu tun haben, SSL-Authentifizierung wird empfohlen.

Legen Sie als Nächstes in derselben Datei die folgenden Variablen auf ihre Standardwerte fest:

Lassen Sie uns diese Anweisungen im Detail verstehen:

  • $max_calls_limit: Ein Benutzer kann nicht über dieses maximale Aufruflimit hinaus auf die Ressource zugreifen.

  • $time_period: Dies wird als Zeitrahmen verwendet und in Sekunden gezählt. Hier ist es dem Benutzer gestattet, auf die Ressource gemäß den Grenzwerten zuzugreifen, die in der $max_calls_limit .

  • $total_user_calls: Summiert die Anzahl der Male, die ein Benutzer Zugriff auf die Aufruf-Limit in einem bestimmten Zeitraum angefordert hat.

Fügen Sie dann den folgenden Code hinzu, um die IP-Adresse des Anfragenden zu erhalten, der auf die Webseite zugreifen möchte:

Zur Demonstration protokolliert dieser Code die Aktionen der Benutzer anhand ihrer IP-Adressen. Wenn Sie eine geschützte Ressource auf dem Server haben, die eine Authentifizierung erfordert, können Sie die Aktionen der Benutzer anhand ihrer Benutzernamen oder Zugriffstoken verfolgen.

In unserer Anleitung wird jedem Benutzer, der sich bei Ihrem System anmeldet, eine eindeutige Kennung zugewiesen (z. B. eine Kunden-ID, Entwickler-ID, Anbieter-ID oder sogar eine Benutzer-ID). Denken Sie daran, diese IDs anstelle der $Benutzer-IP-Adresse zu verwenden, wenn Sie unserem Tutorial folgen.

Hier reicht die IP-Adresse des Benutzers aus, um das Konzept zu demonstrieren. Fügen Sie den folgenden Codeblock zu Ihrer Datei hinzu, sobald Sie die IP-Adresse des Benutzers aus dem vorherigen Codeausschnitt erhalten haben:

Hier ist eine Übersicht über diese Anweisungen:

  • if...else: Die Anweisung überprüft, ob auf dem Redis-Server ein Schlüssel mit der IP-Adresse definiert ist.

    • Wenn der Schlüssel nicht gefunden wird, if (!$redis->exists($user_ip_address)) {...}, können Sie den Schlüssel setzen und seinen Wert mit auf 1 festlegen$redis->set($user_ip_address, 1).

  • $redis->expire($user_ip_address, $time_period): Lässt den Schlüssel nach einer bestimmten Zeit ablaufen. In diesem Tutorial haben wir ihn auf festgelegt15 Sekunden.

  • Wenn die IP-Adresse des Benutzers nicht im Redis-Schlüssel gefunden wird, setzen Sie die Variable $total_user_calls Wert als 1.

  • else {...}: Der Anweisungsblock verwendet den $redis->INCR($user_ip_address); Befehl, um den Wert des Redis-Schlüssels um zu erhöhen1. Dies wird auf jede IP-Adresse angewendet, die dem Schlüssel zugeordnet ist.

    • Hinweis: Dies können Sie nur erreichen, wenn der Schlüssel bereits im Redis-Server gesetzt ist und als wiederholte Anfrage gezählt wird.

  • $total_user_calls = $redis->get($user_ip_address): Diese Anweisung ruft die Gesamtzahl der Anfragen ab, indem sie den jeweiligen auf der IP-Adresse basierenden Schlüssel auf dem Redis-Server überprüft.

  • if ($total_user_calls > $max_calls_limit) {... }..: Diese if -Anweisung wird verwendet, um das überschrittene Limit zu überprüfen. Wenn ja, benachrichtigen Sie den Benutzer mit echo "Benutzer" . $user_ip_address . " Limit überschritten.";.

Schließlich benachrichtigen Sie den Benutzer über die Anzahl seiner Besuche in einem bestimmten Zeitraum mit der echo "Willkommen" . $user_ip_address . "Aufrufe insgesamt" . $total_user_calls . "in" . $time_period . "Sekunden"; -Anweisung.

Fügen Sie danach die folgenden Codezeilen in Ihre /var/www/html/demo.php -Datei ein:

Speichern und schließen Sie die /var/www/html/demo.php-Datei, nachdem Sie sie bearbeitet haben. Auf der demo.php-Webseite haben Sie nun die Logik erstellt, die für die Ratenbegrenzung von Benutzern erforderlich ist. Lassen Sie uns unser Skript im nächsten Schritt testen.

Schritt 3: Ausführen des Redis-Ratenbegrenzungstests

Sie verwenden den curl-Befehl in diesem Schritt, um die Webressource abzurufen, die Sie in Schritt 2 geschrieben haben. Um das Skript gründlich zu testen, führen Sie einen einzelnen Befehl aus, der die Ressource fünfmal anfordert. Dies kann durch Hinzufügen eines Platzhalter-URL-Arguments zu der demo.php das Ende der Datei. Um die curl -Anweisungen fünfmal auszuführen, verwenden Sie den Wert ?[1-5] am Ende Ihrer Anfrage.

Führen Sie den folgenden curl -Befehl unten aus:

Wenn Sie den Code ausführen, sollten Sie etwas Ähnliches wie das hier erhalten:

Die ersten drei Anfragen verliefen, wie Sie sehen können, reibungslos. Die vierte und fünfte Abfrage wurden jedoch von Ihrem Skript ratenbegrenzt. Es besteht eine gute Chance, dass der Redis-Server die Geschwindigkeit verlangsamt, mit der Personen Abfragen stellen können.

Sie haben in dieser Anleitung niedrige Werte für die beiden unten aufgeführten Variablen angegeben:

Wenn Sie Ihre App in einer Produktionsumgebung erstellen, sollten Sie je nachdem, wie oft die App voraussichtlich genutzt wird, über größere Zahlen nachdenken.

Es ist eine gute Idee, Echtzeitstatistiken zu prüfen, bevor Sie diese Zahlen anpassen. In diesem Beispiel, wenn Ihre Serverprotokolle in diesem Beispiel zeigen, dass ein durchschnittlicher Benutzer Ihre Anwendung alle 60 Sekunden 1.000 Mal besucht, können Sie diese Zahl als Beispiel dafür verwenden, wie stark die Drosselung sein sollte.

Fazit

In dieser Anleitung haben Sie gelernt, wie Sie einen Redis-Server mit PHP auf Ubuntu 20.04 nutzen. Obwohl dieser Beitrag zeigt, wie die Ratenbegrenzung mit Redis funktioniert, können Sie dies an die Anforderungen Ihrer Webanwendung anpassen. Wir empfehlen Ihnen, reale Beispiele zu untersuchen, wie das maximale Anfragelimit von Twitter, die Custom Search JSON API von Google, und andere ähnliche Dokumentationen, um Ihr Wissen über Ratenbegrenzung zu erweitern und selbst mit verschiedenen Zeitlimits zu experimentieren.

Darüber hinaus gibt es viele weitere Lernmaterialien zu Redis und PHP, auf die Sie über unsere Blogs:

Viel Spaß beim Programmieren!

author

Shreyas Patil

Autor · CloudSigma

Preslav Dobrev ist ein kreativer Designer bei CloudSigma und konzentriert sich auf eine konsistente Unternehmensidentität durch traditionelle und innovative Marketingkanäle. Er versteht es meisterhaft, künstlerische Vision mit strategischem Marketing zu verbinden, um wirkungsvolle Markengeschichten zu schaffen.

Kommentare

Noch keine Kommentare. Schreiben Sie den ersten.