1. 程式人生 > >小白教你如何用Django+uwsgi+Nginx+騰訊雲ubuntu伺服器部署專案

小白教你如何用Django+uwsgi+Nginx+騰訊雲ubuntu伺服器部署專案

背景

  本篇部落格內容如題目所示,背景是前幾天幫老師寫了一個非常小的專案,大概是讓學生的家長可以登陸網址查閱孩子們的成績,前因後果就不在囉嗦了。在寫完Django成績查詢小專案後,面臨著專案的部署問題。在反覆跳進各種坑、查閱了各種技術說明文件和很多大牛的部落格後成功地進行了部署,把部署過程記錄如下。當然,本人程式設計小白一枚,如果在以下內容中有錯誤或者描述不當的地方,請各位大佬留言指正~
  另外,本次部署各種程式版本如下:

程式名稱 版本號
騰訊雲ubuntu伺服器 Ubuntu 16.04.3 LTS
Python Python 2.7.12
Django Django 1.10.6

部署過程

一、 準備項

  1、配置好Django環境的騰訊雲ubuntu伺服器。這個登入騰訊雲購買就行了,學生的話有額外活動~我的騰訊雲shell登入方式就是最簡單的使用者名稱口令,此外還可以用SSH金鑰登入。
  2、Django專案。我的Django項小目名為:InquireScore,下文如用到的InquireScore字樣的地方,可替換為任意專案名;
  3、安裝了Xshell & Xftp的windows系統電腦。我用到的版本是Xshell5 & Xftp5,用這個的目的就是遠端登入騰訊雲,並且把檔案傳到雲上(主要是這點,在之後的配置過程中需要在配置檔案中寫入配置資訊,在命令列下用vim敲好麻煩,不如寫好直接傳上去覆蓋,我承認不太會用vim,哈哈)。
  一切就緒~現在開始部署工作~

二、 Xshell & Xftp登入雲伺服器並傳輸Django專案

  首先開啟Xshell5,點選左上角“新建”,即紅框中按鈕:這裡寫圖片描述 。然後點選“連線”,輸入“名稱”(隨便起一個名字)和“主機”(騰訊雲的IP地址)。寫完後先別點“確定”,後點擊左上角“使用者身份驗證”,輸入“使用者名稱”(騰訊雲shell名)和“密碼”(shell登入密碼),最後點選“確定”。
(注:如果是用SSH金鑰登入可以在“方法”中選擇“PublicKey”然後選擇登入金鑰檔案,即可。)
  過程截圖如下:
   這裡寫圖片描述
   這裡寫圖片描述
  成功登陸後,點選下圖中Xftp圖示:
   這裡寫圖片描述
  點選後進入檔案傳輸介面,拖動Django專案資料夾至雲主機中,如下圖:
   這裡寫圖片描述


  至此,該步驟完成~

三、 測試Django專案並整理目錄

  在Django目錄至雲端後,有幾個需要注意的地方。

目錄結構問題。

  我的Django專案中只有一個主要的app名為Inquire,該app有自己的靜態資料夾static。在正常的Django專案中,不同的app也應該有各自的static資料夾,但是在之後的nginx配置過程中,我們需要提供專案的一個靜態目錄地址,這就需要把Django專案所有app的static檔案整合到一個資料夾中。此時setting.py檔案中關於靜態目錄的設定如下:

STATIC_URL = '/static/'
# 新增app的靜態檔案地址,絕對地址和相對地址都可以
STATICFILES_DIRS = [
    "/home/ubuntu/InquireScore/Inquire/static"
]
# 統一的靜態檔案地址
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

  配置好後,我們Xshell命令列中的/home/ubuntu/InquireScore目錄下執行以下語句完成整合:

>> python manage.py collectstatic

  執行後的目錄結構如下圖所示:
        這裡寫圖片描述

公網訪問配置。

  我們需要在瀏覽器中開啟連結完成專案測試,由於不是本機測試,所以我們需要通過公網訪問測試,在setting.py中修改輸入:

DEBUG = False 
ALLOWED_HOSTS = ['*']

測試

  注意到以上兩點後,我們可以進行測試了,在Xshell命令列中的/home/ubuntu/InquireScore目錄下輸入:

>> python manage.py runserver 0.0.0.0:8888

  成功執行後在瀏覽器中輸入:http://IP:8888 進行測試,可以進行正常功能即可進行下一步。測試後按ctrl+c關閉測試程序。
  (關於settings.py檔案的設定項,可以參照官方文件提示,連結為:https://docs.djangoproject.com/

四、 安裝並配置uwsgi

安裝測試uwsgi

  簡單介紹一下:uWSGI是一個Web伺服器,而uwsgi是一種線路協議而不是通訊協議,在此常用於在uWSGI伺服器與其他網路伺服器的資料通訊。由於uWSGI是C語言應用程式,所以需要一個C編譯器(gcc或clang)和Python開發標頭檔案,所以輸入以下語句:

>> sudo apt-get install build-essential python-dev

  build-essential提供編譯程式必須軟體包的列表資訊。python-dev就可以讓我們安裝一個源外的,內含需要編譯的呼叫python api的c/c++檔案的python類庫。然後輸入以下指令安裝uwsgi:

>> sudo pip install uwsgi # 安裝

  安裝後進行簡單的測試,在本地寫好如下的測試程式碼命名為 test.py,把檔案用Xftp傳到雲主機任意目錄下:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["success!"] 

  該目錄下輸入以下命令:

>> uwsgi --http :8000 --wsgi-file test.py

  輸入資訊無誤執行後將會出現以下資訊:
  這裡寫圖片描述
  在瀏覽器中開啟:http://IP:8000 ,若出現“success!”則安裝測試成功,如下圖:
  這裡寫圖片描述
  注意:測試過後,用ctrl+c來終止程式,而不要用ctrl+z掛起程式,否則該8000埠會一直開啟使用,影響後續配置過程。測試後 test.py 檔案即可刪除。

配置uwsgi

  在InquireScore資料夾與manage.py同級的目錄下建立.ini檔案,命名任意,我命名為InquireScore_uwsgi.ini,檔案內容如下(注意路徑):

# InquireScore_uwsgi.ini file
[uwsgi]
# uwsgi監聽的socket,一會兒配置Nginx會用到
socket = 127.0.0.1:8000
# 在app載入前切換到該目錄,設定為Django專案根目錄
chdir           = /home/ubuntu/InquireScore
# 載入指定的python WSGI模組,設定為Django專案的wsgi檔案
module          = InquireScore.wsgi
# 啟動一個master程序來管理其他程序
master          = true
# 工作的程序數
processes       = 4
# 每個程序下的執行緒數量
threads = 2
# 當伺服器退出的時候自動刪除unix socket檔案和pid檔案
vacuum          = true
# 使程序在後臺執行,並將日誌打到指定的日誌檔案或者udp伺服器
daemonize = /home/ubuntu/InquireScore/uwsgi.log

  然後在該目錄下輸入:

>> uwsgi --ini InquireScore_uwsgi.ini

  則會出現如下截圖:
  這裡寫圖片描述
  其他的啟動資訊記錄在日誌檔案中,暫時先把uwsgi關閉,uwsgi的關閉方法我一般都是簡單粗暴的輸入(hiahia~):

>> sudo killall -9 uwsgi

五、 安裝與配置Nginx

安裝測試Nginx

  輸入以下指令進行安裝:

>> sudo apt-get install nginx  # 安裝

  然後輸入以下指令啟動測試:

>> /etc/init.d/nginx start  # 啟動

配置nginx

  首先用vim開啟配置檔案:

>> sudo vim /etc/nginx/nginx.conf

  開啟配置檔案,在Http內建立server子項如下:

server {
    listen         8888; # 設定監聽埠號
    server_name    XXX.XXX.XXX.XXX; # 設定對外訪問入口,可以是域名可以是IP地址,我設定的是IP 
    charset        UTF-8;  # 設定訪問的語言編碼
    access_log     /var/log/nginx/InquireScore_access.log; # 訪問日誌記錄
    error_log      /var/log/nginx/InquireScore_error.log;  # 錯誤日誌記錄

    location / {   # 設定虛擬主機的基本資訊
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000; # 剛才uwsgi設定的socket
        uwsgi_read_timeout 2;
    }   
    location /static {   # 靜態檔案設定,nginx自己處理
        expires 7d;      # 過期時間
        alias /home/ubuntu/InquireScore/static/;  # 專案靜態檔案地址
     }
 }

  儲存即可。當然,也可以在本地寫完後用Xftp傳輸到 /home/ubuntu/ 目錄下,再用 sudo cp -f /home/ubuntu/nginx.conf /etc/nginx/ 將其替換原來的配置檔案(我承認我懶。。而且vim用的不熟練)
  (關於Nginx的安裝與相關配置問題可參照文件:http://nginx.org/en/docs/

六、見證奇蹟的時刻

  切換到/home/Ubuntu/InquireScore/目錄下執行:

>> uwsgi --ini InquireScore_uwsgi.ini

  然後再輸入:

>> /etc/init.d/nginx restart

  若重啟失敗,則需要檢查,輸入 sudo nginx -t 測試配置檔案是否正確。如果在瀏覽器中輸入: http://IP:8888,即可進行專案訪問。噹噹噹當~~

七、 後續

  專案有更新的時候,需要先關閉uwsgi然後重啟即可,關閉wsgi依然可以用一招解決輸入:

>> sudo killall -9 uwsgi

  更新後將Ngnix重啟即可~
  如果在以上內容中有錯誤或者描述不當的地方,請各位大佬留言指正~