簡(jiǎn)介
在配置部署前先簡(jiǎn)單描述一下nginx和uWSGI,只是個(gè)人學(xué)習(xí)和理解的,有不對(duì)的地方還望指出。
nginx:
nginx是一個(gè)反向代理服務(wù)器,客戶(hù)端對(duì)Web服務(wù)器的訪(fǎng)問(wèn)需要先經(jīng)過(guò)反向代理服務(wù)器,再由代理服務(wù)器決定目標(biāo)服務(wù)器,這樣可以防止外部程序?qū)eb服務(wù)器的直接攻擊;其次可根據(jù)負(fù)載情況去請(qǐng)求不同的目標(biāo)服務(wù)器達(dá)到負(fù)載均衡;還有可以知己處理客戶(hù)端對(duì)于靜態(tài)文件的請(qǐng)求,而不用在去請(qǐng)求目標(biāo)服務(wù)器。
uWSGI:
一個(gè)服務(wù)器或中間件,其實(shí)現(xiàn)了uwsgi協(xié)議,請(qǐng)求應(yīng)用程序并返回處理后的信息。
uWSGI是可以完成所有和瀏覽器的交互過(guò)程的,但是還是要使用nginx的原因就是上面講的nginx的功用,一個(gè)uwsgi很可能不夠用,即使開(kāi)了多個(gè)process和thread也是不行,畢竟一臺(tái)機(jī)器的cpu和內(nèi)存都是有限的,有了nginx做代理,一個(gè)nginx可以代理多臺(tái)uwsgi實(shí)現(xiàn)負(fù)載均衡的。
安裝nginx和uwsgi
首先我是基于python3的,ubuntu版本為16.04,你想配置python3的話(huà)需先安裝python3和pip3,然后執(zhí)行如下命令安裝:
sudo apt-get install nginxsudo pip3 install uwsgi
如果沒(méi)有報(bào)錯(cuò)基本就安裝成功了,這里就不再做測(cè)試。細(xì)心點(diǎn)會(huì)發(fā)現(xiàn)nginx是用apt-get安裝的,而uwsgi是用pip3,原因就是uwsgi是pyhon包,而nginx是一個(gè)類(lèi)似sql的服務(wù),也就是說(shuō)nginx可以開(kāi)機(jī)啟動(dòng),不手動(dòng)關(guān)閉或者關(guān)閉服務(wù)器是不會(huì)停止的。
我們想把項(xiàng)目部署到服務(wù)器上就必須使用它,假設(shè)我們?cè)诒镜剡B接上了我們購(gòu)買(mǎi)的服務(wù)器(遠(yuǎn)程),然后使用uwsgi拉起我們的項(xiàng)目(后面講解怎么拉起項(xiàng)目),這時(shí)候我們就能通過(guò)外網(wǎng)訪(fǎng)問(wèn)了,但是一旦本地的機(jī)器斷開(kāi)與服務(wù)器的連接后就無(wú)法訪(fǎng)問(wèn)了。原因就是用uwsgi拉起項(xiàng)目只是在服務(wù)器端創(chuàng)建了一個(gè)進(jìn)程,而這個(gè)進(jìn)程是遠(yuǎn)程連接的子進(jìn)程,遠(yuǎn)程連接斷開(kāi)子進(jìn)程也就結(jié)束了。所以我們需要通過(guò)nginx來(lái)連接uwsgi,由于nginx是類(lèi)似sql的服務(wù),所以一旦開(kāi)啟就會(huì)一直在后臺(tái)運(yùn)行,只要服務(wù)器不關(guān)閉項(xiàng)目就處于運(yùn)行狀態(tài)。
項(xiàng)目上傳及環(huán)境配置
首先找到你的本地Django項(xiàng)目,比如我的項(xiàng)目名為bsite,絕對(duì)路徑為:/home/beau/bsite
bsite bsite __init__.py settings.py urls.py wsgi.py apps ... media ... static ... templates ... db.sqlite3 manage.py
將項(xiàng)目上傳到服務(wù)器:使用本地機(jī)器ctr+alt+t打開(kāi)終端:
# 連接服務(wù)器,輸入yes和密碼進(jìn)行連接,以下IP和名稱(chēng)改為你自己的,下述IP是我隨意寫(xiě)的,只做樣例,我真正使用的沒(méi)有寫(xiě)出ssh root@192.168.27.110# 成功后創(chuàng)建項(xiàng)目上傳目錄mkdir /var/project
ctr+c結(jié)束連接回到本機(jī)終端,進(jìn)入項(xiàng)目所在目錄:
# 注意需要ctr+c結(jié)束連接回到本機(jī)終端,進(jìn)入項(xiàng)目所在目錄cd /home/beau/# 上傳項(xiàng)目@后為服務(wù)器的IP,需要先在服務(wù)器創(chuàng)建/var/project/目錄(上面步驟已經(jīng)做了)sudo scp -r bsite root@192.168.27.110:/var/project/cd /home/beau/
我們?cè)龠B接到服務(wù)器,然后給服務(wù)器安裝nginx、uwsgi、django、python、mysql,這些就不講了。
配置nginx
打開(kāi)本地的終端(ctr+alt+t),連接到服務(wù)器(ssh root@192.168.27.110),將uwsgi_params文件拷貝到項(xiàng)目文件夾下。uwsgi_params文件在/etc/nginx/目錄下:
cp /etc/nginx/uwsgi_params /var/project/bsitevim /etc/nginx/sites-enabled/default
修改default文件為:
# nginx需要連接的組件upstream django { # server unix:///var/project/bsite/uwsgi.sock; # 文件socket server 0.0.0.0:8080; # 網(wǎng)絡(luò)端口socket(我們先使用這個(gè),8080代表在服務(wù)端項(xiàng)目在8080端口運(yùn)行)}# 服務(wù)器配置server { # 監(jiān)聽(tīng)端口,通過(guò)域名加這個(gè)端口號(hào)(192.168.27.110:9999)就可訪(fǎng)問(wèn)項(xiàng)目,而不是8080端口 listen 9999; server_name 192.168.27.110; # 如果你有域名則配置如下,沒(méi)有域名則配置你的服務(wù)器ip(如上) # listen 80; # server_name www.nginx.netcome.net; charset utf-8; # 最大上傳大小 client_max_body_size 75M; # Django的靜態(tài)media文件路徑 location /media { alias /var/project/bsite/media; } # Django的靜態(tài)static文件路徑 location /static { alias /var/project/bsite/static; } # Django的項(xiàng)目配置 location / { # uwsgi的方式使用上面upstream django的配置,先使用服務(wù)端口 uwsgi_pass django; include /var/project/bsite/uwsgi_params; # 復(fù)制的 uwsgi_params路徑 }}
保存然后開(kāi)啟nginx服務(wù)
/etc/init.d/nginx start
往/var/project/bsite/media里上傳一張圖片test.png(在本地使用sudo scp -r test.png root@192.168.27.110:/var/project/上傳圖片到服務(wù)器,需要先進(jìn)入test.png圖片的目錄),然后訪(fǎng)問(wèn)http://192.168.27.110:9999/media/test.png查看到圖片則成功:
配置uwsgi
如下連接到服務(wù)器,并進(jìn)入項(xiàng)目目錄,創(chuàng)建一個(gè)uwsgi.ini的配置文件
ssh root@192.168.27.110cd /var/project/bsitevim uwsgi.ini
然后填入以下內(nèi)容(不會(huì)vim請(qǐng)查詢(xún))
[uwsgi]# 項(xiàng)目目錄chdir = /var/project/bsite/# 指定項(xiàng)目的wsgi文件,我的項(xiàng)目是bsite所以為bsite.wsgi,你自己的對(duì)應(yīng)改module = bsite.wsgi:application# 進(jìn)程個(gè)數(shù)workers = 5pidfile = /var/project/bsite/uwsgi.pid# 指定靜態(tài)文件,指定在那里就使用哪里,必須和nginx的default文件里配置的路徑一樣(當(dāng)然這個(gè)目錄可以是隨意的,在項(xiàng)目之外也可以,只要保證和nginx的靜態(tài)文件路徑一樣就行)static-map =/static=/var/project/bsite/static# 啟動(dòng)uwsgi的用戶(hù)名和用戶(hù)組uid=rootgid=root# 啟用主進(jìn)程master=true# 自動(dòng)移除unix Socket和pid文件當(dāng)服務(wù)停止的時(shí)候vacuum=true# 序列化接受的內(nèi)容,如果可能的話(huà)thunder-lock=true# 啟用線(xiàn)程enable-threads=true# 設(shè)置自中斷時(shí)間harakiri=30# 設(shè)置緩沖post-buffering=4096# 設(shè)置日志目錄daemonize=/var/project/bsite/uwsgi.log# 指定sock的文件路徑socket=/var/project/bsite/uwsgi.sock
保存(esc + :wq)然后進(jìn)入uwsgi.ini目錄使用寫(xiě)好的uwsgi.ini配置:
cd /var/project/bsite/uwsgi --ini uwsgi.inivim /etc/nginx/sites-enabled/default
然后你會(huì)在/var/project/bsite目錄下看到生成的uwsgi.sock、uwsgi.pid、uwsgi.log文件:
接著修改default文件,將upstream django修改為如下(這里的server unix:///var/project/bsite/uwsgi.sock; # 文件socket一定和uwsgi那里配置的socket=/var/project/bsite/uwsgi.sock路徑一樣,nginx會(huì)使用uwsgi生成的.socket文件),其它保持不變:
# nginx需要連接的組件upstream django { server unix:///var/project/bsite/uwsgi.sock; # 文件socket # server 0.0.0.0:8080;}
重新啟動(dòng)項(xiàng)目:
cd /var/project/bsite/uwsgi --reload uwsgi.pid/etc/init.d/nginx restart
如果nginx配置的域名則訪(fǎng)問(wèn):http://www.nginx.netcome.net/home(填寫(xiě)你的域名加上網(wǎng)站的首頁(yè)路由),如果是服務(wù)器則訪(fǎng)問(wèn):http://192.168.27.110:9999/home。這時(shí)你會(huì)看到你自己的首頁(yè),至此配置已經(jīng)完成。
聯(lián)系客服