Django是一個功能豐富、高效且安全的架構,適合各種規模的Web應用程式開發。它不僅能夠加速開發過程,還能確保應用程式的品質和穩定性。本文介紹如何在Linux伺服器中使用Nginx+uWSGI部署Django專案。
產品優勢
使用Nginx和uWSGI部署Django專案,能夠高效處理高並發請求、快速提供靜態資源、確保運行、增強安全性以保護敏感性資料,並支援靈活擴充以應對流量高峰,從而顯著提升使用者體驗和商務持續性。
高效能:Nginx能處理大量並發串連;而uWSGI專註於Python Web應用的高效執行,兩者結合確保Django程式的快速響應。
易於管理和配置:簡單直觀的配置文法您可以快速設定和調整伺服器參數,適應不同的業務需求變化,降低營運複雜度。
模組化設計:高度模組化的特性允許根據具體需求選擇必要的組件,節省資源的同時提高了系統的靈活性和效率。
方案架構
使用者請求:瀏覽器發送HTTP請求。
Nginx:接收請求,如果是靜態檔案,直接返回;否則,轉寄給uWSGI。
uWSGI:接收請求並通過WSGI協議傳遞給Django應用。
Django:處理商務邏輯,可能涉及資料庫查詢或模板渲染,產生響應內容。
返迴響應:Django將處理結果交給uWSGI,uWSGI負責將這些資訊打包成適當的格式,再傳遞迴Nginx。
快速部署
您可以單擊一鍵運行進入Terraform Explorer查看並執行Terraform代碼,從而實現自動化地在Alibaba Cloud Linux執行個體中使用Nginx與uWSGI部署Django專案。
準備工作
建立或已有ECS執行個體,ECS執行個體必須滿足以下條件。
作業系統必須為Alibaba Cloud Linux 3/2、CentOS 7/8、Ubuntu 22/20/18。
已指派公網IP或綁定Elastic IP Address(EIP),具體操作,請參見開通公網。
安全性群組的入方向添加安全性群組規則並允許存取22、80、8001和8002連接埠。具體操作,請參見添加安全性群組規則。
說明
8001連接埠為測試uWSGI服務。
8002連接埠為測試Django專案。
已安裝Python 3。
回顯資訊如下所示。

已安裝Nginx。如需安裝,請參見安裝Nginx環境。
步驟一:部署uWSGI
執行以下命令,安裝uWSGI。
如果回顯資訊如下所示,表示uWSGI已安裝成功。

執行以下命令,建立測試目錄。
本樣本以建立/home/myblog
目錄為例,您可以根據需求自訂檔案路徑。
執行以下命令,建立並編輯測試程式檔案test.py
。
cd /home/myblog
sudo vim test.py
輸入i
進入編輯模式,將以下內容複寫到檔案中。
def application(env,start_response):
start_response('200 ok',[('Content-Type','text/html')])
return [b"Hello World"]
按Esc
鍵,輸入:wq
儲存並退出檔案。
執行以下命令,測試回合訪問。
回顯資訊如下圖所示。

在本地電腦瀏覽器的地址欄輸入http://<ECS執行個體的公網IP地址>:8001
,訪問測試檔案。
出現如下頁面,表示uWSGI環境搭建成功。

同時後台回顯資訊如下。

步驟二:部署Django
執行以下命令,安裝Django。
安裝成功回顯資訊如下圖所示。
執行以下命令,建立專案。
本樣本以建立專案檔uwsgi_project
為例,您可以根據需求自訂檔案夾。
執行以下命令,編輯settings.py
檔案。
sudo vim /home/myblog/uwsgi_project/uwsgi_project/settings.py
將ALLOWED_HOSTS = [ ]
修改為ALLOWED_HOSTS = ["*"]
。
說明
["*"]
表示允許任何IP地址訪問,否則訪問會被拒絕,具體以您實際環境為準。

將DATABASES
中的內容注釋。

修改完成後,按Esc
鍵,輸入:wq
儲存並退出檔案。執行以下命令,啟動Django環境。
cd /home/myblog/uwsgi_project
sudo python3 manage.py runserver 0.0.0.0:8002
在本地電腦瀏覽器的地址欄輸入http://<ECS執行個體的公網IP地址>:8002
,即可訪問相關Django頁面。

步驟三:配置Nginx、uWSGI與Django的整合
您需要依次修改Nginx和uWSGI配置,目的是在Nginx和uWSGI設定檔中寫入Django專案、Nginx和uWSGI的位置或者版本資訊,讓這個流程可以運轉起來。
-
(可選)如需部署您的Django專案,將本地的專案上傳到伺服器,同時修改Django配置,操作如下。
重要
如果您僅想展示基本的Django網頁,測試此方案的可行性,請跳過此步驟。
將本地的專案上傳至伺服器,請參見上傳和下載檔案(SFTP)。
執行以下命令,修改Django設定檔settings.py
。
#例如 uwsgi_project 為您的專案名稱
sudo vim /home/myblog/uwsgi_project/uwsgi_project/settings.py
按i
鍵,進入編輯模式。
將DEBUG = True
修改為DEBUG = False
。

在settings.py
檔案開頭添加如下參數。
在settings.py
檔案末尾添加如下參數。
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
為什麼添加STATIC_ROOT = os.path.join(BASE_DIR, "static/")
?
按Esc
鍵,輸入:wq
儲存並退出檔案。
執行如下命令,收集所有靜態檔案。
sudo python3 manage.py collectstatic

執行以下命令,開啟Nginx設定檔。
按i
鍵進入編輯模式,在server
中修改或添加以下參數。
upstream django {
server 127.0.0.1:8001;
}
server {
listen 8002;
server_name test;
charset utf-8;
location /static {
autoindex on;
alias /home/myblog/uwsgi_project/static;
}
location / {
uwsgi_pass 127.0.0.1:8001;
include uwsgi_params;
include /etc/nginx/uwsgi_params;
index index.html index.htm;
client_max_body_size 35m;
}
}
具體位置如下圖所示。

執行以下命令,建立日誌目錄,uWSGI 將會作為守護進程在後台運行,並將它的輸出重新導向到這個記錄檔中。
sudo mkdir -p /var/log/uwsgi/ #您可根據實際情況修改。
執行以下命令,建立uWSGI設定檔uwsgi_config.ini
。
sudo vim uwsgi_config.ini
按i
鍵進入編輯模式,在檔案中添加以下參數。編輯完成後,按Esc
鍵,輸入:wq
儲存並退出檔案。
[uwsgi]
#此處的8001連接埠需要和nginx設定檔中定義的uwsgi_pass連接埠一致。
socket = 127.0.0.1:8001
#指定專案目錄,根據您的實際專案修改該路徑。
chdir = /home/myblog/uwsgi_project/
#指定Django的wsgi file檔案,根據專案修改。
wsgi-file = uwsgi_project/wsgi.py
#最大背景工作處理序。
processes = 4
#每個背景工作處理序processes啟動後開啟的線程個數。
threads = 2
#環境退出時自動清理。
vacuum = true
#設定用於uwsgi包解析的內部緩衝區大小為64k,預設是4k。
buffer-size = 65536
#記錄檔路徑,請確保此路徑可寫。根據您的實際專案修改該路徑。
daemonize = /var/log/uwsgi/uwsgi_project.log
#確保線程支援已啟用。
enable-threads = true
啟動程式。
執行以下命令,重啟Nginx服務。
sudo systemctl restart nginx
執行以下命令,重啟uWSGI服務。
執行以下命令,停止已啟動的uWSGI程式。
ps aux |grep uwsgi
sudo kill -9 13187 #13187指通過上述命令擷取的pid,具體pid以您現場即時擷取的為準

執行以下命令,啟動uWSGI服務。
同時後台回顯資訊如下。

在本地電腦瀏覽器的地址欄輸入http://<ECS執行個體的公網IP地址>
:8002,即可訪問相關Django頁面。
說明
當部署您自己的專案時,訪問網站將會直接呈現您的首頁。

常見問題
安裝uWSGI報錯
如果在安裝中出現如下圖所示的報錯資訊,請您執行以下命令後,重新安裝uWSGI。
