文章目录
Web服务不停机更新和灰度发布方案
当前情况
Web服务需要改造成使用jwt登陆访问。因此可以使用nginx进行不停机更新。
方案一 负载均衡:
将新版本另起一个端口,nginx中配置负载均衡,并反向代理到新旧两个服务。若新服务功能正常,则可关闭旧版本,只使用新版本。
配置如图:
http {
upstream cluster {
server 192.168.1.210:80 weight=5;
server 192.168.1.211:80 weight=3;
server 192.168.1.212:80 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://cluster;
}
}
}
问题:
怎么判断 新服务功能正常 ?
一个可行的解决方案是 特定的测试人员测试新版本的功能,确认功能无误后,关闭旧版本启用新版本。这就涉及到灰度发布了。
方案二 灰度发布:
使用nginx进行灰度发布。
我们可在nginx上根据请求来源ip或者cookie来判断当前请求是否来自测试人员,若判断为测试人员,则将请求直接导向至新服务。
用IF指令实现
https://www.jianshu.com/p/e89ad8748764
两台服务器分别定义为:
hilinux_01 192.168.1.100:8080
hilinux_02 192.168.1.200:8080
根据来源ip做判断
upstream hilinux_01 {
server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}
upstream hilinux_02 {
server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}
upstream default {
server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}
server {
listen 80;
server_name www.hi-linux.com;
access_log logs/www.hi-linux.com.log main;
set $group default;
if ($remote_addr ~ "211.118.119.11") {
set $group hilinux_02;
}
location / {
proxy_pass http://$group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
}
根据cookie做判断
upstream hilinux_01 {
server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}
upstream hilinux_02 {
server 192.168.1.200:8080 max_fails=1 fail_timeout=60;
}
upstream default {
server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}
server {
listen 80;
server_name www.akhack.com;
access_log logs/www.akhack.com.log main;
#match cookie
set $group "default";
if ($http_cookie ~* "version=V1"){
set $group hilinux_01;
}
if ($http_cookie ~* "version=V2"){
set $group hilinux_02;
}
location / {
proxy_pass http://$group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
}
使用lua写脚本实现
参考: https://my.oschina.net/ososchina/blog/905378
使用nginx+lua实现web项目的灰度发布
location / {
content_by_lua '
myIP = ngx.req.get_headers()["X-Real-IP"]
if myIP == nil then
myIP = ngx.req.get_headers()["x_forwarded_for"]
end
if myIP == nil then
myIP = ngx.var.remote_addr
end
if myIP == "公司出口IP" then
ngx.exec("@client")
else
ngx.exec("@client_test")
end
';
}
location @client{
proxy_next_upstream error timeout;
proxy_redirect off;
proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-IP $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
client_body_buffer_size 256k;
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
proxy_buffer_size 8k;
proxy_buffers 8 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_pass http://client;
}
location @client_test{
proxy_next_upstream error timeout;
proxy_redirect off;
proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-IP $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
client_body_buffer_size 256k;
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
proxy_buffer_size 8k;
proxy_buffers 8 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_pass http://client_test;
}
由于使用了nginx+lua模块,这种方式适合很多场景,非常强大,但是问题是你可能需要学习很多lua的语法。