Precisamos bloquear um grande número de solicitações por endereço IP com nginx. As solicitações são intermediadas por proxy por um CDN e, portanto, não podemos bloquear com o endereço IP do cliente real (seria o endereço IP do CDN, não o cliente real). Então, temos $ http_x_forwarded_for que contém o IP que precisamos bloquear para uma determinada solicitação.
Da mesma forma, não podemos usar tabelas IP, pois o bloqueio do endereço IP do cliente com proxy não terá efeito. Precisamos usar o nginx para bloquear o pedido com base no valor de $ http_x_forwarded_for.
Inicialmente, tentamos várias declarações if simples:
link
No entanto, isso fez com que nosso uso de memória nginx saltasse consideravelmente. Fomos de algum lugar em torno de um tamanho de 40MB para um tamanho de 200MB.
Se mudássemos as coisas e criassemos um regex grande que correspondesse aos endereços IP necessários, o uso de memória era bastante normal:
link
Lembre-se de que estamos tentando bloquear mais de 3 ou 4 endereços IP ... mais de 50 a 100, que podem ser incluídos em vários blocos de configuração do servidor nginx (20+).
Pensamentos? Sugestões?
Estou interessado em saber por que o uso de memória aumentaria muito usando vários blocos se, e também se há maneiras melhores de atingir nosso objetivo.