Nginx limit_req está eliminando todos os pedidos

1

Eu tenho um site em execução em node.js e expresso servidor da web. Eu estou usando o nginx para executar o site no domínio e também usar certificados ssl. Eu procurei no google para saber como proteger o servidor de ataques de ddos usando nginx e descobri que eu deveria usar o atributo limit_req no meu arquivo conf nginx. mas quando eu uso isso e eu abro o site todos os outros pedidos estão falhando, quero dizer eu abrir o site e todos os links externos estão falhando como css, js e arquivos de imagem, e no meu console eu vejo muito deste erro:

Failed to load resource: the server responded with a status of 503 (Service Temporarily Unavailable)

Eu sei qual é o problema, estou limitando as solicitações do usuário a 10req / se todos os links externos e arquivos estão contando como uma solicitação e depois que 10 é atingido, todas as outras solicitações estão falhando, mas não sei como lidar com isso, eu não sei se eu deveria lidar com isso do meu código expresso ou de nginx conf.

Eu sei que devo fazer todo pedido de site contar uma vez, mas não sei como.

esta é minha configuração nginx:

    # HTTP - redirect all requests to HTTPS
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    server {
            #listen 80 default_server;
            #listen [::]:80 default_server ipv6only=on;
            server_name www.example.com domain.com;
            return 301 https://example.com$request_uri;
    }
    map $sent_http_content_type $cacheable_types {
        ~image/  "max-age=864000";
        default       "";
    }
    server {
            listen 443;
            server_name www.examle.com;
            ssl on;
            # Use certificate and key provided by Let's Encrypt:
            ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
            ssl_session_timeout 5m;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_prefer_server_ciphers on;
            ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
 location /{
          return 301 https://example.com$request_uri;
      }
server {
        listen 443;
        server_name example.com;
        ssl on;
        # Use certificate and key provided by Let's Encrypt:
        ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
      location /{
          limit_req zone=one;
          proxy_pass http://localhost:2000/;
      }
}
    
por m7majidi 28.05.2017 / 20:49

1 resposta

2

Você está limitando tudo sendo intermediado por proxy para 10r / s. Se você quiser limitar apenas as páginas, você pode definir outro local para os recursos css / js e não colocar um limite neles.

server {
  listen 443;

  location ~*  \.(jpg|jpeg|png|gif|css|js|ico)$ {
    limit_req zone=one;
    proxy_pass http://localhost:2000/;
  }

  location / {
    proxy_pass http://localhost:2000/;
  }
}

No entanto, você provavelmente não deveria se preocupar com isso. Um DDOS sobrecarregará seu servidor Nginx, deixando tudo offline de qualquer maneira.

Uma abordagem melhor, se você realmente precisa da proteção do DDOS, é usar um CDN como o CloudFlare ou o CloudFront na frente do seu site. Verifique se o seu IP não é conhecido, o que pode vazar de outros registros DNS. O CloudFront (AWS) tem muita proteção contra DDOS embutida. Os planos pagos do CloudFlare ficarão na frente de um DDOS, independentemente do tamanho. O CloudFlare free vai tentar, mas vai desistir se ficar muito grande.

    
por 28.05.2017 / 21:15