目录
一、nginx的限流
1.限制并发连接数
2.限制每秒的请求数
3.设置排队(超过指定数量则排队访问)
4.设置无延迟(只能访问一次)
5.限制带宽
二、nginx的配置管理
1.自动索引
2.expire 缓存设置
3.日志轮询
4.禁用不必要的日志记录
5.限制ip访问
6.中文乱码
三、nginx的重定向
1.防止恶意解析
2.端口重定向
3.虚拟主机重定向
四、盗链与防盗链
1.盗链:
2.防盗链:
一、nginx的限流
NGINX限流使用漏桶算法(leaky bucket algorithm),该算法广泛应用于通信和基于包交换计算机网络中,用来处理当带宽被限制时的突发情况。和一个从上面进水,从下面漏水的桶的原理很相似;如果进水的速率大于漏水的速率,这个桶就会发生溢出。
server1的nginx默认发目录下的download/有一个文件,我们以它来测试。
正常情况下在客户端进行压力测试,请求全部接受:
ab -c10 -n 20 http://172.25.0.1/download/test.jsp ##并发数为10,请求总数为20
1.限制并发连接数
在server1的主配置文件里设置并发数为1
vim /usr/local/nginx/conf/nginx.conf
limit_conn_zone $binary_remote_addr zone=addr:10m; ##可以在http的全局写,也可以在某个server的模块里写
server {
listen 80;
server_name localhost;
location /download/ {
limit_conn addr 1; ##限制并发数为1
}
nginx -s reload
?
压力测试有一个请求被拒绝:
2.限制每秒的请求数
在server1的主配置文件里设置每秒只能请求一次
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req zone=one;
?
在客户端中进行压力测试,因为每秒只能请求一次,所以9次被拒绝:
3.设置排队(超过指定数量则排队访问)
在server1中设置一次访问5个
limit_req zone=one burst=5;
?
因为设置了每秒通过一个请求,所以10个请求需要访问2次,共计10秒:
4.设置无延迟(只能访问一次)
在server1中设置无延迟
limit_req zone=one burst=5 nodelay;
因为设置了排队一次访问5个,10个请求应该访问两次,但设置了无延迟,所以会有半数被拒绝
5.限制带宽
有时从某些网站下载东西会很慢,其实就是被限制了带宽所导致。
在server1中限制带宽为50k
limit_rate 1k;
test.jsp大小为584k,请求2次,限制带宽为50k,则大致需要22秒:
二、nginx的配置管理
1.自动索引
用浏览器访问某个目录时,会自动列出目录的内容,方便查询
location /download/ {
limit_conn addr 1;
#limit_req zone=one burst=5 nodelay;
#limit_rate 50k;
autoindex.on;
}
?
测试效果:
2.expire 缓存设置
这样做可以降低网站带宽,加速用户访问。
编辑主配置文件,设定对图片等进行缓存,缓存365天
server {
listen 80;
server_name localhost;
location /download/ {
limit_conn addr 1;
#limit_req zone=one burst=5 nodelay;
#limit_rate 50k;
autoindex on;
}
location ~ .*\.(gif|jpg|png)$ { ##对图片进行缓存
expires 365d;
root html;
}
.....
测试效果:
3.日志轮询
编写一个脚本,并设置定时任务,实现日志的分割与保存
cd /opt
vim nginxlog.sh
#!/bin/bash
cd /usr/local/nginx/logs && mv access.log access_$(date +%F -d -1day).log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
chmod +x nginxlog.sh
crontab -e
00 00 * * * sh /opt/nginxlog.sh &> /dev/null ##每天24:00 执行
chmod -R 700 /usr/local/nginx/logs ##为了安全,日志目录只有超级用户有访问权限
?
4.禁用不必要的日志记录
设置使用浏览器访问server1的某个目录时,不会产生日志
server {
listen 80;
server_name localhost;
location /download/ {
limit_conn addr 1;
#limit_req zone=one burst=5 nodelay;
#limit_rate 50k;
autoindex on;
}
location ~ .*\.(gif|jpg|png)$ {
expires 365d;
root html;
}
location /status { ##访问该目录不被计入日志
stub_status on;
access_log off;
}
在客户端用浏览器测试:用浏览器访问不会产生日志,使用curl 172.25.0.1/status 访问会产生日志
5.限制ip访问
对于server1的某个目录,限制哪些ip可以访问,哪些ip不可
location /status {
stub_status on;
access_log off;
allow 172.25.0.1; ##172.25.0.1可以访问
deny all; ##其他ip不可
}
?
测试效果:
172.25.0.250访问,403拒绝
172.25.0.1访问成功
?
6.中文乱码
nginx默认是不支持中文的。文件有中文时,用浏览器访问会乱码
在主配置文件内设置支持中文即可
server {
listen 80;
server_name localhost;
charset utf-8;
.........
?
测试效果,清除浏览器缓存再次访问,中文正常显示:
?
三、nginx的重定向
1.防止恶意解析
(1)500拒绝访问
编辑server1的主配置文件。设置访问server1时,反馈500报错
server {
listen 80;
server_name localhost;
return 500; ##返回报错500
.........
?
?测试效果,访问172.25.0.1反馈500报错:
(2)将所有访问重定向到其他域名
编辑server1的主配置文件。设置所有访问都被重定向到www.westos.com
server {
listen 80;
server_name localhost;
rewrite ^(.*) http://www.westos.com permanent;
.......
测试效果,请求被重定向到www.westos.com:
2.端口重定向
编辑server1的主配置文件,将80端口定向到443端口
server {
listen 80;
server_name www.westos.com;
rewrite ^/(.*)$ https://www.westos.com/$1 permanent;
#location / {
#proxy_pass http://westos;
#}
}
server {
listen 443 ssl;
server_name www.westos.com;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
生成https加密证书,并移动到conf/目录下
cd /etc/pki/tls/certs/
make cert.pem ##生成加密证书,需要设置一些证书信息
mv cert.pem /usr/local/nginx/conf/ ##移动到配置文件目录下
nginx -t
nginx -s reload
测试效果。用浏览器访问www.westos.com,出现https加密认证,说明定向到了443端口:
3.虚拟主机重定向
(1)将www.westos.com 定向到 bbs.westos.com
server {
listen 80;
server_name www.westos.com;
#rewrite ^/(.*)$ https://www.westos.com/$1 permanent;
rewrite ^/(.*)$ http://bbs.westos.com/$1 permanent;
#location / {
#proxy_pass http://westos;
#}
}
server {
listen 80;
server_name bbs.westos.com;
location / {
root /bbs;
index index.html;
}
}
用客户端测试:
?(2)将bbs.westos.com 定向到 www.westos.com
server {
listen 80;
server_name www.westos.com;
#rewrite ^/(.*)$ https://www.westos.com/$1 permanent;
#rewrite ^/(.*)$ http://bbs.westos.com/$1 permanent;
if ($host = "bbs.westos.com") {
rewrite ^/(.*)$ http://www.westos.com/bbs/$1 permanent;
}
#location / {
#proxy_pass http://westos;
#}
}
#server {
# listen 80;
# server_name bbs.westos.com;
#
# location / {
# root /bbs;
# index index.html;
# }
# }
在客户端写本地解析,然后测试:
四、盗链与防盗链
1.盗链:
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
我们先模拟一下盗链
server2是盗链机,server1是被盗链主机。
现在server1上有一张图
server2盗链这张图。编写本地解析,编写发文件进行盗链
vim /etc/hosts
172.25.0.1 www.westos.com
vim /usr/local/nginx/html/index.html
<html>
<body>
<br>盗链</br>
<img src="http://www.westos.com/download/redhat.png">
</body>
</html>
nginx -s reload
盗到了server1主机上的资源? :
2.防盗链:
WEB应用防火墙通过实现URL级别的访问控制,对客户端请求进行检测。如果发现图片、文件等资源信息的HTTP请求来自于其它网站,则阻止盗链请求,节省因盗用资源链接而消耗的带宽和性能。
以免被盗链,我们对server1主机部署防盗链。编辑主配置文件
server {
listen 80;
server_name www.westos.com;
#rewrite ^/(.*)$ https://www.westos.com/$1 permanent;
#rewrite ^/(.*)$ http://bbs.westos.com/$1 permanent;
#if ($host = "bbs.westos.com") {
# rewrite ^/(.*)$ http://www.westos.com/bbs/$1 permanent;
#}
location ~ \.(jpg|png)$ {
valid_referers none blocked www.westos.com;
if ($invalid_referer) {
return 403;
#rewrite ^/ http://www.westos.com/fandaolian.jpg;
}
}
location / {
root html;
index index.html;
}
}
此时,server2再进行盗链时,则会失败:
我们也可以给盗链主机重定向一张图
location ~ \.(jpg|png)$ {
valid_referers none blocked www.westos.com;
if ($invalid_referer) {
#return 403;
rewrite ^/ http://www.westos.com/fandaolian.jpg;
}
}
此时server2再进行盗链
|