【nginx】nginx:利用負載均衡原理實現代碼的熱部署和灰度發佈

事情原由很簡單,代碼的改動量很大。並且剛接手服務器,對原有的代碼進行了必定程度的重構。雖然在測試服務器上作了較多的測試工做,可是直接將代碼送入生產環境仍是不放心,萬一配置出問題服務直接崩潰怎麼解?萬一遇到沒有測出來的bug怎麼解?so······nginx

nginx負載均衡簡介 :

負載均衡 創建在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增長吞吐量、增強網絡數據處理能力、提升網絡的靈活性和可用性。
負載均衡,英文名稱爲Load Balance,其意思就是分攤到多個操做單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工做任務。

以上是某科的解釋,說的簡單些就是一件事,按照必定的規則分配給擁有相同配置的機器去完成服務器

服務器的架構:

由於咱們生產環境服務器只有一臺,因此是在一臺機器內完成的。網絡

圖片已經把意思說的很明白的,接下來就是do it架構

Step1:配置nginx的負載均衡

修改nginx的配置文件(個人目錄是/etc/nginx/nginx.conf),在http模塊中添加:app

# 負載均衡配置
upstream balance {
    # 開啓ip_hash保證同一個用戶訪問到同一臺服務器
    ip_hash;
    # 老服務器運行在11000+端口
    server 127.0.0.1:11001 weight=1;
    # 新服務器運行在12000+端口
    server 127.0.0.1:12001 weight=1;
} 

# 做爲負載均衡的虛擬服務器
server {
        listen 10001;
        location / {
            proxy_pass        http://balance;     
            proxy_set_header  X-Real-IP  $remote_addr;
        }
        access_log /data/logs/nginx.balance.access.log;
        error_log /data/logs/nginx.balance.error.log;
}

配置的字段是什麼意思,找某度嘍···負載均衡

固然由於有include,能夠把這段代碼單獨拿出來,減小對nginx配置文件的侵入(我放在/etc/nginx/conf.d/nginx_balance.conf)裏面socket

Step2:新代碼部署+啓動

我是用supervisor管理進程的,用uwsgi啓動代碼,下面把相關的配置都放出來了測試

首先要讓老代碼運行到11001端口:.net

server {
        listen 11001;
        location / {
            add_header Access-Control-Allow-Origin *;
            root /data/www/app/;
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:30000;
            uwsgi_read_timeout 360;
        }

        location ~/media/{
           root   /data/static/;
        }

        location = /favicon.ico {
            log_not_found off;
        }
        access_log /data/logs/nginx.qianming.access.log;
        error_log /data/logs/nginx.qianming.error.log;
}

其次是新代碼的nginx配置,運行在12001端口:code

server {
        listen 12001;
        location / {
            add_header Access-Control-Allow-Origin *;
            root /data/www_new/app/;
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:31000;
            uwsgi_read_timeout 360;
        }

        location ~/media/{
           root   /data/static/;
        }

        location = /favicon.ico {
            log_not_found off;
        }
        access_log /data/logs/nginx.qianming.access.log;
        error_log /data/logs/nginx.qianming.error.log;
}

接下來是supervisor的配置:

; 須要將此配置文件軟引用到supervisor的配置文件,默認路徑:/etc/supervisor/
; 使用supervisor來管理進程,作到自動啓動
[program:qianming_old]
directory=/data/www_new/app
command=uwsgi --ini confs/uwsgi.ini
autostart=true

最後是uwsgi的配置:

[uwsgi]
socket = 127.0.0.1:31000
chdir = /data/www_new/app/
wsgi-file = project/wsgi.py

processes = 1
threads = 4

chmod-socket = 664
chown-socket = www:www-data

固然要讓配置生效,這裏不展開講了

nginx -t測試經過之後直接能夠nginx -s reload加載nginx新的配置,新的代碼在supervisor裏賣直接啓動就能夠了,這樣舊代碼運行在11001端口,新代碼運行在12001端口,而訪問原先的10001端口會根據自定的規則決定返回11001端口或者12001端口的數據,而這個規則就是經過權重進行配置的,在nginx_balance.conf文件中經過weight配置的。

至此,代碼的熱部署已經完成。

Step3:測試和灰度發佈

要想測試,直接訪問12001端口就能夠了,由於裏面是最新的代碼

灰度發佈也就是控制weight的值,漸漸增大訪問新代碼的比例就能夠了,直到新代碼達到100%,老代碼就能夠正式宣告退役了^_^

相關文章
相關標籤/搜索