事情原由很簡單,代碼的改動量很大。並且剛接手服務器,對原有的代碼進行了必定程度的重構。雖然在測試服務器上作了較多的測試工做,可是直接將代碼送入生產環境仍是不放心,萬一配置出問題服務直接崩潰怎麼解?萬一遇到沒有測出來的bug怎麼解?so······nginx
負載均衡 創建在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增長吞吐量、增強網絡數據處理能力、提升網絡的靈活性和可用性。 負載均衡,英文名稱爲Load Balance,其意思就是分攤到多個操做單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工做任務。
以上是某科的解釋,說的簡單些就是一件事,按照必定的規則分配給擁有相同配置的機器去完成服務器
由於咱們生產環境服務器只有一臺,因此是在一臺機器內完成的。網絡
圖片已經把意思說的很明白的,接下來就是do it架構
修改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
我是用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配置的。
至此,代碼的熱部署已經完成。
要想測試,直接訪問12001端口就能夠了,由於裏面是最新的代碼
灰度發佈也就是控制weight的值,漸漸增大訪問新代碼的比例就能夠了,直到新代碼達到100%,老代碼就能夠正式宣告退役了^_^