Ich habe kein Problem damit, die Geschwindigkeit zu begrenzen, um mit Passagier / Schienen auf nginx zu arbeiten.
Ein Teil der Verwirrung besteht darin, zu unterscheiden, welche Aspekte der Konfiguration pro Client funktionieren und welche globale Grenzen haben.
Ich habe Probleme mit dem richtigen Setup für nginx's limit_req und limit_req_zone configs. Es scheint vage Flop zwischen Sprache zu flippen, was darauf hindeutet, dass dies entweder benutzerspezifisch ist oder global gilt.
In den Dokumenten ist es ziemlich vage, wie die limit_req_zone
-Zeile funktioniert. Ist diese "Zone" global oder pro Benutzer? In der folgenden Zeile bin ich in den folgenden Schlussfolgerungen richtig:
Ich bin mir auch nicht sicher über die limit_req-Linie, z. dafür:
%Vor%Danke.
Einige Hintergrundinformationen für den Fall, dass jemand wirklich gelangweilt ist und sich die Konfigurations- und allgemeinen Probleme ansehen möchte, die wir lösen möchten:
Im Moment habe ich das (Auszug):
%Vor%Wir haben zwei Zonen definiert:
a) "main_site", entworfen, um alles zu fangen b) "update_request", JS auf dem Client fragt dies über AJAX nach aktualisiertem Inhalt ab, wenn sich ein Zeitstempel in einer kleinen (zwischengespeicherten) Datei ändert
Dies bedeutet natürlich, dass wir für 1 oder 2 Minuten ziemlich wenig Verkehr haben, aber dann einen gewaltigen Anstieg, wenn potenziell 10.000 Clients den Server sofort für diesen aktualisierten Inhalt (der von der DB auf eine etwas andere Weise bedient wird) treffen abhängig von Filtern, Zugriffsberechtigungen usw.)
Wir fanden heraus, dass die Site in Zeiten hoher Last zum Stillstand kam, als die CPU-Kerne ausgereizt waren. Wir hatten einige Bugs in unserem Update-Code, die dazu führten, dass die Abfragen in der Warteschlange aufgingen Wir haben den Server immer wieder heruntergefahren, bis wir die Seite vorübergehend herunterfahren mussten und die Benutzer dazu gezwungen haben, sich abzumelden und ihren Browser zu aktualisieren ... wir haben uns selbst DDoS gemacht: PI denke, dass dies ursprünglich von einigen Konnektivitätsproblemen unserer Hosting-Firma verursacht wurde Büschel von Anfragen, sich im Browser des Benutzers anzumelden.
Während wir die Bugs ausgebügelt haben, warnten wir die Kunden, dass sie die 503-Nachricht "Schwerlast" erhalten könnten oder dass der Inhalt nicht rechtzeitig aktualisiert wird. Die ursprüngliche Absicht der Ratenbegrenzung bestand darin, sicherzustellen, dass die alltäglichen Seiten der Website auch bei hoher Auslastung weiter navigiert werden können, während der aktualisierte Inhalt eingeschränkt wird.
Aber das Hauptproblem, das wir jetzt sehen, ist, dass selbst nachdem die Fehler im Update-Code (hoffentlich) ausgebügelt worden sind, wir nicht wirklich ein gutes Gleichgewicht bei der Ratenbegrenzung finden können. Alles, was wir festgelegt haben, scheint in den Zugriffsprotokollen immer dann eine Anzahl von 503 Fehlern zu erzeugen, wenn ein neuer Inhalt zur Seite hinzugefügt wird (und von unseren Benutzern auf einmal abgerufen wird)
Wir betrachten hier verschiedene Lösungen im Hinblick auf das Caching, aber idealerweise möchten wir immer noch durch eine Art von Ratenbegrenzung geschützt werden, die die Benutzer im täglichen Betrieb nicht beeinträchtigt.
Welche Dokumente lesen Sie? Ссылка ist ziemlich klar in Bezug auf die Verwendung und Syntax der Direktiven.
Betreffend limit_req_zone
:
limit_req_zone
ist auf http beschränkt und somit global. Betreffend limit_req
:
burst
-Anzahl von Anfragen sendet, wird der Server einfach alle Anfragen fallen lassen (anstatt zu verlangsamen). Man könnte dies verwenden, um DoS-Attacken oder API-Missbrauch abzuwehren. nodelay
entfernt die Verzögerung für die Verarbeitung von Anforderungen über den burst
-Wert. Wenn Sie keine Verarbeitung für Clients mit eingeschränkter Rate durchführen möchten, setzen Sie burst
auf 0 und verwenden Sie nodelay
. Das Warten / Verzögern für Clients mit eingeschränkter Rate hängt von dem durch limit_req_zone
angegebenen Ratenlimit ab. Tags und Links nginx ruby-on-rails passenger