#私藏项目实操分享# Ngnix --day09
Posted qq5e3a878504161
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#私藏项目实操分享# Ngnix --day09相关的知识,希望对你有一定的参考价值。
nginx --day09
Nginx基于$user_agent的访问控制
user_agent大家并不陌生,可以简单理解成浏览器标识,包括一些蜘蛛爬虫都可以通过user_agent来辨识。
通过观察访问日志,可以发现一些搜索引擎的蜘蛛对网站访问特别频繁,它们并不友好。
为了减少服务器的压力,其实可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬虫全部封掉。
另外,一些cc攻击,我们也可以通过观察它们的user_agent找到规律。
示例
if ($user_agent ~ YisouSpider|MJ12bot/v1.4.2|YoudaoBot|Tomato)
return 403;
说明:user_agent包含以上关键词的请求,全部返回403状态码。
测试:
- curl -A "123YisouSpider1.0"
- curl -A "MJ12bot/v1.4.1"
Nginx基于$http_referer的访问控制
在前面讲解rewrite时,曾经用过该变量,当时实现了防盗链功能。
其实基于该变量,我们也可以做一些特殊的需求。
示例
背景:网站被黑挂马,搜索引擎收录的网页是有问题的,当通过搜索引擎点击到网站时,却显示一个博彩网站。
由于查找木马需要时间,不能马上解决,为了不影响用户体验,可以针对此类请求做一个特殊操作。
比如,可以把从百度访问的链接直接返回404状态码,或者返回一段html代码。
if ($http_referer ~ baidu.com)
return 404;
或者
if ($http_referer ~ baidu.com)
return 200 "<html><script>window.location.href=//$host$request_uri;</script></html>";
[root@amingLiunx vhost]# !v
vi www.2.com.conf
server
listen 80;
server_name www.2.com ;
root /data/wwwroot/www.2.com;
access_log /tmp/2.log ;
if ($http_referer ~ baidu.com)
return 405;
[root@amingLiunx vhost]# curl -x127.0.0.1:80 -e "http://www.sougou.com/asdfghj" www.2.com/data/asdfghjk
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.14.0</center>
</body>
</html>
[root@amingLiunx vhost]# curl -x127.0.0.1:80 -e "http://www,baidu.com/asdfghj" www.2.com/ -I
HTTP/1.1 405 Not Allowed
Server: nginx/1.14.0
Date: Tue, 24 Dec 2019 13:28:34 GMT
Content-Type: text/html
Content-Length: 173
Connection: keep-alive
Nginx的限速
可以通过ngx_http_limit_conn_module和ngx_http_limit_req_module模块来实现限速的功能。
ngx_http_limit_conn_module
该模块主要限制下载速度。
- 并发限制
配置示例
http
...
limit_conn_zone $binary_remote_addr zone=aming:10m;
...
server
...
limit_conn aming 10;
...
说明:首先用limit_conn_zone定义了一个内存区块索引aming,大小为10m,它以$binary_remote_addr作为key。
该配置只能在http里面配置,不支持在server里配置。
limit_conn 定义针对aming这个zone,并发连接为10个。在这需要注意一下,这个10指的是单个IP的并发最多为10个。
[root@amingLiunx vhost]# awk NR>17&&NR<25 print /usr/local/nginx/conf/nginx.conf
include mime.types;
default_type application/octet-stream;
limit_conn_zone $binary_remote_addr zone=aming:10m; ||nginx配置文件里写入限速,返回状态,记录日志
limit_conn_status 503;
limit_conn_log_level error;
#limit_req_zone $binary_remote_addr zone=aming1:10m rate=2r/s;
[root@amingLiunx vhost]# vi www.2.com.conf
server
listen 80;
server_name www.2.com ;
root /data/wwwroot/www.2.com;
access_log /tmp/2.log ;
location /
limit_conn aming 2; ||并发设置为2
#limit_rate 100k;
#limit_req zone=aming1 burst=10;
[root@amingLiunx vhost]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 www.2.com
[root@amingLiunx vhost]# ls /data/wwwroot/www.2.com/
123.tar.gz index.html
[root@amingLiunx vhost]# du -sh /data/wwwroot/www.2.com/123.tar.gz
5.3M /data/wwwroot/www.2.com/123.tar.gz
[root@amingLiunx vhost]# ab -n 5 -c 5 http://www.2.com/123.tar.gz
[root@amingLiunx vhost]# tail -5 /tmp/2.log ||除第一次连接成功外,只允许了IP两次访问,改为其他数不举例了
127.0.0.1 - - [24/Dec/2019:22:18:30 +0800] "GET /123.tar.gz HTTP/1.0" 200 5536616 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:18:30 +0800] "GET /123.tar.gz HTTP/1.0" 503 213 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:18:30 +0800] "GET /123.tar.gz HTTP/1.0" 503 213 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:18:30 +0800] "GET /123.tar.gz HTTP/1.0" 200 5536616 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:18:30 +0800] "GET /123.tar.gz HTTP/1.0" 200 5536616 "-" "ApacheBench/2.3"
- 速度限制
location ~ /download/
...
limit_rate_after 512k; ||网卡的流量
limit_rate 150k;
...
说明:limit_rate_after定义当一个文件下载到指定大小(本例中为512k)之后开始限速;
limit_rate 定义下载速度为150k/s。
注意:这两个参数针对每个请求限速。
[root@amingLiunx vhost]# vi www.2.com.conf
server
listen 80;
server_name www.2.com ;
root /data/wwwroot/www.2.com;
access_log /tmp/2.log ;
location /
#limit_conn aming 2;
limit_rate 10k; ||server里可以配置,location里也可以配置
#limit_req zone=aming1 burst=10;
hosts
ngx_http_limit_req_module
该模块主要用来限制请求数。 ||跟上面的conn的区别是:conn是三次握手阶段的连接,而一旦连接,可能会有多次请求,req模块就是限制这一块
- limit_req_zone
语法: limit_req_zone $variable zone=name:size rate=rate;
默认值: none
配置段: http
设置一块共享内存限制域用来保存键值的状态参数。 特别是保存了当前超出请求的数量。
键的值就是指定的变量(空值不会被计算)。
如limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ||发起请求的频率
说明:区域名称为one,大小为10m,平均处理的请求频率不能超过每秒一次,键值是客户端IP。
使用$binary_remote_addr变量, 可以将每条状态记录的大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录。
如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,
所以如果你需要指定每秒处理少于1个的请求,2秒处理一个请求,可以使用 “30r/m”。
- limit_req
语法: limit_req zone=name [burst=number] [nodelay]; ||burst相当于容器
默认值: —
配置段: http, server, location
设置对应的共享内存限制域和允许被处理的最大请求数阈值。
如果请求的频率超过了限制域配置的值,请求处理会被延迟,所以所有的请求都是以定义的频率被处理的。
超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,
这时,这个请求会被终止,并返回503 (Service Temporarily Unavailable) 错误。
这个阈值的默认值为0。如:
limit_req_zone $binary_remote_addr zone=aming:10m rate=1r/s;
server
location /upload/
limit_req zone=aming burst=5;
限制平均每秒不超过一个请求,同时允许超过频率限制的请求数不多于5个。
如果不希望超过的请求被延迟,可以用nodelay参数,如:
limit_req zone=aming burst=5 nodelay;
示例
http
limit_req_zone $binary_remote_addr zone=aming:10m rate=1r/s;
server
location ^~ /download/
limit_req zone=aming burst=5;
[root@amingLiunx vhost]# awk NR>17&&NR<25 print /usr/local/nginx/conf/nginx.conf
include mime.types;
default_type application/octet-stream;
limit_conn_zone $binary_remote_addr zone=aming:10m;
limit_conn_status 503;
limit_conn_log_level error;
limit_req_zone $binary_remote_addr zone=aming1:10m rate=2r/s;
[root@amingLiunx vhost]# vi www.2.com.conf
server
listen 80;
server_name www.2.com ;
root /data/wwwroot/www.2.com;
access_log /tmp/2.log ;
#location /
#
#limit_conn aming 2;
#limit_rate 1k;
#
limit_req zone=aming1 burst=5; ||nodelay 没有延迟,一般不用,而是把burst放大
[root@amingLiunx vhost]# ab -n 10 -c 10 http://www.2.com/123.tar.gz
[root@amingLiunx vhost]# tail 10 /tmp/2.log
tail: 无法打开"10" 读取数据: 没有那个文件或目录
> /tmp/2.log <
127.0.0.1 - - [24/Dec/2019:22:54:02 +0800] "GET /123.tar.gz HTTP/1.0" 200 5536616 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:54:02 +0800] "GET /123.tar.gz HTTP/1.0" 503 213 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:54:02 +0800] "GET /123.tar.gz HTTP/1.0" 503 213 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:54:02 +0800] "GET /123.tar.gz HTTP/1.0" 503 213 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:54:02 +0800] "GET /123.tar.gz HTTP/1.0" 503 213 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:54:03 +0800] "GET /123.tar.gz HTTP/1.0" 200 5536616 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:54:03 +0800] "GET /123.tar.gz HTTP/1.0" 200 5536616 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:54:04 +0800] "GET /123.tar.gz HTTP/1.0" 200 5536616 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:54:04 +0800] "GET /123.tar.gz HTTP/1.0" 200 5536616 "-" "ApacheBench/2.3"
127.0.0.1 - - [24/Dec/2019:22:54:05 +0800] "GET /123.tar.gz HTTP/1.0" 200 5536616 "-" "ApacheBench/2.3"
设定白名单IP
如果是针对公司内部IP或者lo(127.0.0.1)不进行限速,如何做呢?这就要用到geo模块了。
假如,预把127.0.0.1和192.168.100.0/24网段设置为白名单,需要这样做。
在http 里面增加:
geo $limited
default 1;
127.0.0.1/32 0;
192.168.100.0/24 0;
map $limited $limit
1 $binary_remote_addr;
0 "";
原来的 “limit_req_zone $binary_remote_addr ” 改为“limit_req_zone $limit”
完整示例:
http
geo $limited
default 1;
127.0.0.1/32 0;
192.168.100.0/24 0;
map $limited $limit
1 $binary_remote_addr;
0 "";
limit_req_zone $limit zone=aming:10m rate=1r/s;
server
location ^~ /download/
limit_req zone=aming burst=5;
以上是关于#私藏项目实操分享# Ngnix --day09的主要内容,如果未能解决你的问题,请参考以下文章