为了限制连接的数量,首先,使用limit_conn_zone
指令来定义密钥并设置共享内存区域的参数(工作进程将使用该区域来共享键值的计数器)。作为第一个参数,指定作为关键字计算的表达式。在第二个参数区域中,指定区域的名称及其大小。
limit_conn_zone $binary_remote_addr zone=addr:10m;
其次,使用limit_conn
指令在一个位置、一个虚拟服务器或整个HTTP上下文中应用该限制。将共享内存区域的名称指定为第一个参数,并将每个密钥的允许连接的数量作为第二个参数。
location /download/ {
limit_conn addr 1;
}
[root@server1 download]# pwd
/usr/local/nginx/html/download
[root@server1 download]# ls
iso7.gif
测试:当访问该内容并发数为1时
[root@foundation7 ~]# ab -c 1 -n 10 http://172.25.7.1/download/iso7.gif
[root@server1 logs]# cat access.log
[root@foundation7 ~]# ab -c 10 -n 10 http://172.25.7.1/download/iso7.gif
[root@server1 logs]# cat access.log
为了限制请求率,首先,使limit_req_zone
指令设置密钥和共享内存区域来保持计数器。
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
一旦定义了共享内存区域,在虚拟服务器或位置(或者如果需要的话,在全局上)使用limit_req
指令来限制请求率:
location /download/ {
limit_req zone=one burst=5;
}
限制每个连接的带宽,使用limit_rate
指令:
location /download/ {
limit_rate 50k;
}
测试:在带宽为50K.速率为1r/s的情况下下载文件
nginx.conf的内容如下:
从server1下载,速率受限
## 允许250访问,其他主机都被拒绝
location /admin/ {
allow 172.25.7.250;
deny all;
}
location /admin/ {
deny all;
allow 172.25.7.250;
}
因为当deny在前所有的请求都被拒绝系统读不到下面的一行allow内容
当allow在前deny在后,allow的信息已经被系统读取过了然后才去读取的deny
Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求
location ~ .*\.(gif|jpg|png)$ {
expires 30d;
}
[root@server1 www1]# vim index.html
www.westos.org 你好
server{
listen 80;
server_name www.westos.org westos.org;
charset utf-8;
location / {
root /www1;
index index.html;
}
}
访问静态数据不记录日志:
location ~ .*\.(gif|jpg|png|js|css)$ {
expires 30d;
access_log off;
}
要求:每天的24点备份日至。
首先编写备份日志的脚本:
#!/bin/bash
cd /usr/local/lnmp/nginx/logs && mv access.log access.log_$(date +%F -d -1day)
/usr/local/nginx/sbin/nginx -s reload
加入定时任务中:
[root@server1 opt]# crontab -e
00 00 * * * /opt/nginx_log.sh
执行脚本:
[root@server1 logs]# sh /opt/nginx_log.sh
[root@server1 logs]# ll
total 288
-rw-r--r-- 1 root root 0 Aug 8 14:39 access.log
-rw-r--r-- 1 root root 244683 Aug 8 14:29 access.log_2018-08-07
-rw-r--r-- 1 root root 34562 Aug 8 14:39 error.log
-rw-r--r-- 1 root root 5 Aug 8 08:51 nginx.pid
在做防盗链之前我们先来看看什么时盗链:
盗链是指服务提供商自己不提供服务的内容,自己的网站上向用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
盗链的模拟:
在客户端www.westos.org指向的是server1,172.25.7.1
[root@server2 html]# vim index.html
<html>
<body>
<img src="http://www.westos.org/images/iso7.gif">
body>
html>
测试:http://172.25.7.2/
server2没有此图片通过盗链而让客户端可获取到此图片
防止盗链:
WEB应用防火墙通过实现URL级别的访问控制,对客户端请求进行检测,如果发现图片、文件等资源信息的HTTP请求来自于其它网站,则阻止盗链请求,节省因盗用资源链接而消耗的带宽和性能。
location ~ \.(gif|jpg|png)$ {
root /www1;
valid_referers none blocked www.westos.org;
if ($invalid_referer) {
# return 403;
rewrite ^/ http://bbs.westos.org/daolian.jpg;
}
}
}
server{
listen 80;
server_name bbs.westos.org;
location / {
root /www2;
index index.html;
}
}
当访问1的图片时直接定位至bbs.westos.org防止图片被盗链
再次访问172.25.7.2时:
此图片是我放入bbs的默认发布目录里的