cloudflare + nginx com limit_req e limit_conn

1

Por questão de simplicidade, digamos que eu tenha um servidor web rodando nginx servindo um único arquivo php (com uma mensagem "hello world") via php5-fpm.

Digamos que o servidor esteja por trás do cloudflare e que todas as solicitações ao meu servidor sejam recebidas por meio do cloudflare.

Sob quase a configuração padrão, todos os IPs relatados pelo nginx são ip do cloudflare, portanto usamos o realip_module e seguimos este link para definir o IP real do cloudflare.

Meu próximo passo é limitar as conexões e solicitações para este arquivo php para 1 requisição por segundo, por ip de usuário (mas permitir solicitações ilimitadas do próprio cloudflare).

De acordo com esta resposta , é seguro usar o $binary_remote_addr para impor limites, porque depois de usar o realip_module, o nginx irá reescrever o ip para qualquer ip que tenha sido fornecido no cabeçalho CF-Connecting-IP .

Então, eu começo essa configuração:

limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=1r/s;
limit_conn conn_limit_per_ip 1;
limit_req zone=req_limit_per_ip burst=1 nodelay;

Significa que eu permito apenas 1 conexão http e 1 req / seg, com 1 pedido extra dentro desse segundo permitido (estou me sentindo generoso aqui).

Eu sei que $binary_remote_addr inclui o ip do usuário conforme relatado pelo cloudflare, mas as conexões e solicitações ainda estão chegando ao servidor via cloudflare (portanto, eu não posso usar o iptables para isso).

Meu entendimento de limit_conn e limit_req é que ele mostrará uma página de status 503 para qualquer usuário que exceda esses limites.

Caso 1:

Para simplificar, digamos que 300 usuários na mesma região e usando o mesmo ponto de presença do cloudflare acessem o site no mesmo segundo.

Como o cloudflare relata diferentes endereços IP para todos e todos fazem uma única solicitação, ninguém verá que 503 páginas de status e 300 solicitações serão permitidas via cloudflare.

Caso 2:

Digamos que 3 pessoas acessem minha página dentro desse segundo. Desses, 2 usuários fizeram 1 solicitação única enquanto o terceiro usuário está usando ab (benchmark do apache) para fazer 10 solicitações simultâneas.

Como o cloudflare relata diferentes endereços IP para todos, posso presumir que os 2 primeiros usuários verão minha página sem problemas, enquanto a 3ª pessoa solicitará duas vezes minha página com sucesso (porque estou usando burst + nodelay) e depois obterá um 503 página de status para o restante das solicitações nesse segundo. No segundo seguinte, ele repetirá o mesmo, limitando efetivamente suas solicitações a 2 req / seg.

Preocupações:

Como todas essas 503 solicitações ainda estão sendo veiculadas via cloudflare, outros usuários começarão a ver as mensagens do cloudflare dizendo que a origem não está disponível (clique aqui para tentar novamente um botão de versão ao vivo), porque as solicitações anteriores falharam?

Se o servidor estiver inoperante (sem rede), as mensagens do cloudflare serão exibidas para todos e levará alguns segundos para desaparecer, mesmo quando o servidor estiver ativo novamente.

Serão exibidas as mensagens "servidor off-line" do cloudflare para os usuários quando meu nginx começar a responder com o erro 503 a esse usuário ruim em particular?

    
por peixotorms 13.03.2016 / 03:09

1 resposta

0

HTML (que é a saída do PHP) é não armazenados em cache por padrão , para que eles vejam a resposta à sua própria solicitação, a menos que você esteja armazenando em cache no nginx. Para ter certeza, configure uma regra de página que especifique "caching padrão", ou se você quiser ser paranóico, você pode configurá-la para não armazenar em cache - mas você precisa ter cuidado com o padrão correspondente, caso contrário o CSS / JS não é armazenado em cache .

Eu não acredito que o 503 será mostrado para outros usuários. Você pode pedir o apoio deles - eles são razoavelmente receptivos até mesmo nos planos gratuitos.

    
por 13.03.2016 / 03:45