https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/
-- 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
使用WSGI部署的关键概念是可调用应用程序,用于应用服务跟你的代码交互,通常在一个python模块中以一个对象命名的应用提供,对服务可见(可访问)。
startproject命令创建了一个文件 <project_name>/wsgi.py, 其中包含了这样一个可调用应用。
它既被Django的开发服务使用,也被生产的WSGI部署使用。
WSGI服务器从它们的配置中获取可调用应用程序的路径。Django的内建服务器,即runserver和runfcgi命令, 从WSGI_APPLICATION设置读取。
默认的,它被设置为<project_name>.wsgi.application,其指向<project_name>/wsgi.py中的可调用应用程序。
当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"来覆盖环境变量值。
------------
要应用WSGI中间件你可以简单的封装应用程序对象。比如你可以在wsgi.py的底部添加几行:
------------
from helloworld.wsgi import HelloWorldApplication
application = HelloWorldApplication(application)
------------
使用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
------------
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的引用指南。
------------
为创建所需的守护进程组,并将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
我们推荐使用一个单独的服务,就是说,一个不同时运行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>
------------
当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.
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.