如何使用 Django 與 Apache 和 mod_wsgi

使用 Apachemod_wsgi 部署 Django 是一種經過考驗且可靠的方式,可將 Django 投入生產環境。

mod_wsgi 是一個 Apache 模組,可以託管任何 Python WSGI 應用程式,包括 Django。Django 可以與任何支援 mod_wsgi 的 Apache 版本搭配使用。

mod_wsgi 官方文件是您了解如何使用 mod_wsgi 的所有詳細資訊的來源。您可能會想從安裝與設定文件開始。

基本設定

一旦您安裝並啟用 mod_wsgi 後,請編輯您的 Apache 伺服器 httpd.conf 檔案並新增以下內容。

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonHome /path/to/venv
WSGIPythonPath /path/to/mysite.com

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

WSGIScriptAlias 行的第一部分是您想要提供應用程式的基礎 URL 路徑(/ 表示根 URL),而第二部分是您系統上「WSGI 檔案」的位置(通常在您的專案套件內,本例中為 mysite)。這會告訴 Apache 使用該檔案中定義的 WSGI 應用程式來服務給定 URL 下的任何請求。

如果您將專案的 Python 相依性安裝在 虛擬環境 中,請使用 WSGIPythonHome 新增路徑。如需更多詳細資訊,請參閱 mod_wsgi 虛擬環境指南

WSGIPythonPath 行確保您的專案套件可在 Python 路徑上匯入;換句話說,import mysite 可以運作。

<Directory> 部分確保 Apache 可以存取您的 wsgi.py 檔案。

接下來,我們需要確保存在具有 WSGI 應用程式物件的 wsgi.py。從 Django 1.4 版開始,startproject 會為您建立一個;否則,您需要自行建立。請參閱 WSGI 概觀文件,了解您應該放入此檔案的預設內容,以及您還可以新增的其他內容。

警告

如果多個 Django 網站在單一 mod_wsgi 程序中執行,則它們都會使用最先執行的網站的設定。這可以透過變更來解決

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

wsgi.py 中,改為

os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"

或透過使用 mod_wsgi 常駐程式模式並確保每個網站都在其自己的常駐程式程序中執行。

修正檔案上傳的 UnicodeEncodeError

如果您在上傳或寫入包含非 ASCII 字元的檔案名稱或內容的檔案時收到 UnicodeEncodeError,請確保 Apache 設定為支援 UTF-8 編碼

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

這個設定的常見位置是 /etc/apache2/envvars

或者,如果您使用 mod_wsgi 常駐程式模式,您可以將 langlocale 選項新增至 WSGIDaemonProcess 指令

WSGIDaemonProcess example.com lang='en_US.UTF-8' locale='en_US.UTF-8'

如需詳細資訊,請參閱 Unicode 參考指南的檔案章節。

使用 mod_wsgi 常駐程式模式

「常駐程式模式」是執行 mod_wsgi 的建議模式(在非 Windows 平台上)。若要建立必要的常駐程式程序群組並委派 Django 實例在其中執行,您需要新增適當的 WSGIDaemonProcessWSGIProcessGroup 指令。如果您使用常駐程式模式,上述設定還需要進一步變更,您不能使用 WSGIPythonPath;相反地,您應該使用 WSGIDaemonProcesspython-path 選項,例如

WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
WSGIProcessGroup example.com

如果您想在子目錄中提供專案(本例中為 https://example.com/mysite),您可以將 WSGIScriptAlias 新增至以上設定

WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com

如需設定常駐程式模式的詳細資訊,請參閱 mod_wsgi 官方文件。

提供檔案

Django 本身不提供檔案;它將這項工作留給您選擇的任何 Web 伺服器。

我們建議使用單獨的 Web 伺服器(即,不是也執行 Django 的伺服器)來提供媒體。以下是一些不錯的選擇

但是,如果您別無選擇,只能在與 Django 相同的 Apache VirtualHost 上提供媒體檔案,您可以設定 Apache 將某些 URL 作為靜態媒體提供,而其他 URL 則使用 mod_wsgi 介面提供給 Django。

此範例在網站根目錄設定 Django,但提供 robots.txtfavicon.ico 以及 /static//media/ URL 空間中的任何內容作為靜態檔案。所有其他 URL 將使用 mod_wsgi 提供

Alias /robots.txt /path/to/mysite.com/static/robots.txt
Alias /favicon.ico /path/to/mysite.com/static/favicon.ico

Alias /media/ /path/to/mysite.com/media/
Alias /static/ /path/to/mysite.com/static/

<Directory /path/to/mysite.com/static>
Require all granted
</Directory>

<Directory /path/to/mysite.com/media>
Require all granted
</Directory>

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

提供管理檔案

django.contrib.staticfilesINSTALLED_APPS 中時,Django 開發伺服器會自動提供管理應用程式(以及任何其他已安裝的應用程式)的靜態檔案。但是,當您使用任何其他伺服器配置時,情況並非如此。您有責任設定 Apache 或您使用的任何 Web 伺服器來提供管理檔案。

管理檔案位於 Django 發行版的 (django/contrib/admin/static/admin) 中。

我們強烈建議使用 django.contrib.staticfiles 來處理管理檔案(連同上一節概述的 Web 伺服器;這表示使用 collectstatic 管理命令將靜態檔案收集到 STATIC_ROOT 中,然後設定您的 Web 伺服器以在 STATIC_URL 提供 STATIC_ROOT),但以下是其他三種方法

  1. 從您的文件根目錄內建立管理靜態檔案的符號連結(這可能需要在您的 Apache 設定中使用 +FollowSymLinks)。

  2. 使用 Alias 指令,如上所示,將適當的 URL(可能是 STATIC_URL + admin/)別名為管理檔案的實際位置。

  3. 複製管理靜態檔案,使其位於您的 Apache 文件根目錄內。

從 Apache 針對 Django 的使用者資料庫進行驗證

Django 提供一個處理常式,允許 Apache 直接針對 Django 的驗證後端驗證使用者。請參閱 mod_wsgi 驗證文件

返回頂部