Django的主要部署平臺(tái)是WSGI,這是Web服務(wù)器和應(yīng)用程序的Python標(biāo)準(zhǔn)。
Django的startproject管理命令為您設(shè)置了一個(gè)最小的默認(rèn)WSGI配置,您可以根據(jù)項(xiàng)目的需要對(duì)其進(jìn)行調(diào)整,并指導(dǎo)任何符合WSGI的應(yīng)用服務(wù)器使用。
Django包括以下WSGI服務(wù)器的入門文檔:
使用WSGI進(jìn)行部署的關(guān)鍵概念是application應(yīng)用服務(wù)器用來與您的代碼進(jìn)行通信的Callable。通常application以在服務(wù)器可訪問的Python模塊中命名的對(duì)象的形式提供。
該startproject命令將創(chuàng)建一個(gè)/wsgi.py包含此類application可調(diào)用文件的文件 。
Django的開發(fā)服務(wù)器和生產(chǎn)WSGI部署都使用了它。
WSGI服務(wù)器application從其配置中獲取可調(diào)用對(duì)象的路徑。Django的內(nèi)置服務(wù)器(即runserver 命令)從WSGI_APPLICATION設(shè)置中讀取它。默認(rèn)情況下,它設(shè)置為.wsgi.application,它指向中的application 可調(diào)用對(duì)象/wsgi.py。
當(dāng)WSGI服務(wù)器加載您的應(yīng)用程序時(shí),Django需要導(dǎo)入settings模塊-定義整個(gè)應(yīng)用程序的地方。
Django使用 DJANGO_SETTINGS_MODULE環(huán)境變量以找到適當(dāng)?shù)脑O(shè)置模塊。它必須包含指向設(shè)置模塊的虛線路徑。您可以將不同的值用于開發(fā)和生產(chǎn)。這完全取決于您如何組織設(shè)置。
如果未設(shè)置此變量,則默認(rèn)wsgi.py將其設(shè)置為 mysite.settings,其中mysite是項(xiàng)目的名稱。這就是 runserver默認(rèn)情況下發(fā)現(xiàn)默認(rèn)設(shè)置文件的方式。
注意:由于環(huán)境變量是進(jìn)程范圍的,因此當(dāng)您在同一進(jìn)程中運(yùn)行多個(gè)Django站點(diǎn)時(shí),這將無效。這與mod_wsgi一起發(fā)生。
為避免此問題,請(qǐng)對(duì)每個(gè)站點(diǎn)在自己的守護(hù)進(jìn)程中使用mod_wsgi的守護(hù)程序模式,或通過在中強(qiáng)制執(zhí)行來覆蓋環(huán)境中的值。os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"``wsgi.py
要應(yīng)用WSGI中間件,您可以包裝應(yīng)用程序?qū)ο?。例如,您可以在以下位置添加這些行wsgi.py:
from helloworld.wsgi import HelloWorldApplication
application = HelloWorldApplication(application)
如果您想將Django應(yīng)用程序與另一個(gè)框架的WSGI應(yīng)用程序結(jié)合使用,也可以用自定義WSGI應(yīng)用程序替換Django WSGI應(yīng)用程序,該應(yīng)用程序以后將其委托給Django WSGI應(yīng)用程序。
Gunicorn(“綠色獨(dú)角獸”)是用于UNIX的純Python WSGI服務(wù)器。它沒有依賴性,可以使用安裝pip。
通過運(yùn)行安裝gunicorn 。有關(guān)更多詳細(xì)信息,請(qǐng)參見gunicorn文檔。
python -m pip install gunicorn
在Gunicorn中將Django作為通用WSGI應(yīng)用程序運(yùn)行
安裝Gunicorn后,將gunicorn提供一個(gè)命令來啟動(dòng)Gunicorn服務(wù)器進(jìn)程。gunicorn的最簡(jiǎn)單調(diào)用是傳遞包含名為的WSGI應(yīng)用程序?qū)ο蟮哪K的位置application,對(duì)于典型的Django項(xiàng)目,該對(duì)象應(yīng) 類似于:
gunicorn myproject.wsgi
這將啟動(dòng)一個(gè)進(jìn)程,該進(jìn)程運(yùn)行一個(gè)正在偵聽的線程127.0.0.1:8000。它要求您的項(xiàng)目位于Python路徑上;確保該命令最簡(jiǎn)單的方法是在與manage.py文件相同的目錄中運(yùn)行此命令。
有關(guān)其他提示,請(qǐng)參見Gunicorn的部署文檔。
uWSGI是使用純C編碼的快速,自修復(fù)且對(duì)開發(fā)人員/ sysadmin友好的應(yīng)用程序容器服務(wù)器。
也可以看看
uWSGI文檔提供了一個(gè)涵蓋Django,nginx和uWSGI(許多可能的部署設(shè)置)的教程。以下文檔重點(diǎn)介紹如何將Django與uWSGI集成。
uWSGI Wiki描述了幾種安裝過程。使用Python軟件包管理器pip,您可以通過單個(gè)命令安裝任何uWSGI版本。例如:
# Install current stable version.
$ python -m pip install uwsgi
?
# Or install LTS (long term support).
$ python -m pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz
uWSGI在客戶端-服務(wù)器模型上運(yùn)行。您的Web服務(wù)器(例如nginx,Apache)與django-uwsgi“工作者”進(jìn)程進(jìn)行通信以提供動(dòng)態(tài)內(nèi)容。
uWSGI支持多種配置過程的方式。
這是啟動(dòng)uWSGI服務(wù)器的示例命令:
uwsgi --chdir=/path/to/your/project \
--module=mysite.wsgi:application \
--env DJANGO_SETTINGS_MODULE=mysite.settings \
--master --pidfile=/tmp/project-master.pid \
--socket=127.0.0.1:49152 \ # can also be a file
--processes=5 \ # number of worker processes
--uid=1000 --gid=2000 \ # if root, uwsgi can drop privileges
--harakiri=20 \ # respawn processes taking more than 20 seconds
--max-requests=5000 \ # respawn processes after serving 5000 requests
--vacuum \ # clear environment on exit
--home=/path/to/virtual/env \ # optional path to a virtual environment
--daemonize=/var/log/uwsgi/yourproject.log # background the process
假設(shè)您有一個(gè)名為的頂級(jí)項(xiàng)目包mysite,并且mysite/wsgi.py其中包含一個(gè)包含WSGI application 對(duì)象的模塊。如果您使用Django的最新版本(使用您自己的項(xiàng)目名稱代替)運(yùn)行,這將是您的布局。如果該文件不存在,則需要?jiǎng)?chuàng)建它。請(qǐng)參閱“ 如何使用WSGI進(jìn)行部署”文檔,以獲取應(yīng)放在此文件中的默認(rèn)內(nèi)容以及可以添加的其他內(nèi)容。django-admin startproject mysite``mysite
Django特定的選項(xiàng)如下:
示例ini配置文件:
[uwsgi]
chdir=/path/to/your/project
module=mysite.wsgi:application
master=True
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/yourproject.log
ini配置文件用法示例:
uwsgi --ini uwsgi.ini
修復(fù)UnicodeEncodeError文件上傳
如果UnicodeEncodeError在上傳文件名包含非ASCII字符的文件時(shí)看到,請(qǐng)確保將uWSGI配置為接受非ASCII文件名,方法是將其添加到您的uwsgi.ini:
env = LANG=en_US.UTF-8
有關(guān)詳細(xì)信息,請(qǐng)參見Unicode參考指南的“ 文件”部分。
請(qǐng)參閱有關(guān)管理uWSGI進(jìn)程的uWSGI文檔,以獲取有關(guān)啟動(dòng),停止和重新加載uWSGI工作程序的信息。
使用Apache和mod_wsgi部署Django 是使Django投入生產(chǎn)的一種久經(jīng)考驗(yàn)的方法。
mod_wsgi是一個(gè)Apache模塊,可以承載任何Python WSGI應(yīng)用程序,包括Django。Django可以與任何支持mod_wsgi的Apache版本一起使用。
在官方的mod_wsgi文檔是你的所有關(guān)于如何使用mod_wsgi的詳細(xì)信息來源。您可能需要從安裝和配置文檔開始。
安裝并激活mod_wsgi后,請(qǐng)編輯Apache服務(wù)器的 httpd.conf文件并添加以下內(nèi)容。
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行的第一位是您要在其上為應(yīng)用程序提供服務(wù)的基本URL路徑(/表示根URL),第二位是“ WSGI文件”的位置–參見下文–在系統(tǒng)上,通常在項(xiàng)目?jī)?nèi)部包(mysite在此示例中)。這告訴Apache使用該文件中定義的WSGI應(yīng)用程序?yàn)榻o定URL下的任何請(qǐng)求提供服務(wù)。
如果您將項(xiàng)目的Python依賴項(xiàng)安裝在中,請(qǐng)使用添加路徑。有關(guān)更多詳細(xì)信息,請(qǐng)參見mod_wsgi虛擬環(huán)境指南。virtual environmentWSGIPythonHome
該WSGIPythonPath行確保您的項(xiàng)目包可用于在Python路徑上導(dǎo)入;換句話說,那行得通。import mysite
該`部分確保Apache可以訪問您的wsgi.py` 文件。
接下來,我們需要確保wsgi.pyWSGI應(yīng)用程序?qū)ο蟠嬖?。從Django 1.4版開始,startproject將為您創(chuàng)建一個(gè)。否則,您將需要?jiǎng)?chuàng)建它。請(qǐng)參閱WSGI概述文檔,以獲取應(yīng)放在此文件中的默認(rèn)內(nèi)容以及可以添加的其他內(nèi)容。
警告:如果在單個(gè)mod_wsgi進(jìn)程中運(yùn)行多個(gè)Django站點(diǎn),則所有站點(diǎn)都將使用碰巧先運(yùn)行的站點(diǎn)的設(shè)置??梢酝ㄟ^以下方法解決:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")
在中wsgi.py,至:
os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"
或通過使用mod_wsgi守護(hù)程序模式并確保每個(gè)站點(diǎn)都在其自己的守護(hù)進(jìn)程中運(yùn)行。
修復(fù)UnicodeEncodeError文件上傳
如果UnicodeEncodeError在上傳文件名包含非ASCII字符的文件時(shí)看到,請(qǐng)確保Apache配置為接受非ASCII文件名:
export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'
放置此配置的常見位置是/etc/apache2/envvars。
有關(guān)詳細(xì)信息,請(qǐng)參見Unicode參考指南的“ 文件”部分。
建議使用“守護(hù)程序模式”運(yùn)行mod_wsgi(在非Windows平臺(tái)上)。要?jiǎng)?chuàng)建所需的守護(hù)進(jìn)程組并委派Django實(shí)例在其中運(yùn)行,您將需要添加適當(dāng)?shù)?WSGIDaemonProcess和WSGIProcessGroup指令。如果您使用守護(hù)程序模式,則對(duì)上述配置的進(jìn)一步更改是您不能使用WSGIPythonPath;相反,您應(yīng)該使用的python-path選項(xiàng) WSGIDaemonProcess,例如:
WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
WSGIProcessGroup example.com
如果要在子目錄中服務(wù)項(xiàng)目(https://example.com/mysite在此示例中),則可以添加WSGIScriptAlias 到上面的配置中:
WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com
有關(guān)設(shè)置守護(hù)程序模式的詳細(xì)信息,請(qǐng)參見mod_wsgi官方文檔。
Django本身不提供文件;它將工作交給您選擇的任何Web服務(wù)器。
我們建議使用單獨(dú)的Web服務(wù)器(即未同時(shí)運(yùn)行Django的服務(wù)器)來提供媒體服務(wù)。這里有一些不錯(cuò)的選擇:
但是,如果您別無選擇,只能在與VirtualHostDjango 相同的Apache上提供媒體文件,則 可以設(shè)置Apache以將某些URL用作靜態(tài)媒體,而將另一些URL使用Django的mod_wsgi接口提供。
這個(gè)例子設(shè)置的Django在站點(diǎn)根目錄,但發(fā)球robots.txt, favicon.ico和在什么/static/和/media/URL空間作為靜態(tài)文件。所有其他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中時(shí)INSTALLED_APPS,Django開發(fā)服務(wù)器會(huì)自動(dòng)提供admin應(yīng)用程序(以及所有其他已安裝的應(yīng)用程序)的靜態(tài)文件。但是,當(dāng)您使用任何其他服務(wù)器布置時(shí),情況并非如此。您負(fù)責(zé)設(shè)置Apache或您使用的任何Web服務(wù)器來提供管理文件。
管理文件位于django/contrib/admin/static/adminDjango發(fā)行版的()中。
我們強(qiáng)烈建議您使用django.contrib.staticfiles處理管理文件(如上一節(jié)中列出Web服務(wù)器一起,使用這種手段collectstatic的管理命令收集的靜態(tài)文件STATIC_ROOT,然后配置你的Web服務(wù)器服務(wù)STATIC_ROOT的STATIC_URL),但這里有三個(gè)其他方法:
Django提供了一個(gè)處理程序,允許Apache直接針對(duì)Django的身份驗(yàn)證后端對(duì)用戶進(jìn)行身份驗(yàn)證。
由于與多個(gè)Apache處理身份驗(yàn)證數(shù)據(jù)庫時(shí)保持同步是一個(gè)常見問題,因此可以將Apache配置為直接針對(duì)Django的身份驗(yàn)證系統(tǒng)進(jìn)行身份 驗(yàn)證。這需要Apache版本> = 2.2和mod_wsgi> = 2.0。例如:
注意:如果您已經(jīng)安裝了自定義用戶模型并希望使用此默認(rèn)身份驗(yàn)證處理程序,則它必須支持一個(gè)is_active 屬性。如果要使用基于組的授權(quán),則自定義用戶必須具有一個(gè)名為“組”的關(guān)系,該關(guān)系引用具有“名稱”字段的相關(guān)對(duì)象。如果您的自定義不符合這些要求,則還可以指定自己的自定義mod_wsgi身份驗(yàn)證處理程序。
注意:在以下配置中使用時(shí),假設(shè)您的Apache實(shí)例僅運(yùn)行一個(gè)Django應(yīng)用程序。如果您正在運(yùn)行多個(gè)Django應(yīng)用程序,請(qǐng)參閱mod_wsgi文檔的“ 定義應(yīng)用程序組”部分以獲取有關(guān)此設(shè)置的更多信息。WSGIApplicationGroup %{GLOBAL}
確保已安裝并激活了mod_wsgi,并且已按照步驟使用mod_wsgi設(shè)置Apache。
接下來,編輯您的Apache配置,以添加僅希望經(jīng)過身份驗(yàn)證的用戶才能查看的位置:
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com
?
WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}
?
<Location "/secret">
AuthType Basic
AuthName "Top Secret"
Require valid-user
AuthBasicProvider wsgi
WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
</Location>
該WSGIAuthUserScript指令告訴mod_wsgi check_password在指定的wsgi腳本中執(zhí)行該 功能,并傳遞從提示符處收到的用戶名和密碼。在此示例中,與 定義由django-admin startproject創(chuàng)建的應(yīng)用程序WSGIAuthUserScript的相同。WSGIScriptAlias
結(jié)合使用Apache 2.2和身份驗(yàn)證
確保mod_auth_basic和mod_authz_user已加載。
這些可能會(huì)靜態(tài)地編譯到Apache中,或者您可能需要使用LoadModule在您的中動(dòng)態(tài)加載它們httpd.conf:
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authz_user_module modules/mod_authz_user.so
最后,mysite.wsgi通過導(dǎo)入以下check_password 功能來編輯WSGI腳本,以將Apache的身份驗(yàn)證與站點(diǎn)的身份驗(yàn)證機(jī)制聯(lián)系起來:
import os
?
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
?
from django.contrib.auth.handlers.modwsgi import check_password
?
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
/secret/現(xiàn)在開始的請(qǐng)求將要求用戶進(jìn)行身份驗(yàn)證。
mod_wsgi 訪問控制機(jī)制文檔提供了其他詳細(xì)信息和有關(guān)替代身份驗(yàn)證方法的信息。
mod_wsgi還提供了將特定位置限制為組成員的功能。
在這種情況下,Apache配置應(yīng)如下所示:
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
?
WSGIProcessGroup %{GLOBAL}
WSGIApplicationGroup %{GLOBAL}
?
<Location "/secret">
AuthType Basic
AuthName "Top Secret"
AuthBasicProvider wsgi
WSGIAuthUserScript /path/to/mysite.com/mysite/wsgi.py
WSGIAuthGroupScript /path/to/mysite.com/mysite/wsgi.py
Require group secret-agents
Require valid-user
</Location>
為了支持該WSGIAuthGroupScript指令,相同的WSGI腳本 mysite.wsgi還必須導(dǎo)入該groups_for_user函數(shù),該函數(shù)返回給定用戶所屬的列表組。
from django.contrib.auth.handlers.modwsgi import check_password, groups_for_user
如果有需求/secret/,現(xiàn)在也需要用戶是“秘密特工”組的成員。
詳情參考: https://docs.djangoproject.com/en/3.0/
更多建議: