如何使用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.

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