簡(jiǎn)介
在配置部署前先簡(jiǎn)單描述一下nginx和uWSGI,只是個(gè)人學(xué)習和理解的,有不對的地方還望指出。
nginx:
nginx是一個(gè)反向代理服務(wù)器,客戶(hù)端對Web服務(wù)器的訪(fǎng)問(wèn)需要先經(jīng)過(guò)反向代理服務(wù)器,再由代理服務(wù)器決定目標服務(wù)器,這樣可以防止外部程序對Web服務(wù)器的直接攻擊;其次可根據負載情況去請求不同的目標服務(wù)器達到負載均衡;還有可以知己處理客戶(hù)端對于靜態(tài)文件的請求,而不用在去請求目標服務(wù)器。
uWSGI:
一個(gè)服務(wù)器或中間件,其實(shí)現了uwsgi協(xié)議,請求應用程序并返回處理后的信息。
uWSGI是可以完成所有和瀏覽器的交互過(guò)程的,但是還是要使用nginx的原因就是上面講的nginx的功用,一個(gè)uwsgi很可能不夠用,即使開(kāi)了多個(gè)process和thread也是不行,畢竟一臺機器的cpu和內存都是有限的,有了nginx做代理,一個(gè)nginx可以代理多臺uwsgi實(shí)現負載均衡的。
安裝nginx和uwsgi
首先我是基于python3的,ubuntu版本為16.04,你想配置python3的話(huà)需先安裝python3和pip3,然后執行如下命令安裝:
sudo apt-get install nginxsudo pip3 install uwsgi 如果沒(méi)有報錯基本就安裝成功了,這里就不再做測試。細心點(diǎn)會(huì )發(fā)現nginx是用apt-get安裝的,而uwsgi是用pip3,原因就是uwsgi是pyhon包,而nginx是一個(gè)類(lèi)似sql的服務(wù),也就是說(shuō)nginx可以開(kāi)機啟動(dòng),不手動(dòng)關(guān)閉或者關(guān)閉服務(wù)器是不會(huì )停止的。
我們想把項目部署到服務(wù)器上就必須使用它,假設我們在本地連接上了我們購買(mǎi)的服務(wù)器(遠程),然后使用uwsgi拉起我們的項目(后面講解怎么拉起項目),這時(shí)候我們就能通過(guò)外網(wǎng)訪(fǎng)問(wèn)了,但是一旦本地的機器斷開(kāi)與服務(wù)器的連接后就無(wú)法訪(fǎng)問(wèn)了。原因就是用uwsgi拉起項目只是在服務(wù)器端創(chuàng )建了一個(gè)進(jìn)程,而這個(gè)進(jìn)程是遠程連接的子進(jìn)程,遠程連接斷開(kāi)子進(jìn)程也就結束了。所以我們需要通過(guò)nginx來(lái)連接uwsgi,由于nginx是類(lèi)似sql的服務(wù),所以一旦開(kāi)啟就會(huì )一直在后臺運行,只要服務(wù)器不關(guān)閉項目就處于運行狀態(tài)。
項目上傳及環(huán)境配置
首先找到你的本地Django項目,比如我的項目名為bsite,絕對路徑為:/home/beau/bsite
bsite bsite __init__.py settings.py urls.py wsgi.py apps ... media ... static ... templates ... db.sqlite3 manage.py將項目上傳到服務(wù)器:使用本地機器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 )建項目上傳目錄mkdir /var/projectctr+c結束連接回到本機終端,進(jìn)入項目所在目錄:
# 注意需要ctr+c結束連接回到本機終端,進(jìn)入項目所在目錄cd /home/beau/# 上傳項目@后為服務(wù)器的IP,需要先在服務(wù)器創(chuàng )建/var/project/目錄(上面步驟已經(jīng)做了)sudo scp -r bsite root@192.168.27.110:/var/project/cd /home/beau/我們再連接到服務(wù)器,然后給服務(wù)器安裝nginx、uwsgi、django、python、mysql,這些就不講了。
配置nginx
打開(kāi)本地的終端(ctr+alt+t),連接到服務(wù)器(ssh root@192.168.27.110),將uwsgi_params文件拷貝到項目文件夾下。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ù)端項目在8080端口運行)}# 服務(wù)器配置server { # 監聽(tīng)端口,通過(guò)域名加這個(gè)端口號(192.168.27.110:9999)就可訪(fǎng)問(wèn)項目,而不是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的項目配置 location / { # uwsgi的方式使用上面upstream django的配置,先使用服務(wù)端口 uwsgi_pass django; include /var/project/bsite/uwsgi_params; # 復制的 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)入項目目錄,創(chuàng )建一個(gè)uwsgi.ini的配置文件
ssh root@192.168.27.110cd /var/project/bsitevim uwsgi.ini然后填入以下內容(不會(huì )vim請查詢(xún))
[uwsgi]# 項目目錄chdir = /var/project/bsite/# 指定項目的wsgi文件,我的項目是bsite所以為bsite.wsgi,你自己的對應改module = bsite.wsgi:application# 進(jìn)程個(gè)數workers = 5pidfile = /var/project/bsite/uwsgi.pid# 指定靜態(tài)文件,指定在那里就使用哪里,必須和nginx的default文件里配置的路徑一樣(當然這個(gè)目錄可以是隨意的,在項目之外也可以,只要保證和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文件當服務(wù)停止的時(shí)候vacuum=true# 序列化接受的內容,如果可能的話(huà)thunder-lock=true# 啟用線(xiàn)程enable-threads=true# 設置自中斷時(shí)間harakiri=30# 設置緩沖post-buffering=4096# 設置日志目錄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文件:
接著(zhù)修改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)項目:
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)系客服