Django(八)部署項目到服務器nginx和uwsgi配置

簡介

  在配置部署前先簡單描述一下nginx和uWSGI,只是個人學習和理解的,有不對的地方還望指出。
  

  • nginx:

      nginx是一個反向代理服務器,客戶端對Web服務器的訪問需要先經過反向代理服務器,再由代理服務器決定目標服務器,這樣可以防止外部程序對Web服務器的直接攻擊;其次可根據負載情況去請求不同的目標服務器達到負載均衡;還有可以知己處理客戶端對於靜態文件的請求,而不用在去請求目標服務器。

  • uWSGI:

      一個服務器或中間件,其實現了uwsgi協議,請求應用程序並返回處理後的信息。

      uWSGI是可以完成所有和瀏覽器的交互過程的,但是還是要使用nginx的原因就是上面講的nginx的功用,一個uwsgi很可能不夠用,即使開了多個process和thread也是不行,畢竟一臺機器的cpu和內存都是有限的,有了nginx做代理,一個nginx可以代理多臺uwsgi實現負載均衡的。

安裝nginx和uwsgi

首先我是基於python3的,ubuntu版本爲16.04,你想配置python3的話需先安裝python3和pip3,然後執行如下命令安裝:

sudo apt-get install nginx
sudo pip3 install uwsgi

  如果沒有報錯基本就安裝成功了,這裏就不再做測試。細心點會發現nginx是用apt-get安裝的,而uwsgi是用pip3,原因就是uwsgi是pyhon包,而nginx是一個類似sql的服務,也就是說nginx可以開機啓動,不手動關閉或者關閉服務器是不會停止的。
  我們想把項目部署到服務器上就必須使用它,假設我們在本地連接上了我們購買的服務器(遠程),然後使用uwsgi拉起我們的項目(後面講解怎麼拉起項目),這時候我們就能通過外網訪問了,但是一旦本地的機器斷開與服務器的連接後就無法訪問了。原因就是用uwsgi拉起項目只是在服務器端創建了一個進程,而這個進程是遠程連接的子進程,遠程連接斷開子進程也就結束了。所以我們需要通過nginx來連接uwsgi,由於nginx是類似sql的服務,所以一旦開啓就會一直在後臺運行,只要服務器不關閉項目就處於運行狀態。

項目上傳及環境配置

首先找到你的本地Django項目,比如我的項目名爲bsite,絕對路徑爲:/home/beau/bsite

bsite
    bsite
        __init__.py
        settings.py
        urls.py
        wsgi.py
    apps
        ...
    media
        ...
    static
        ...
    templates
        ...
    db.sqlite3
    manage.py

將項目上傳到服務器:使用本地機器ctr+alt+t打開終端:

# 連接服務器,輸入yes和密碼進行連接,以下IP和名稱改爲你自己的,下述IP是我隨意寫的,只做樣例,我真正使用的沒有寫出
ssh root@192.168.27.110
# 成功後創建項目上傳目錄
mkdir /var/project
注意:服務器上的項目不要放在root目錄,放在root目錄裏在使用uwsgi的時候寫入.socket會出現權限錯誤。其它目錄都沒問題。

ctr+c結束連接回到本機終端,進入項目所在目錄:

# 注意需要ctr+c結束連接回到本機終端,進入項目所在目錄
cd /home/beau/
# 上傳項目@後爲服務器的IP,需要先在服務器創建/var/project/目錄(上面步驟已經做了)
sudo scp -r bsite root@192.168.27.110:/var/project/
cd /home/beau/

我們再連接到服務器,然後給服務器安裝nginx、uwsgi、django、python、mysql,這些就不講了。

配置nginx

打開本地的終端(ctr+alt+t),連接到服務器(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; # 網絡端口socket(我們先使用這個,8080代表在服務端項目在8080端口運行)
}
# 服務器配置
server {
    # 監聽端口,通過域名加這個端口號(192.168.27.110:9999)就可訪問項目,而不是8080端口
    listen   9999;
    server_name 192.168.27.110; 
    # 如果你有域名則配置如下,沒有域名則配置你的服務器ip(如上)
    # listen   80;
    # server_name www.nginx.netcome.net; 
    charset     utf-8;

    # 最大上傳大小
    client_max_body_size 75M;

    # Django的靜態media文件路徑
    location /media  {
        alias /var/project/bsite/media;
    }
    # Django的靜態static文件路徑
    location /static {
        alias /var/project/bsite/static;
    }
    # Django的項目配置
    location / {
        # uwsgi的方式使用上面upstream django的配置,先使用服務端口
        uwsgi_pass  django;
        include     /var/project/bsite/uwsgi_params; # 複製的 uwsgi_params路徑
    }
}

保存然後開啓nginx服務

/etc/init.d/nginx start

往/var/project/bsite/media裏上傳一張圖片test.png(在本地使用sudo scp -r test.png [email protected]:/var/project/上傳圖片到服務器,需要先進入test.png圖片的目錄),然後訪問http://192.168.27.110:9999/media/test.png查看到圖片則成功:

配置uwsgi

如下連接到服務器,並進入項目目錄,創建一個uwsgi.ini的配置文件

ssh root@192.168.27.110
cd /var/project/bsite
vim uwsgi.ini

然後填入以下內容(不會vim請查詢)

注意目錄,配置問題多半出在目錄上
[uwsgi]
# 項目目錄
chdir = /var/project/bsite/
# 指定項目的wsgi文件,我的項目是bsite所以爲bsite.wsgi,你自己的對應改
module = bsite.wsgi:application
# 進程個數
workers = 5
pidfile = /var/project/bsite/uwsgi.pid
# 指定靜態文件,指定在那裏就使用哪裏,必須和nginx的default文件裏配置的路徑一樣(當然這個目錄可以是隨意的,在項目之外也可以,只要保證和nginx的靜態文件路徑一樣就行)
static-map =/static=/var/project/bsite/static
# 啓動uwsgi的用戶名和用戶組
uid=root
gid=root
# 啓用主進程
master=true
# 自動移除unix Socket和pid文件當服務停止的時候
vacuum=true
# 序列化接受的內容,如果可能的話
thunder-lock=true
# 啓用線程
enable-threads=true
# 設置自中斷時間
harakiri=30
# 設置緩衝
post-buffering=4096
# 設置日誌目錄
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.netcome.net/home(填寫你的域名加上網站的首頁路由),如果是服務器則訪問:http://192.168.27.110:9999/home。這時你會看到你自己的首頁,至此配置已經完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章