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