关于Laravel 与 Nginx 限流策略防止恶意请求

更新日期: 2020-03-02阅读: 1.7k标签: Laravel

一、问题背景

最近公司最近的几台线上服务器经常出现CPU覆盖过高,影响部分应用响应超时,产生了大量的短信和邮件报警,经过排查数据库日志和access.log,发现是api接口被刷,被恶意疯狂请求,最大一次大概120次/s。

之前没有过太多这方面经验,处理起来不是很顺畅,这次的问题刚好提了醒,经过这次的问题暴露,来记录一下解决方案和策略。

线上的部署方案是:nginx + laravel。

首先我们尝试从nginx层面入手,将占用更少的内存消耗,无需再转发到php-fpm上处理。


二、(恶意)请求特征

想好很好的特征,就必须捕捉一定的特征,通过这个特征来有效的控制到恶意请求。

  1. 短时间内,IP对某接口产生大量请求
  2. user_agent,非正常信息或为空
  3. 请求量比平时要高涨很多。


三、限流策略(nginx)

限制请求数

首先的话.就是控制单IP时间上的请求次数和IP连接数,配置如下:

http {
    limit_req_zone $binary_remote_addr zone=one:1m rate=1r/s;

    server {
        location /api/ {
            limit_req zone=one burst=5;
        }
    }
}

limit_req_zone主要控制单个IP的请求速率,使用漏桶算法来完成限制,limit_req_zone size,主要用于储存统计IP的请求信息,1M可以储存16000个IP,当每秒的请求超过了16000个的时候,其余访问都会被访问503 服务暂不可用。

上面的模板设置了,每秒最大不超过1个请求,最大延迟请求不超过5个。

如果我们的服务器每次接口的响应时间是在200ms-300ms,那我们对应的每秒的限制就应该设置成 1000ms / 接口响应耗时。

限制并发连接数

限制完用户请求频率后,如果仍然还是存在很大的恶意请求,我们还可以进行并发数的限制。

http {
    limit_conn_zone $binary_remote_addr zone=one:1m;

    server {
        location /api/ {
           limit_conn one 10;
        }
    }
}

limit_conn_zone:主要是用于控制请求并发数,频率不能太快。

limit_conn_zone size跟limit_req_zone意思一致,可根据需要动态调控,上面的案例中,表示限制每个客户端IP最大并发连接数为10。

设定IP黑名单

当某个IP请求过于频繁或者需要完全杜绝该IP的访问时,可以通过nginx的deny配置来禁止黑名单中的IP访问。

http {
    include blockip.conf; 
}

黑名单配置

deny 195.91.112.66;
deny 192.168.2.100;

被添加黑名单后,再次访问就会出现403禁止访问.

限制UA(user-agent)信息

http {
    server {
        if ($http_user_agent ~* "curl") {
          return 403;
        }
    }
}

上面就禁止了ua信息为curl的客户端,直接返回403。

禁止多个ua,通过|来隔断。

if ($http_user_agent ~* "curl|wget") {
    return 403;
}


(四)、限流策略(laravel)

在我们的laravel项目中,存在一个Throttle中间件,该策略,可以在应用层上面,有效抑制用户可以恶意请求,配置如下:

Route::group(['middleware' => 'throttle:30:1'],function(){
    Route::any('/login', 'LoginController@login');
});

在throttle配置中,第一个参数控制了请求数,第二个参数用于控制请求频率,上面的配置表明,每个客户端IP每分钟最大请求30次 login路由。

当客户端ip超出请求限制后,服务端就会返回429 Too Many Attempts.响应

来自:https://segmentfault.com/a/1190000022812635

链接: https://fly63.com/article/detial/9249

分享 10 个你可能不知道的 Laravel Eloquent 小技巧

Laravel 是一个功能丰富的框架。但是,你无法从官方文档中找到所有可用的功能。以下是一些你可能不知道的功能。获取原始属性:当修改一条 Eloquent 模型记录的时候你可以通过调用

laravel常用路径保存

laravel框架常用目录路径:app_path(),app_path函数返回app目录的绝对路径:$path = app_path();你还可以使用app_path函数为相对于app目录的给定文件生成绝对路径:$path = app_path(\\\'Http/Controllers/Controller.php\\\');

Laravel 框架 Model 对象转 json 字符串丢失更新

Laravel 的 Illuminate\\\\Database\\\\Eloquent\\\\Model 实现了 JsonSerializable 接口,所以在调用 json_encode 进行序列化时,会调用 Model::jsonSerialize 方法,他这个方法返回的数据是:

Laravel 中创建 Zip 压缩文件并提供下载

如果您需要您的用户支持多文件下载的话,最好的办法是创建一个压缩包并提供下载。看下在 Laravel 中的实现。事实上,这不是关于 Laravel 的,而是和 PHP 的关联更

Laravel中9个不经常用的小技巧

更新父表的timestamps:如果你想在更新关联表的同时,更新父表的timestamps,你只需要在关联表的model中添加touches属性。

Laravel中集成PayPal

最近在写一个面向国外买家的一个商城项目,既然面向国外,那就要用到PayPal这个支付平台。因为在对接PayPal的过程中遇到了一些问题,花费了一些时间,所以把对接的过程记下来,也希望能帮助到用到PayPal的朋友。我集成的是paypal/rest-api-sdk-php。

十五个常用的 Laravel 集合(Collection)

Laravel Eloquent 通常返回一个集合作为结果,集合包含很多有用的、功能强大的方法。你可以很方便的对集合进行过滤、修改等操作。本次教程就一起来看一看集合的常用方法及功能。

十个推荐使用的 Laravel 的辅助函数

Laravel 包含各种全局辅助函数。 laravel 中包含大量辅助函数,您可以使用它们来简化开发工作流程。 在这里,我将编写10个最好的 laravel 帮助函数,用于使我的开发更容易。 您必须考虑在必要时使用它们。

Laravel 向公共模板赋值

开发过程中许多时候都会向公共模板赋值,比如顶部导航栏,页面底部等等,不可能在每个控制器中都赋值一遍。Laravel 中解决办法如下:

Composer,laravel下载和更新

有两种方式启用本镜像服务:系统全局配置: 即将配置信息添加到 Composer 的全局配置文件 config.json 中。单个项目配置: 将配置信息添加到某个项目的composer.json 文件中。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!