NGINX - kısma istismarı önlemek istiyor


28

Bunu yapmak istememin nedeni, kullanıcıların API'mizle JavaScript üzerinden gelişmesi ve bazı geliştiricilerin berbat olması ve ziyaretçilerin sunucuyu AJAX istekleriyle çarpmasına neden olmasıdır. Bu gerçekleştiğinde, API isteklerini dakikada belki 50 istek veya bunun gibi bir şey için boğmak istiyorum.

Not: (özellikle DB yoğun kaynaklar, bu nedenle belki sunucu genelinden ziyade yol düzeyinde (ör. "/ Json_api /" kısma ama "/ statik /" değil).

Yanıtlar:


36

Bu, Nginx ile LimitReqModule kullanılarak yapılabilir . Bununla birlikte, bunun ters bir proxy için olması durumunda, HAProxy tarafından desteklenen yeni oran sınırlamasını denemek isteyebilirsiniz .

Nginx oranının sınırlandırılmasını istediğiniz kesin oranı elde etmek için biraz kafa karıştırıcı olarak buldum .

Ama temelde şöyle bir şeyiniz var:

limit_req_zone  $binary_remote_addr  zone=default:10m   rate=50r/m;

içinde httpbölümü ve aşağıdaki gibi daha sonra bir şey locationiçinde bölüm serverbölüm:

limit_req zone=default burst=10 nodelay;

/staticSizin gibi belirli bir bölüme sahip olmamak için onu sadece ayrı yapar locationve limit_reqyönergeyi (veya tersini) içermez .


Teşekkürler. Bu şeylerin ne yaptığını açıklayabilir misiniz (bölge, patlama, düğüm). Bunun zone=limit_req_zoneyerine koymak mı istediniz ?
orokusaki

Dürüst olmak gerekirse, onlara bu kadar iyi açıklayamam, bu yüzden bunun sadece kafa karıştırıcı olduğunu hissediyorum. Michael'ın linkteki açıklamasını yapabileceğim gibi sesler verdim. İkinci sorunuza kadar herhangi bir yazım hatası olduğuna inanmıyorum ... Bağlantılı olduğum modül belgelerinin yardımcı olabilecek bir örneği var.
Kyle Brandt

2
Zgin, burst ve nodelay , Nginx wiki sayfasında , yukarıdaki cevaptan zaten bağlanmış olan hız sınırlama modülü hakkında belgelenmiştir .
Mark Stosberg

Kyle, konum başına hız limitini başka bir tetikleyiciyle birleştirmenin bir yolu olup olmadığını biliyor musun (örneğin, Yetkilendirme-Başlık). Benim durumumda belirli bir kullanıcının oranını düşürmek isteyebilirim.
Nils

1
@Nils AFAICS, $http_authorizationdeğişkeni, anahtarın IP adresi yerine bu kadar üst olduğu yeni bir bölge tanımlamak için limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/skullanabilirsiniz; daha sonra per_userbölgeyi, kullanıcı başına oran sınırlamasını yapmak istediğiniz konum bölümlerinde kullanabilirsiniz . Denenmemiş, sadece belgeleri ve nginx değişkenlerinin listesini okudum ... eğer bunu denersen haberim olsun!
idrarig
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.