limit_req 针对页面访问频率限流,掺杂 js css img 等其他请求时的处理

前段时间服务器带宽一下飙升 10m,导致带宽占满,影响了网站的访问,经查看日志发现有 ip 频繁访问页面资源,于是利用了 nginx 的 limit_req 限制单 ip 的访问频率。

limit_req 设置为多少的问题

页面中的 js\css\image 静态资源,往往这些请求也计算在请求频率中,很多告诉你尽多的估算这一页的请求数,这并不科学,其一,估算未必准确,因并不一定清楚每个页面的请求数;其二,对于恶意请求来说,它并不是真实的访问页面而是只访问你的页面地址,如果页面的所有请求是 20 个,但对于它来说可以访问 20 次页面。

所以,应该对资源及路径应用不同的限流规则,将静态资源排除在外。

# 上下文 http
limit_req_zone $binary_remote_addr zone=req_www_perip:10m rate=6r/s;

此时我定义了 www 页面的限流规则,每秒6次。

server {
    listen 80 default;
    server_name www.abcd123.com;
    root /www/host/www;

    # 内部重定向 location
    location @default {

    }
    # 应用限流
    location / {
        limit_req zone=req_www_perip;
        try_files $uri @default;
    }
    # 静态资源
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|ico)$ {
        try_files $uri @default;
    }
    # 针对路径
    location /admin {
       try_files $uri @default;
    }
}

以上配置,静态资源和指定路径的请求数并不应用限流策略,limit_req 的值代表了访问页面的次数。

多域名混杂的页面要单独设置限流规则

如果当前域名有其他域名的请求,若都应用一个限流规则,那么多域名的请求也会累计。
比如 a.abc123.com 页面包含了 b.abc123.com 的请求,那么访问次数是两者请求之和。
所以应该为两个域名应用不同的规则

limit_req_zone $binary_remote_addr zone=req_a_perip:10m rate=6r/s;
limit_req_zone $binary_remote_addr zone=req_b_perip:10m rate=6r/s;
server {
    server_name a.abc123.com
    ..
    location / {
        limit_req zone=req_a_perip;
    }
}
server {
    server_name b.abc123.com
    ..
    location / {
        limit_req zone=req_b_perip;
    }
}

对爬虫的影响

如果设置的过小,可能会影响爬虫,对爬虫区分以应用宽松的限流策略,看系列文章 nginx/openresty 之 access_by_lua 识别搜索引擎蜘蛛 在 nginx 的 access 进入时进行识别。

本作品采用《CC 协议》,转载必须注明作者和本文链接
welcome come back
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
79
粉丝
21
喜欢
129
收藏
306
排名:359
访问:2.5 万
私信
所有博文
社区赞助商