Nginx 防止被恶意压力测试方法

因为网站没有做连接数限制,所以只要有人使用 ab siege 等一些压力测试工具来模拟并发压服务器,服务器就很容易被压垮。

可以参考官方文档的配置方法: http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

cat nginx.conf http {

limit_conn_zone $binary_remote_addr zone=one:10m;

如果在1.1.8之后版本还用语法:limit_zone name $variable size,会报警告
nginx: [warn] the “limit_zone” directive is deprecated, use the “limit_conn_zone” directive

这里,设置客户端的IP地址作为键。注意,这里使用的是$binary_remote_addr变量,而不是$remote_addr变量。$remote_addr变量的长度为7字节到15字节不等,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
而$binary_remote_addr变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。一兆字节的共享内存空间可以保存3.2万个32位的状态,1.6万个64位的状态。如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。

server {
limit_conn one 10; //指定一个会话最大的并发连接数(与之前的limit_conn_zone配合使用),可对单独目录做出限制,一个IP只能发起10个连接,多于10个,一律返回Services unavailable(503)状态,生产环境需考虑办公室或者局域网共享IP问题

limit_rate_after 1m; //设置单连接限速条件(当下载文件字节数超过1MB后, limit_rate限速生效,限速100k)

limit_rate 100k; //单连接限速
… } … }