本文由簡體中文內容自動轉碼而成。阿里雲不保證此自動轉碼的準確性、完整性及時效性。本文内容請以簡體中文版本為準。

使用Nginx+uWSGI部署Django專案

更新時間:2025-03-06 19:00

Django是一個功能豐富、高效且安全的架構,適合各種規模的Web應用程式開發。它不僅能夠加速開發過程,還能確保應用程式的品質和穩定性。本文介紹如何在Linux伺服器中使用Nginx+uWSGI部署Django專案。

產品優勢

使用Nginx和uWSGI部署Django專案,能夠高效處理高並發請求、快速提供靜態資源、確保運行、增強安全性以保護敏感性資料,並支援靈活擴充以應對流量高峰,從而顯著提升使用者體驗和商務持續性。

  • 高效能:Nginx能處理大量並發串連;而uWSGI專註於Python Web應用的高效執行,兩者結合確保Django程式的快速響應。

  • 易於管理和配置:簡單直觀的配置文法您可以快速設定和調整伺服器參數,適應不同的業務需求變化,降低營運複雜度。

  • 模組化設計:高度模組化的特性允許根據具體需求選擇必要的組件,節省資源的同時提高了系統的靈活性和效率。

方案架構

  1. 使用者請求:瀏覽器發送HTTP請求。

  2. Nginx:接收請求,如果是靜態檔案,直接返回;否則,轉寄給uWSGI。

  3. uWSGI:接收請求並通過WSGI協議傳遞給Django應用。

  4. Django:處理商務邏輯,可能涉及資料庫查詢或模板渲染,產生響應內容。

  5. 返迴響應:Django將處理結果交給uWSGI,uWSGI負責將這些資訊打包成適當的格式,再傳遞迴Nginx。

快速部署

您可以單擊一鍵運行進入Terraform Explorer查看並執行Terraform代碼,從而實現自動化地在Alibaba Cloud Linux執行個體中使用Nginx與uWSGI部署Django專案。

  • 選擇一個已有Alibaba Cloud Linux執行個體:參數ecs_instance_id填入已有執行個體ID,依次點擊發起調試 > 預覽並執行

  • 建立執行個體:參數ecs_instance_id不設定任何值,依次點擊發起調試 > 預覽並執行

準備工作

建立或已有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。

    您可通過以下命令查看已安裝的版本資訊,如需安裝,請參見部署Python環境

    python3 --version

    回顯資訊如下所示。

    image

  • 已安裝Nginx。如需安裝,請參見安裝Nginx環境

重要

請您務必滿足以上所有條件。

步驟一:部署uWSGI

  1. 執行以下命令,安裝uWSGI。

    sudo pip3 install uwsgi

    如果回顯資訊如下所示,表示uWSGI已安裝成功。

    image

  2. 執行以下命令,建立測試目錄。

    本樣本以建立/home/myblog目錄為例,您可以根據需求自訂檔案路徑。

    sudo mkdir /home/myblog
  3. 執行以下命令,建立並編輯測試程式檔案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儲存並退出檔案。

  4. 執行以下命令,測試回合訪問。

    • Alibaba Cloud Linux 3/2 、CentOS 7/8

      sudo /usr/local/bin/uwsgi --http :8001 --wsgi-file test.py
    • Ubuntu 22/20/18

      sudo uwsgi --http :8001 --wsgi-file test.py

    回顯資訊如下圖所示。

    image

  5. 在本地電腦瀏覽器的地址欄輸入http://<ECS執行個體的公網IP地址>:8001,訪問測試檔案。

    • 出現如下頁面,表示uWSGI環境搭建成功。

      image

    • 同時後台回顯資訊如下。

      image

步驟二:部署Django

  1. 執行以下命令,安裝Django。

    sudo pip3 install Django

    安裝成功回顯資訊如下圖所示。image

  2. 執行以下命令,建立專案。

    本樣本以建立專案檔uwsgi_project為例,您可以根據需求自訂檔案夾。

    • Alibaba Cloud Linux 3/2 、CentOS 7/8

      sudo /usr/local/bin/django-admin.py startproject uwsgi_project
    • Ubuntu 22/20/18

      sudo /usr/local/bin/django-admin startproject uwsgi_project
  3. 執行以下命令,編輯settings.py檔案。

    sudo vim /home/myblog/uwsgi_project/uwsgi_project/settings.py
    1. ALLOWED_HOSTS = [ ]修改為ALLOWED_HOSTS = ["*"]

      說明

      ["*"]表示允許任何IP地址訪問,否則訪問會被拒絕,具體以您實際環境為準。

      image

    2. DATABASES中的內容注釋。

      image

      重要
      • DATABASES用於指定Django專案將要使用的資料庫設定。本執行個體中未使用資料庫,所以需要注釋。

      • 在實際專案中您可按需配置。

  4. 修改完成後,按Esc鍵,輸入:wq儲存並退出檔案。執行以下命令,啟動Django環境。

    cd /home/myblog/uwsgi_project
    sudo python3 manage.py runserver 0.0.0.0:8002
  5. 在本地電腦瀏覽器的地址欄輸入http://<ECS執行個體的公網IP地址>:8002,即可訪問相關Django頁面。

    image

步驟三:配置Nginx、uWSGI與Django的整合

您需要依次修改Nginx和uWSGI配置,目的是在Nginx和uWSGI設定檔中寫入Django專案、Nginx和uWSGI的位置或者版本資訊,讓這個流程可以運轉起來。

  1. (可選)如需部署您的Django專案,將本地的專案上傳到伺服器,同時修改Django配置,操作如下。

    重要

    如果您僅想展示基本的Django網頁,測試此方案的可行性,請跳過此步驟。

    1. 將本地的專案上傳至伺服器,請參見上傳和下載檔案(SFTP)

    2. 執行以下命令,修改Django設定檔settings.py

      #例如 uwsgi_project 為您的專案名稱
      sudo vim /home/myblog/uwsgi_project/uwsgi_project/settings.py
    3. i鍵,進入編輯模式。

    4. DEBUG = True修改為DEBUG = False

      image

    5. settings.py檔案開頭添加如下參數。

      import os

      為什麼添加import os

      • 範圍問題:確保os模組在整個settings.py檔案中都是可用的。如果你在檔案的中間或者末尾才匯入os,那麼在此之前使用os的地方就會拋出NameError異常。

      • 效能最佳化:解譯器只需要解析一次匯入語句,而不是在遇到時再解析。

    6. settings.py檔案末尾添加如下參數。

      STATIC_ROOT = os.path.join(BASE_DIR, "static/")

      為什麼添加STATIC_ROOT = os.path.join(BASE_DIR, "static/")

      • 靜態檔案收集STATIC_ROOT用於指定一個絕對路徑,在這個路徑下,Django將收集所有的靜態檔案(如CSS、JavaScript、圖片等),以便在生產環境中由Web伺服器提供服務。這個設定通常放在檔案的末尾,因為它依賴於之前已經定義好的變數。

      • 避免循環參考:如果某些設定項依賴於其他的設定項,將它們放置在檔案的不同位置可以避免潛在的循環參考問題。

    7. Esc鍵,輸入:wq儲存並退出檔案。

    8. 執行如下命令,收集所有靜態檔案。

      sudo python3 manage.py collectstatic 

      image

  2. 執行以下命令,開啟Nginx設定檔。

    • Alibaba Cloud Linux 3/2 、CentOS 7/8

      sudo vim /etc/nginx/nginx.conf
    • Ubuntu 22/20/18

      sudo vim /etc/nginx/sites-enabled/default
  3. i鍵進入編輯模式,在server中修改或添加以下參數。

        upstream django {
            #具體連接埠必須與您uWSGI設定檔中定義的連接埠一致
            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伺服器,這裡的地址與upstream塊中的定義相匹配。
                uwsgi_pass 127.0.0.1:8001;
                # 包含 uwsgi 參數配置
                include uwsgi_params; 
                # Nginx內建的uWSGI參數檔案,具體目錄請根據實際情況修改
                include /etc/nginx/uwsgi_params; 
                # 指定預設的索引檔案。
                index index.html index.htm;
                client_max_body_size 35m;
            }
        }

    具體位置如下圖所示。

    image

  4. 執行以下命令,建立日誌目錄,uWSGI 將會作為守護進程在後台運行,並將它的輸出重新導向到這個記錄檔中。

    sudo mkdir -p /var/log/uwsgi/  #您可根據實際情況修改。
  5. 執行以下命令,建立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                           
  6. 啟動程式。

    1. 執行以下命令,重啟Nginx服務。

      sudo systemctl restart nginx
    2. 執行以下命令,重啟uWSGI服務。

      1. 執行以下命令,停止已啟動的uWSGI程式。

        ps aux |grep uwsgi
        sudo kill -9 13187 #13187指通過上述命令擷取的pid,具體pid以您現場即時擷取的為準

        image

      2. 執行以下命令,啟動uWSGI服務。

        • Alibaba Cloud Linux 3/2 、CentOS 7/8

          uwsgi --ini uwsgi_config.ini
        • Ubuntu 22/20/18

          sudo uwsgi --ini uwsgi_config.ini

        同時後台回顯資訊如下。

        image

  7. 在本地電腦瀏覽器的地址欄輸入http://<ECS執行個體的公網IP地址>:8002,即可訪問相關Django頁面。

    說明

    當部署您自己的專案時,訪問網站將會直接呈現您的首頁。

    image

常見問題

安裝uWSGI報錯

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

  • Alibaba Cloud Linux 3/2 、CentOS 7/8

    sudo yum -y install python3-devel.x86_64
  • Ubuntu 22/20/18

    sudo apt -y install python3-devel.x86_64

image

  • 本頁導讀 (1, M)
  • 產品優勢
  • 方案架構
  • 快速部署
  • 準備工作
  • 步驟一:部署uWSGI
  • 步驟二:部署Django
  • 步驟三:配置Nginx、uWSGI與Django的整合
  • 常見問題
  • 安裝uWSGI報錯
文檔反饋
phone 聯絡我們

立即和Alibaba Cloud在線服務人員進行交談,獲取您想了解的產品信息以及最新折扣。

alicare alicarealicarealicare