目录
- 一、nginx限制
-
- 1.控制并发数量
- 2.限制请求率
- 3.限制带宽
- 二、nginx配置管理
-
- 1.自动索引
- 2.缓存配置
- 3.日志轮询
- 4.禁用不必要的日志记录
- 三、nginx访问控制
-
- 1.nginx重定向
- 2.80端口重定向到443端口
- 3.www.westos.org/bbs 重定向到bbs.westos.org
- 4.bbs.westos.org重定向到www.westos.org/bbs
- 5.nginx防盗链
一、nginx限制
1.控制并发数量
nginx可以通过limit_conn_zone 和limit_req_zone两个组件对客户端访问目录和文件的访问频率和次数进行限制;
当不做nginx限流时;
首先server1从服务器下载一张大小为444k的图片,用于访问测试
将下载的图片放入download目录
使用ab命令做压力测试,设定总共有10个请求(-n),由10个线(-c)并发来发送请求;
可以看到请求都成功处理
查看server1日志,可以看到http协议响应状态返回值为200,表明该请求被成功地完成,所请求的资源发送到客户端。
修改配置文件:
$binary_remote_addr :表示通过remote_addr这个标识来做限制
zone=addr:10m :表示生成一个大小为10M,名字为addr的内存区域
设定客户端访问/download目录内容时,启用限制并发的模块;
limit_conn addr 1; 限制并发数为1
再次进行压力测试,因为只能处理一个并发,所以会有失败
查看server1日志,可以看到http协议响应状态返回值只有一个为200,503表示无法获得服务。
当限制并发数为5时
再次进行压力测试
只有一半的请求被成功处理
2.限制请求率
继续修改配置文件,设定 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
$binary_remote_addr 表示保存客户端IP地址的二进制形式;
rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次请求;
limit_req的参数,zone=one 表示这个参数对应的全局设置就是one的那个内存区域
可以看到,客户端只有一个请求能被处理
显然这样并不合适,请求仅限于符合limit_req_zone 指令中定义的速率。如果请求数量超过指定的速率并且共享内存区域已满,NGINX 将响应错误。由于流量往往是突发的,因此在流量突发期间返回错误以响应客户端请求并不是最好的情况。
将 limit_req 指令的burst参数设置等待以指定速率处理的最大请求数,超出zone限制的请求会被放入数目为5的队列中
虽然超过了所设置的只允许一秒一个请求,但可以被放入队列中,一秒处理一个,最后用了9秒处理完客户端的请求
nodelay表示不限制单个请求间的时间;
burst=5 nodelay:表示这5个请求立马处理,不能延迟,相当于特事特办。不过,即使这5个突发请求立马处理结束,后续来了请求也不会立马处理
可以看到依然有失败的请求
3.限制带宽
由于图片的大小为444k,因为限制的速度为50k,所以一张图片请求大概需要8s,那么5次请求大概需要40秒左右
压力测试
设定并发数为5,则可以8s处理完成
查看日志
二、nginx配置管理
1.自动索引
客户端如果直接访问server1的nginx默认发布目录里的download目录,会报错
路径完整才可以成功访问到图片
编辑主配置文件
autoindex on:为download目录加入自动索引功能
实现了download目录下的文件的自动索引
2.缓存配置
Nginx expire缓存配置: 缓存可以降低网站带宽,加速用户访问,缓存365天;
html表示默认发布目录
返回码200,表示成功,;
expires显示到明年9.5到期
3.日志轮询
nginx的日志存放目录如下
写一个shell脚本,脚本内容表示: 进入到nginx的日志目录,修改access.log名字为access_$(date +%F -d -1day).log;
kill -USR1 :重新生成新的日志文件
可以看到date +%F -d -1day代表前一天的意思;
执行脚本,查看效果
可以看到产生了新日志
4.禁用不必要的日志记录
这样可以节省磁盘IO的消耗,设定访问图片等文件时,不记录日志,节省磁盘空间;
启用nginx status配置,设定只允许本机(server1)访问
可以看到客户端无法访问server1的status(监控)
Active connections – 活跃的连接数量;
server accepts handled requests — 总共处理了的连接数 , 成功创建的握手数, 总共处理的请求数;
reading — 读取客户端的连接数;
writing — 响应数据到客户端的数量;
waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接
三、nginx访问控制
1.nginx重定向
防止域名恶意解析到服务器IP,设定当访问localhost时,显示500错误
设定成功后,客户端测试访问失败
设定客户端访问server1时,会重定向到www.westos.org
HTTP状态的码301: 301 代表永久性转移(Permanently Moved)
网页测试
重定向到www.westos.org(同时实现负载均衡)
设定中文乱码:
将nginx的默认发布页面写入中文内容
打开默认的字符编码koi8-r
网页测试时,记得清缓存
此时当访问server1(80端口)时,会看到乱码内容
当设定字符编码为 charset utf-8:表示当前文档的字符集是采用utf-8的字符,也就是我们常说英文字符集
清除缓存后再次访问server1
![请添加图片描述](https://img-blog.csdnimg.cn/4dfe54288fe043a3a6de9c9f00e9f560.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aWL5paX55qE5bCP54y0,size_20,color_
乱码问题得以解决
2.80端口重定向到443端口
修改配置文件,设定需要被加密的网址;
设定证书和密钥都为cert.pem,
加入重定向
注释掉负载均衡
在以下目录生成指定证书和密钥
将证书和key文件移动到nginx的配置文件目录
刷新服务
查看443端口已经打开
访问测试:发现成功对地址进行了加密
网页测试
出现乱码的原因是没有在全局设定中加入: charset utf-8(设定字符编码)
加入之后
在网页访问前清除缓存
可以看到没有乱码的出现
3.www.westos.org/bbs 重定向到bbs.westos.org
设定基于域名的虚拟主机部分:
server_name bbs.westos.org; 域名
root /bbs; 站点根目录,即网站程序放的目录
location / { 默认访问的location标签段
index index.html; 首页
}
在 / 下建立bbs目录;
给index.html文件写入内容
真机加入域名解析
测试访问成功,当客户端访问该域名时,会访问到/bbs目录下的index.html文件的内容(此时可以打开负载均衡模块)
加入重定向:当客户端访问www.westos.org/bbs时,重定向到bbs.westos.org
刷新服务后,访问测试,可以看到重定向成功
网页测试
但是如果相要直接访问index.html文件的内容就会出错
继续编辑配置文件,再加入一条重定向
测试重定向成功
4.bbs.westos.org重定向到www.westos.org/bbs
设定网页根目录位于 /bbs;
站点根目录位于 html下的bbs;
加入重定向策略
测试发现重定向成功
第二种方式:将/bbs目录的内容,复制到nginx的html目录
注释掉以下内容
加入以下设定
测试发现重定向成功
网页测试
5.nginx防盗链
在server2的nginx默认发布目录创建一个盗链文件
测试访问,显示盗链成功
在server1设置防盗链;
原始站点访问的是www.westos.org时,不做禁止
此时客户端只能通过访问www.westos.org来获取指定图片
server2盗链失败
加入重定向,设定当盗链时会返回一张盗链图片
server1获取盗链图片
此时server2访问原本的盗链文件时会显示盗链