Nginx limit_req 正在终止所有请求

Nginx limit_req 正在终止所有请求

我有一个在 node.js 和 express web 服务器上运行的网站。我使用 nginx 在域上运行网站并使用 ssl 证书。我在 Google 上搜索如何使用 nginx 保护服务器免受 ddos​​ 攻击,我发现我应该在我的 nginx conf 文件中使用 limit_req 属性。但是当我使用这个并打开网站时,所有其他请求都失败了,我的意思是我打开网站,所有外部链接都失败了,如 css、js 和图像文件,在我的控制台中我看到很多这样的错误:

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

我知道问题是什么,我将用户请求限制为 10req/s,所有外部链接和文件都算作一个请求,达到 10 后所有其他请求都失败,但我不知道如何处理它,我不知道是否应该从我的快速代码或 nginx conf 中处理它。

我知道我应该让所有网站请求都算一次但我不知道该怎么做。

这是我的 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/;
      }
}

答案1

您将代理的所有内容限制为 10r/s。如果您只想限制页面,则可以为 css/js 资源定义另一个位置,而不对它们进行限制。

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/;
  }
}

但是,你可能根本不应该为此烦恼。DDOS 攻击将压垮你的 Nginx 服务器,导致所有服务器都下线。

如果您确实需要 DDOS 保护,更好的方法是在网站前端使用 CloudFlare 或 CloudFront 等 CDN。确保您的 IP 不为人所知,否则可能会从其他 DNS 记录中泄露。CloudFront (AWS) 内置了很多 DDOS 保护。CloudFlare 付费计划将阻止 DDOS,无论大小。CloudFlare 免费计划会尝试一下,但如果规模太大,就会放弃。

相关内容