如何使用 Django 與 Apache 和 mod_wsgi
¶
使用 Apache 和 mod_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 常駐程式模式,您可以將 lang
和 locale
選項新增至 WSGIDaemonProcess
指令
WSGIDaemonProcess example.com lang='en_US.UTF-8' locale='en_US.UTF-8'
如需詳細資訊,請參閱 Unicode 參考指南的檔案章節。
使用 mod_wsgi
常駐程式模式¶
「常駐程式模式」是執行 mod_wsgi 的建議模式(在非 Windows 平台上)。若要建立必要的常駐程式程序群組並委派 Django 實例在其中執行,您需要新增適當的 WSGIDaemonProcess
和 WSGIProcessGroup
指令。如果您使用常駐程式模式,上述設定還需要進一步變更,您不能使用 WSGIPythonPath
;相反地,您應該使用 WSGIDaemonProcess
的 python-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.txt
、favicon.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.staticfiles
在 INSTALLED_APPS
中時,Django 開發伺服器會自動提供管理應用程式(以及任何其他已安裝的應用程式)的靜態檔案。但是,當您使用任何其他伺服器配置時,情況並非如此。您有責任設定 Apache 或您使用的任何 Web 伺服器來提供管理檔案。
管理檔案位於 Django 發行版的 (django/contrib/admin/static/admin) 中。
我們強烈建議使用 django.contrib.staticfiles
來處理管理檔案(連同上一節概述的 Web 伺服器;這表示使用 collectstatic
管理命令將靜態檔案收集到 STATIC_ROOT
中,然後設定您的 Web 伺服器以在 STATIC_URL
提供 STATIC_ROOT
),但以下是其他三種方法
從您的文件根目錄內建立管理靜態檔案的符號連結(這可能需要在您的 Apache 設定中使用
+FollowSymLinks
)。使用
Alias
指令,如上所示,將適當的 URL(可能是STATIC_URL
+admin/
)別名為管理檔案的實際位置。複製管理靜態檔案,使其位於您的 Apache 文件根目錄內。
從 Apache 針對 Django 的使用者資料庫進行驗證¶
Django 提供一個處理常式,允許 Apache 直接針對 Django 的驗證後端驗證使用者。請參閱 mod_wsgi 驗證文件。