如何使用WSGI部署Django(1.8)

https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/

1. 如何使用WSGI部署Django(1.8)

Django的首選部署平臺是WSGI, web服務和應用的Python標準。

-- How to use Django with Apache and mod_wsgi
-- Authenticating against Django’s user database from Apache
-- How to use Django with Gunicorn
-- How to use Django with uWSGI

1.1. 應用程序對象 (The application object)


使用WSGI部署的關鍵概念是可調用應用程序,用於應用服務跟你的代碼交互,通常在一個python模塊中以一個對象命名的應用提供,對服務可見(可訪問)。

startproject命令創建了一個文件 <project_name>/wsgi.py, 其中包含了這樣一個可調用應用。

它既被Django的開發服務使用,也被生產的WSGI部署使用。

WSGI服務器從它們的配置中獲取可調用應用程序的路徑。Django的內建服務器,即runserver和runfcgi命令, 從WSGI_APPLICATION設置讀取。
默認的,它被設置爲<project_name>.wsgi.application,其指向<project_name>/wsgi.py中的可調用應用程序。

1.2. 配置settings模塊


當WSGI服務器加載了你的應用,Django需要import其settings模塊,其中定義了你的整個應用。

Django使用DJANGO_SETTINGS_MODULE環境變量來定位合適的settings模塊,它必須包含指向settings模塊的點分開的路徑(dotted path).
你可以在開發和生產環境使用不同的變量,這全取決於你如何組織你的配置。

如果此變量未設置,默認的wsgi.py設置其爲mysite.settings,mysite是你的項目。這就是runserver如何用默認的方式找到默認的settings的。

------------
* 注意

因爲環境變量是進程級的,如果你在相同進程運行多個Django站點,這將不能正常工作。這在mod_wsgi中可能發生。

爲避免這個問題,使用mod_wsgi的守護模式,在各自的守護進程中運行各站點,
或者通過在wsgi.py中強制設置os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"來覆蓋環境變量值。
------------

1.3. 應用WSGI中間件


要應用WSGI中間件你可以簡單的封裝應用程序對象。比如你可以在wsgi.py的底部添加幾行:
------------
from helloworld.wsgi import HelloWorldApplication
application = HelloWorldApplication(application)
------------

你也可以用自定義的WSGI應用替換Django的WSGI,之後代理到Django的WSGI應用,如果你想整合Django應用和另外一個框架的WSGI應用的話。

------------
* 注意

一些第三方的WSGI中間件在處理完請求後,並不調用響應對象的close. 
在這些情況下request_finished信號不被髮送. 這會導致到數據庫和memcache服務的閒置連接。
------------

2. 如何使用Apache和mod_wsgi部署Django

https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/modwsgi/

使用Apache和mod_wsgi部署Django,是將Django引入生產環境的一種已用且測試過的方式。

mod_wsgi是一個Apache模塊,可以負載任何Python的WSGI應用,包括Django. Django在任何支持mod_wsgi的Apache版本上都可以工作。
官方的mod_wsgi文檔非常棒,你可以從中找到關於如何使用mod_wsgi的所有細節。你很可能想從安裝和配置文檔開始。
http://modwsgi.readthedocs.org/en/develop/
http://modwsgi.readthedocs.org/en/develop/installation.html

2.1. 基本配置

一旦你安裝好mod_wsgi並且激活了,編輯你的Apache server的httpd.conf文件並添加下面的內容。

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

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

WSGIScriptAlias後第一個字段代表你希望你的應用服務的基本URL路徑(/代表根url), 第二個字段是"WSGI文件"在你係統上的路徑(見後),通常在你項目的包(目錄)內。
這裏(配置)告訴Apache,對於指定URL下的任何請求,使用WSGI文件內定義的WSGI應用來提供服務。

WSGIPythonPath確保你的項目包,對於Python的import路徑是可用的;換句話說,即import mysite能正常工作。

<Directory> 只是確保Apache能訪問你的wsgi.py文件。

下一步,我們要確保有WSGI應用對象的wsgi.py存在。對於Django1.4, startproject將已經爲你創建一個;否則,你將要手動創建。
參考WSGI概覽文檔關於你應該放到這個文件的默認內容,及其他可以加入的內容。
https://docs.djangoproject.com/en/1.8/howto/deployment/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配置爲接收非ASCII文件名:
export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'
添加此配置的通常位置是 /etc/apache2/envvars.

詳情參考Files一節關於Unicode的引用指南。
------------

2.2. Using a virtualenv


2.3. 使用mod_wsgi守護模式(daemon mode)

Daemon mode是運行mod_wsgi的一種推薦模式(在非Windows平臺上)。
爲創建所需的守護進程組,並將Django實例代理運行在其中,你需要添加適當的WSGIDaemonProcess和WSGIProcessGroup指令。
如果你使用守護模式,上面的配置還需要修改的地方是,你不能使用WSGIPythonPath; 而是爲WSGIDaemonProcess使用python-path選項,例如:
------------
WSGIDaemonProcess example.com python-path=/path/to/mysite.com:/path/to/venv/lib/python2.7/site-packages
WSGIProcessGroup example.com
------------

如果你想讓你的項目在一個子目錄提供服務(例如(http://example.com/mysite),你可以在上面的配置添加:
------------
WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com
------------

守護模式的詳情可以參考mod_wsgi官方文檔。
http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Delegation_To_Daemon_Process

2.4. 文件服務(Serving files)

Django自身不提供文件服務,而是把這個任務留給你選擇的任何Web服務器。

我們推薦使用一個單獨的服務,就是說,一個不同時運行Django的服務,用於媒體服務。這裏有一些好的選擇:
* Nginx
* A stripped-down version of Apache

然而,如果你沒有選擇而只能在運行Django的同一個Apache VirtualHost上提供媒體文件服務,你可以將Apache的一些URLs設置爲靜態文件服務,
而其他的作爲Django的mod_wsgi接口提供服務。

這裏的例子設置Django爲站點根目錄,但顯式地將robots.txt, favicon.ico, 任何的CSS文件, 及/static/和/media/ URL空間中的所有都作爲靜態文件服務.
所有其他URLs將服務爲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>
------------

2.5. admin文件服務


當django.contrib.staticfiles在INSTALLED_APPS中,Django開發服務器自動支持admin(及其他app)的靜態文件服務.
然而,當你使用其他服務器則不如此。在Apache或你使用的任何其他Web服務中,你需要自行配置。

admin文件存在於Django的(django/contrib/admin/static/admin)中。

我們強烈建議使用django.contrib.staticfiles來處理admin文件
(與前面提到的任何Web服務一起; 意即使用collectstatic管理命令來收集STATIC_ROOT中的靜態文件,然後配置你的Web服務以STATIC_URL來提供STATIC_ROOT服務)
不過這裏三種其他方法:
1. 建立一個符號鏈接,從Apache document root指向admin靜態文件(這可能需要在你的Apache配置中+FollowSymLinks).
2. 使用Alias指令,如上所示,將特定的URL(比如STATIC_URL + admin/)通過alias指向admin文件的實際位置.
3. 拷貝admin靜態文件到Apache document root.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章