上一篇文章血筑,“小程序創(chuàng)業(yè)最低配置部署绘沉,騰訊云折扣秒殺阿里云!”介紹了小程序項(xiàng)目啟動(dòng)時(shí)的最低配置服務(wù)器選擇豺总,但當(dāng)項(xiàng)目良好發(fā)展時(shí)车伞,還是要把服務(wù)器配置調(diào)整到標(biāo)準(zhǔn)水平,承受住日益增長(zhǎng)的流量訪問(wèn)喻喳。
隨著Python的流行另玖,直接用Python來(lái)部署Web服務(wù)器變成一個(gè)需求。但Python自帶的Flask或傳統(tǒng)的DJango都是基于阻塞io模型實(shí)現(xiàn)表伦,性能上往往達(dá)不到生產(chǎn)環(huán)境大規(guī)模跑用戶的需求谦去。Tornado在底層io處理機(jī)制上和django以及flask有著根本的區(qū)別,采用了非阻塞io模型绑榴,也特別適合小程序用python實(shí)現(xiàn)服務(wù)端時(shí)的部署哪轿。
1. 確定Tornado的部署架構(gòu)
下圖是一般Tornado用作生產(chǎn)環(huán)境的標(biāo)準(zhǔn)部署架構(gòu)。核心思想是在一臺(tái)服務(wù)器上要運(yùn)行多個(gè)tornado實(shí)例翔怎,然后使用nginx作反向代理服務(wù)器窃诉,nginx會(huì)把客戶端請(qǐng)求中轉(zhuǎn)到適當(dāng)?shù)膖ornado服務(wù)器進(jìn)程。
運(yùn)行多個(gè)Tornado進(jìn)程實(shí)例的原因是同步請(qǐng)求時(shí)赤套,在應(yīng)用處理過(guò)程中(如數(shù)據(jù)庫(kù)查詢飘痛,磁盤訪問(wèn)),服務(wù)器進(jìn)程不能接受新請(qǐng)求容握,所以需要運(yùn)行多個(gè)服務(wù)器進(jìn)程實(shí)例宣脉。而在異步請(qǐng)求時(shí),在應(yīng)用處理時(shí)剔氏,服務(wù)器進(jìn)程是非阻塞的塑猖,可以接受新請(qǐng)求竹祷,因此tornado的非阻塞架構(gòu)本身就很好地解決這個(gè)問(wèn)題。
2. 云服務(wù)器比較
一般建議每個(gè)Tornado進(jìn)程實(shí)例對(duì)應(yīng)1個(gè)CPU羊苟,所以建議購(gòu)買4核8G或者是8核16G的服務(wù)器塑陵。我們比較了騰訊云和阿里云的服務(wù)器價(jià)格,都是按照優(yōu)惠價(jià)格比較蜡励,依然是騰訊云秒殺阿里云令花。
騰訊云的“云服務(wù)器三折起”優(yōu)惠活動(dòng)對(duì)4核8G和8核16G的服務(wù)器有超劃算的優(yōu)惠。見(jiàn)下圖凉倚,左邊選擇“8核16G”兼都,右邊選擇“重慶”,1年付可以拿到3.8折稽寒,才3149.59元扮碧。
左邊如果選擇“4核8G”的話,1年付將是2000元左右更優(yōu)惠杏糙。一般情況下4核8G配置也已足夠芬萍,但考慮“8核16G”只貴了1000元1年,在有預(yù)算的時(shí)候搔啊,不妨選擇“8核16G”柬祠,當(dāng)有突發(fā)負(fù)載時(shí)更有緩沖的余量。
與之相對(duì)應(yīng)的阿里云负芋,“性能級(jí)主機(jī)2-5折”是目前在搞的ECS優(yōu)惠活動(dòng)漫蛔。類似的“8核16G”將需要4466元/年。如果只有3000元預(yù)算的話旧蛾,只有購(gòu)買4核8G云服務(wù)器莽龟,或者是“8核16G”的突發(fā)型實(shí)例(即負(fù)載不能一直跑滿100%)。
3. NGinx配置
NGinx的反向代理安裝和配置是運(yùn)維標(biāo)配了锨天。我們這里著重兩個(gè)環(huán)節(jié)毯盈,a) 反向代理到4個(gè)Tornado實(shí)例;b) 配置SSL病袄。
下面所列的NGinx配置示例主要就考慮了這兩點(diǎn)搂赋,重點(diǎn)關(guān)注upstream和ssl的配置。
user nginx;
worker_processes 5;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
? ? worker_connections 1024;
? ? use epoll;
}
proxy_next_upstream error;
upstream tornadoes {
? ? server 127.0.0.1:8000;
? ? server 127.0.0.1:8001;
? ? server 127.0.0.1:8002;
? ? server 127.0.0.1:8003;
}
server {
? ? listen 443;
? ? ssl on;
? ? ssl_certificate /path/to/cert.pem;
? ? ssl_certificate_key /path/to/cert.key;
? ? server_name www.example.org *.example.org;
? ? location /static/ {
? ? ? ? root /var/www/static;
? ? ? ? if ($query_string) {
? ? ? ? ? ? expires max;
? ? ? ? }
? ? }
? ? location / {
? ? ? ? proxy_pass_header Server;
? ? ? ? proxy_set_header Host $http_host;
? ? ? ? proxy_redirect off;
? ? ? ? proxy_set_header X-Real-IP $remote_addr;
? ? ? ? proxy_set_header X-Scheme $scheme;
? ? ? ? proxy_pass http://tornadoes;
? ? }
}
4. 利用Supervisor管理部署tornado進(jìn)程益缠。
詳細(xì)操作可以參見(jiàn)這篇文章脑奠,使用python3+supervisor+nginx部署tornado。
更多省錢秘笈幅慌,請(qǐng)看: