nginx灰度发布、网站限速和防盗链
一、灰度发布(金丝雀发布)
灰度发布时使用比较平稳的过渡方式升级或者替换产品项目的方法统称
主要作用
- 及时发现项目问题
- 尽早获取用户反馈的信息,以改进产品
- 如果项目产生问题,可以将问题影响控制到最小范围
【1】、基于不同IP进行灰度发布
proxy 代理
web01 开启80端口 开启8001端口
web02 开启80端口 开启8002端口
80端口(老业务)
800x端口(测试业务)
我们要在nginx中创建集群和if判断,将新业务和老业务分开,根据IP去区分,一类IP访问的时候会显示老业务,一类IP访问的时候是新业务1,另一类IP访问的时候是新业务2
# 修改nginx配置文件
# 创建3个集群
upstream s8001{
server 192.168.121.171:8001;
}
upstream s8002{
server 192.168.121.172:8002;
}
# 下面的是老业务
upstream default{
server 192.168.121.171:80;
server 192.168.121.172:80;
}
server {
listen 80;
server_name localhost;
# set 设置变量的含义,让group=default
set $group "default";
# 通过if判断来区分IP,给group赋不同的值
if ($remote_addr ~ "192.168.121.171"){
set $group s8001;
}
if ($remote_addr ~ "192.168.121.172"){
set $group s8002;
}
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# 根据上面if判断,group得到的不同的值,去访问不同的网站
proxy_pass http://$group;
root html;
index index.html index.htm;
}
配置web01
在web01中创建一个虚拟主机,监听8001端口。
server{
listen 8001;
server_name localhost;
root html8001;
index index.html;
}
[root@web01 nginx]# mkdir html8001
[root@web01 nginx]#
[root@web01 nginx]# echo web01-8001 > html8001/index.html
[root@web01 nginx]# echo web01-80 > html/index.html
[root@web01 nginx]# sbin/nginx
配置web02
在web02中创建一个虚拟主机,监听8002端口。
server{
listen 8002;
server_name localhost;
root html8002;
index index.html;
[root@web02 nginx]# mkdir html8002
[root@web02 nginx]# echo web02-8002 > html8002/index.html
[root@web02 nginx]# echo web02-80 > html/index.html
[root@web02 nginx]# sbin/nginx
进行测试
预期结果
当我们使用IP为192.168.121.171去访问proxy时,会看到web01的新业务
当我们使用IP为192.168.121.172去访问proxy时,会看到web02的新业务
当我们使用其他IP去访问proxy时,会以轮询的形式看到web01和web02的老业务
root@proxy[19:30:15]:/usr/local/nginx
$ curl 192.168.121.170
web01-80
root@proxy[19:30:15]:/usr/local/nginx
$ curl 192.168.121.170
web02-80
[root@web01 nginx]# curl 192.168.121.170
web01-8001
[root@web01 nginx]# curl 192.168.121.170
web01-8001
[root@web02 nginx]# curl 192.168.121.170
web02-8002
[root@web02 nginx]# curl 192.168.121.170
web02-8002
【2】、通过用户id测试
对于一个网站来说,它可以有许多的用户去进行登录,但是,每一个用户都有一个对应且唯一的用户ID,我们可以针对用户的ID来进行区分,从而可以进灰度发布
准备一个测试网站
root@proxy[21:41:36]:~
$ ll php-memcached-demo.tar.gz
-rw-r--r--. 1 root root 158156 Jun 24 19:49 php-memcached-demo.tar.gz
root@proxy[21:41:46]:~
$ cp -r php-memcached-demo/* /usr/local/nginx/html/
修改网页源码(home.php)
如果用户名是以abc开头的,则点击开始跳转到192.168.121.171
如果不是则点击开始跳转到192.168.121.172
以此实现灰度发布
Welcome : <?php
if(preg_match("/^abc/",$_SESSION['login_user'] ) ){
echo "<a href='http://192.168.121.171'>开始</a>";
}
else
{
echo "<a href='http://192.168.121.172'>开始</a>";
}
?>
二、网站限速
- 需要共享的文件数量较大较多
- 服务器自身带宽有限
- 频繁遭受黑客攻击
- 业务利益最大化
速度限制
limit_rate 50k; 速度极限就是50k,不管运营商给的带宽是多少。
【1】、全局限速
# 修改nginx的配置文件,在http中写入如下内容,如果不写入server中,则表示全局限速,如果写入某一个server中,则表示只限制某一个虚拟主机
#gzip on;
limit_rate 100k;
server {
listen 80;
server_name localhost;
...
}
# 进行测试网速
[root@web01 nginx]# wget http://192.168.121.171/test.img
--2024-06-24 22:22:28-- http://192.168.121.171/test.img
Connecting to 192.168.121.171:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 104857600 (100M) [application/octet-stream]
Saving to: ‘test.img’
test.img 2%[> ] 2.44M 99.7KB/s eta 16m 38s
【2】、局部限速
有全局没有局部,按照全局算
有全局有局部,按照据不算
limit_rate 0k; 0k表示不限速
limit_rate 100k; # 全局限速
server {
limit_rate 200k; # 虚拟主机局部限速
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /file_a{
limit_rate 300k; # 某一目录限速
}
location /file_b{
limit_rate 0k; # 0k 表示不限速
}
【3】、限速bug-突破限制
在上面我们进行了速度限制,但是存在一个bug。
比方说file_a目录下有两个文件需要下载,我在同时下载这两个文件,每一个的下载速度都在300k左右,但是此时我在你的服务器上的下载总速度是600k左右,相当于变相的突破了我们限制的速度
所以我们还需要继续加限制,让其连接数在同一时刻只能是1
# 修改nginx配置文件
limit_conn_zone $binary_remote_addr zone=addr:10m; # 设置连接限制
#gzip on;
limit_rate 100k;
server {
limit_rate 200k;
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /file_a{
limit_rate 300k;
limit_conn addr 1; # 启用连接限制
}
三、防盗链
一个网站中的链接,连接到了另外一个网站中。这就是盗链,盗取了别的网站的信息,放在了自己的网站上
因此我们需要防盗链的配置,不允许别的网站来通过盗链盗取我的数据
具体实现原理:
通过referers参数来实现,referers是一个请求头,它能够标识你是从哪个地址来访问我这个网站的。我们可以设置,只有从自己的IP和空过来的请求才可以看到我的网页,其他都不许看,返回403
server {
listen 80;
server_name localhost;
valid_referers none 192.168.121.171; # 只有从空和192.168.121.171来的请求才可以访问
if ($invalid_referer){
return 403; # 其它全报403错误
}
charset utf8;