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.