簡單粗暴使用nginx模擬進行藍綠部署的方式

這篇文章介紹一下藍綠部署以及使用nginx如何最簡單地模擬一下藍綠部署的方式

藍綠部署

藍綠部署的重點在於如下特點

  • 1. 藍色版本和綠色版本同時存在
  • 2. 實際運行的環境為藍或則綠,只能為其中之一,通過開關控制

優點和缺點分析:優點在於它的速度和回滾。而缺點也顯而易見。可以快速回滾是因為有兩套環境同時存在的緣故,所以複雜度和需要的資源會增多,因為其有兩套環境。

另外雖然速度有所提高,但是在實現的過程中,開關的控制,無論多快的切換速度,如果不結合其他的技術,還是無法做到完全無縫切換。

模擬藍綠部署

接下來我們使用nginx的upstream來簡單模擬一下藍綠部署的場景。具體場景如下, 當前活躍的是藍色版本,通過調整nginx設定,將綠色版本設定為當前活躍版本。


簡單粗暴使用nginx模擬進行藍綠部署的方式


事前準備

事前在7001/7002兩個端口分別啟動兩個服務,用於顯示不同信息,為了演示方便,使用tornado做了一個鏡像,通過docker容器啟動時傳遞的參數不同用於顯示服務的不同。

docker run -d -p 7001:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello blue/green service: v1 in 7001"
docker run -d -p 7002:8080 liumiaocn/tornado:latest python /usr/local/bin/daemon.py "Hello blue/green service: v2 in 7002"

啟動nginx

[root@kong ~]# docker run -p 9080:80 --name nginx-blue-green -d nginx
d3b7098c44890c15918dc47616b67e5e0eb0da7a443eac266dbf26d55049216a
[root@kong ~]# docker ps |grep nginx-blue-green
d3b7098c4489 nginx "nginx -g 'daemon ..." 10 seconds ago Up 9 seconds 0.0.0.0:9080->80/tcp nginx-blue-green
[root@kong ~]#

nginx代碼段

準備如下nginx代碼段將其添加到nginx的/etc/nginx/conf.d/default.conf中, 模擬方式很簡單,通過down來表示流量為零(nginx中無法將weight設置為零),開始的時候100%的流量都發到藍色版本。

http {
upstream nginx_blug_green {
server 192.168.163.117:7001 weight=100;
server 192.168.163.117:7002 down;
}

server {
listen 80;
server_name www.liumiao.cn 192.168.163.117;
location / {
proxy_pass http://nginx_blug_green;
}
}

修改default.conf的方法

可以通過在容器中安裝vim達到效果,也可以在本地修改然後通過docker cp傳入,或者直接sed修改都可。如果在容器中安裝vim,使用如下方式即可

[root@kong ~]# docker exec -it nginx-lb sh
# apt-get update
...省略
# apt-get install vim
...省略

修改前

# cat default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP/> #

#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP/> #
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
#

修改後

# cat default.conf
upstream nginx_blug_green {
server 192.168.163.117:7001 weight=100;
server 192.168.163.117:7002 down;
}
server {
listen 80;
server_name www.liumiao.cn 192.168.163.117;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
#root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass http://nginx_blug_green;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP/> #
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;

#}
# pass the PHP/> #
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
#

重新加載nginx設定

# nginx -s reload
2018/05/28 04:39:47 [notice] 321#321: signal process started
#

確認結果

10次調用全部輸出的都是v1 in 7001

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]

> do

> curl http://localhost:9080

> let cnt++

> done

Hello, Service :Hello blue/green service: v1 in 7001

Hello, Service :Hello blue/green service: v1 in 7001

Hello, Service :Hello blue/green service: v1 in 7001

Hello, Service :Hello blue/green service: v1 in 7001

Hello, Service :Hello blue/green service: v1 in 7001

Hello, Service :Hello blue/green service: v1 in 7001

Hello, Service :Hello blue/green service: v1 in 7001

Hello, Service :Hello blue/green service: v1 in 7001

Hello, Service :Hello blue/green service: v1 in 7001

Hello, Service :Hello blue/green service: v1 in 7001

[root@kong ~]#

藍綠部署:切換到綠色版本

通過調整default.conf的weight,然後執行nginx -s reload的方式,在不停止nginx服務的方式下可動態的切換到綠色版本,目標將會將全部的流量都輸出v2 in 7002

修改default.conf的方法

只需要將upstream中的server的權重做如下調整:

upstream nginx_blug_green {
server 192.168.163.117:7001 down;
server 192.168.163.117:7002 weight=100;
}

重新加載nginx設定

# nginx -s reload 

2018/05/28 05:01:28 [notice] 330#330: signal process started
#

確認結果

[root@kong ~]# cnt=0; while [ $cnt -lt 10 ]; do curl http://localhost:9080; let cnt++; done

Hello, Service :Hello blue/green service: v2 in 7002

Hello, Service :Hello blue/green service: v2 in 7002

Hello, Service :Hello blue/green service: v2 in 7002

Hello, Service :Hello blue/green service: v2 in 7002

Hello, Service :Hello blue/green service: v2 in 7002

Hello, Service :Hello blue/green service: v2 in 7002

Hello, Service :Hello blue/green service: v2 in 7002

Hello, Service :Hello blue/green service: v2 in 7002

Hello, Service :Hello blue/green service: v2 in 7002

Hello, Service :Hello blue/green service: v2 in 7002

[root@kong ~]#

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,後面會分享更多關於devops方面的內容,感興趣的朋友可以關注下!!

簡單粗暴使用nginx模擬進行藍綠部署的方式


分享到:


相關文章: