小白教你如何用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重啟即可~
如果在以上內容中有錯誤或者描述不當的地方,請各位大佬留言指正~