NGINX - solicitações de aceleração para evitar abusos

28

A razão pela qual eu quero fazer isso é porque os usuários desenvolvem contra nossa API com JavaScript e alguns desenvolvedores estragam e fazem com que os visitantes batam no servidor com solicitações AJAX. Quando isso acontecer, eu quero poder limitar as solicitações da API para talvez 50 solicitações por minuto ou algo nesse sentido.

Nota: (particularmente recursos intensivos em banco de dados, talvez no nível do caminho, em vez de em todo o servidor (por exemplo, regulador de pressão "/ json_api /", mas não "/ static /").

orokusaki
fonte

Respostas:

36

Isso pode ser feito usando o LimitReqModule com Nginx. No entanto, se for para um proxy reverso, convém experimentar o novo limite de taxa suportado pelo HAProxy .

Achei a limitação da taxa nginx um pouco confusa para obter a taxa exata desejada.

Mas você basicamente tem algo como:

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

na httpseção e, em seguida, algo como o seguinte na locationseção dentro da serverseção:

limit_req zone=default burst=10 nodelay;

Para não tê-lo em uma determinada seção como /staticvocê, basta separá-lo locatione não incluí-lo na limit_reqdiretiva (ou inversa).

Kyle Brandt
fonte
obrigado. Você pode explicar o que essas coisas estão fazendo (zona, explosão, não-dia)? E você quis dizer zone=limit_req_zone, em vez disso?
orokusaki 9/09/10
Honestamente, não posso explicar isso muito bem, e é por isso que sinto que é apenas confuso. A explicação de Michael no link que forneci parece possível. Não acredito que tenha erros de digitação no que diz respeito à sua segunda pergunta ... A documentação do módulo ao qual vinculei tem um exemplo que pode ajudar.
Kyle Brandt
2
zone, burst e nodelay estão documentados na página wiki do Nginx sobre o módulo de limitação de taxa , já vinculado à resposta acima.
Mark Stosberg
Kyle, você sabe se existe uma maneira de combinar o limite de taxa por local com outro gatilho (por exemplo, cabeçalho de autorização). No meu caso, talvez eu queira limitar a taxa de um usuário específico.
Nils
1
@Nils AFAICS você pode usar a $http_authorizationvariável para definir uma nova zona em que a chave é esse cabeçalho, e não o endereço IP, ou seja limit_req_zone $http_authorization zone = per_user : 10m rate = 5r/s, e depois usar a per_userzona nas seções de localização em que deseja limitar a taxa por usuário. Não testado, apenas li a documentação e a lista de variáveis ​​nginx ... entre em contato se você tentar fazer isso!
Idegrig 03/11/19