事情起因很簡單,代碼的改動量很大。而且剛接手服務器,對原有的代碼進行了一定程度的重構。雖然在測試服務器上做了較多的測試工作,但是直接將代碼送入生產環境還是不放心,萬一配置出問題服務直接崩潰怎么解?萬一遇到沒有測出來的bug怎么解?so······
nginx負載均衡簡介 :
負載均衡 建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。
負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。
以上是某科的解釋,說的簡單些就是一件事,按照一定的規則分配給擁有相同配置的機器去完成
服務器的架構:
因為我們生產環境服務器只有一台,所以是在一台機器內完成的。
圖片已經把意思說的很明白的,接下來就是do it
Step1:配置nginx的負載均衡
修改nginx的配置文件(我的目錄是/etc/nginx/nginx.conf),在http模塊中添加:
# 負載均衡配置
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)里面
Step2:新代碼部署+啟動
我是用supervisor管理進程的,用uwsgi啟動代碼,下面把相關的配置都放出來了
首先要讓老代碼運行到11001端口:
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端口:
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%,老代碼就可以正式宣告退役了^_^