“Django/docs/2.2.x/howto/deployment/wsgi/modwsgi”的版本间差异

来自菜鸟教程
Django/docs/2.2.x/howto/deployment/wsgi/modwsgi
跳转至:导航、​搜索
(autoload)
 
(Page commit)
 
第1行: 第1行:
 +
{{DISPLAYTITLE:如何在 Apache 和 mod_wsgi 中使用 Django — Django 文档}}
 
<div id="how-to-use-django-with-apache-and-mod-wsgi" class="section">
 
<div id="how-to-use-django-with-apache-and-mod-wsgi" class="section">
  
= 如何使用 Apache 和 <code>mod_wsgi</code> 托管 Django =
+
= 如何在 Apache 和 mod_wsgi 中使用 Django =
  
利用 [https://httpd.apache.org/ Apache] 和 [https://modwsgi.readthedocs.io/en/develop/ mod_wsgi] 在生产环境部署已经过充分测试。
+
使用 [https://httpd.apache.org/ Apache] 和 [https://modwsgi.readthedocs.io/en/develop/ mod_wsgi] 部署 Django 是将 Django 投入生产的一种久经考验的方法。
  
mod_wsgi 是一个 Apache 模块,它可以管理任何 Python [https://wsgi.readthedocs.io/en/latest/ WSGI] 应用,包括 Django。Django 支持所有支持 mod_wsgi 的 Apache 版本。
+
mod_wsgi 是一个 Apache 模块,它可以托管任何 Python [https://wsgi.readthedocs.io/en/latest/ WSGI] 应用程序,包括 Django。 Django 可以与任何支持 mod_wsgi 的 Apache 版本一起使用。
  
[https://modwsgi.readthedocs.io/en/develop/installation.html 官方 mod_wsgi 文档] 介绍了如何使用 mod_wsgi 的全部细节。你可能更喜欢从 [https://modwsgi.readthedocs.io/ 安装和配置文档] 开始。
+
[https://modwsgi.readthedocs.io/ 官方 mod_wsgi 文档] 是有关如何使用 mod_wsgi 的所有详细信息的来源。 您可能希望从 [https://modwsgi.readthedocs.io/en/develop/installation.html 安装和配置文档] 开始。
  
 
<div id="basic-configuration" class="section">
 
<div id="basic-configuration" class="section">
  
== 基础配置 ==
+
== 基本配置 ==
  
安装并激活 mod_wsgi 后,编辑 Apache 服务器的 [https://wiki.apache.org/httpd/DistrosDefaultLayout httpd.conf] 文件,并添加以下内容。若你正在使用的 Apache 版本号早于 2.4,用 <code>Allow from all</code> 替换 <code>Require all granted</code>,并在其上添加一行 <code>Order deny,allow</code>。
+
安装并激活 mod_wsgi 后,编辑 Apache 服务器的 [https://wiki.apache.org/httpd/DistrosDefaultLayout httpd.conf] 文件并添加以下内容。 如果您使用的 Apache 版本早于 2.4,请将 <code>Require all granted</code> 替换为 <code>Allow from all</code>,并在其上方添加行 <code>Order deny,allow</code>。
  
 
<div class="highlight-apache notranslate">
 
<div class="highlight-apache notranslate">
第19行: 第20行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
+
<syntaxhighlight lang="apache">WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
 
WSGIPythonHome /path/to/venv
 
WSGIPythonHome /path/to/venv
 
WSGIPythonPath /path/to/mysite.com
 
WSGIPythonPath /path/to/mysite.com
  
&lt;Directory /path/to/mysite.com/mysite&gt;
+
<Directory /path/to/mysite.com/mysite>
&lt;Files wsgi.py&gt;
+
<Files wsgi.py>
 
Require all granted
 
Require all granted
&lt;/Files&gt;
+
</Files>
&lt;/Directory&gt;</pre>
+
</Directory></syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
<code>WSGIScriptAlias</code> 行的第一项是你所期望的应用所在的基础 URL 路径( <code>/</code> 根 url),第二项是 &quot;WSGI 文件&quot; 的位置——一般位于项目包之内(本例中是 <code>mysite</code>)。这告诉 Apache 用该文件中定义的 WSGI 应用响应指定 URL 下的请求。
+
<code>WSGIScriptAlias</code> 行中的第一位是您希望为应用程序提供服务的基本 URL 路径(<code>/</code> 表示根 url),第二位是“WSGI 文件”的位置 –见下文——在您的系统上,通常在您的项目包内(在本例中为 <code>mysite</code>)。 这会告诉 Apache 使用该文件中定义的 WSGI 应用程序处理给定 URL 下的任何请求。
  
如果你在某个 [https://virtualenv.pypa.io/ virtualenv] 内为应用安装项目的 Python 依赖,将该 virtualenv 的路径添加至 <code>WSGIPythonHome</code> 。参考 [https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html mod_wsgi virtualenv 指引] 获取更多细节。
+
如果您将项目的 Python 依赖项安装在 [https://virtualenv.pypa.io/ virtualenv] 中,请使用 <code>WSGIPythonHome</code> 添加到 virtualenv 的路径。 有关更多详细信息,请参阅 [https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html mod_wsgi virtualenv 指南]
  
<code>WSGIPythonPath</code> 行确保你的项目包能从 Python path 导入;换句话说, <code>import mysite</code> 能正常工作。
+
<code>WSGIPythonPath</code> 行确保您的项目包可在 Python 路径上导入; 换句话说,<code>import mysite</code> 有效。
  
<code>&lt;Directory&gt;</code> 片段仅确保 Apache 能访问 <code>wsgi.py</code> 文件。
+
<code>&lt;Directory&gt;</code> 部分只是确保 Apache 可以访问您的 <code>wsgi.py</code> 文件。
  
下一步,我们需要确认 <code>wsgi.py</code> 文件包含一个 WSGI 应用对象。从 Django 1.4 起, [[../../../../ref/django-admin#django-admin-startproject|<code>startproject</code>]] 会自动创建;换而言之,你无需手动创建。查阅 [[../index|<span class="doc">WSGI 概述文档</span>]] 获取你需要配置的默认内容,以及其它可配置项。
+
接下来我们需要确保这个带有 WSGI 应用程序对象的 <code>wsgi.py</code> 存在。 从 Django 1.4 版本开始,[[#id1|:djadmin:`startproject`]] 会为你创建一个; 否则,您需要创建它。 请参阅 [[../index|WSGI 概述文档]] ,了解您应该放入此文件的默认内容,以及您可以添加的其他内容。
  
 
<div class="admonition warning">
 
<div class="admonition warning">
第46行: 第47行:
 
警告
 
警告
  
如果多个 Django 站点运行在同一 mod_wsgi 进程,它们会共用最先启动的站点配置。能通过以下修改改变行为:
+
如果多个 Django 站点在单个 mod_wsgi 进程中运行,则所有站点都将使用碰巧最先运行的站点的设置。 这可以通过更改来解决:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第52行: 第53行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>os.environ.setdefault(&quot;DJANGO_SETTINGS_MODULE&quot;, &quot;{{ project_name }}.settings&quot;)</pre>
+
<syntaxhighlight lang="python">os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
<code>wsgi.py</code> 中也这么改:
+
<code>wsgi.py</code> 中:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第63行: 第64行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>os.environ[&quot;DJANGO_SETTINGS_MODULE&quot;] = &quot;{{ project_name }}.settings&quot;</pre>
+
<syntaxhighlight lang="python">os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
或通过 [[#daemon-mode|<span class="std std-ref">使用 mod_wsgi 的后台模式</span>]] 确保每个站点都运行于独立的后台进程。
+
或者通过 [[#daemon-mode|使用 mod_wsgi 守护进程模式]] 并确保每个站点在自己的守护进程中运行。
  
  
第74行: 第75行:
 
<div class="admonition-fixing-unicodeencodeerror-for-file-uploads admonition">
 
<div class="admonition-fixing-unicodeencodeerror-for-file-uploads admonition">
  
为文件上传修复 <code>UnicodeEncodeError</code>
+
修复文件上传的 <code>UnicodeEncodeError</code>
  
上传名称包含非 ASCII 字符的文件时,若抛出 <code>UnicodeEncodeError</code>,确认 Apache 是否被正确配置,能接受非 ASCII 文件名:
+
如果在上传文件名包含非 ASCII 字符的文件时得到 <code>UnicodeEncodeError</code>,请确保将 Apache 配置为接受非 ASCII 文件名:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第82行: 第83行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>export LANG='en_US.UTF-8'
+
<syntaxhighlight lang="python">export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'</pre>
+
export LC_ALL='en_US.UTF-8'</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
常见的配置文件路径是 <code>/etc/apache2/envvars</code>。
+
放置此配置的常见位置是 <code>/etc/apache2/envvars</code>。
  
参考 Unicode 参考指引的 [[../../../../ref/unicode#unicode-files|<span class="std std-ref">Files</span>]] 章节获取细节信息。
+
有关详细信息,请参阅 Unicode 参考指南的 [[../../../../ref/unicode#unicode-files|Files]] 部分。
  
  
第99行: 第100行:
  
 
<span id="daemon-mode"></span>
 
<span id="daemon-mode"></span>
== 使用 <code>mod_wsgi</code> 后台模式 ==
+
== 使用 mod_wsgi 守护进程模式 ==
  
&quot;Daemon mode&quot; 是运行 mod_wsgi 的推荐模式(在非 Windows 平台上)。为了创建必要的后台进程组并在其中运行 Django 实例,你需要添加合适的 <code>WSGIDaemonProcess</code> 和 <code>WSGIProcessGroup</code> 指令。上述配置在你使用后台模式时需要点小修改,即你不能使用 <code>WSGIPythonPath</code>;作为替换,你要在 <code>WSGIDaemonProcess</code> 中添加 <code>python-path</code> 选项,例如:
+
“守护进程模式”是运行 mod_wsgi 的推荐模式(在非 Windows 平台上)。 要创建所需的守护进程组并委托 Django 实例在其中运行,您需要添加适当的 <code>WSGIDaemonProcess</code> 和 <code>WSGIProcessGroup</code> 指令。 如果您使用守护进程模式,则需要对上述配置进行进一步更改,即不能使用 <code>WSGIPythonPath</code>; 相反,您应该将 <code>python-path</code> 选项用于 <code>WSGIDaemonProcess</code>,例如:
  
 
<div class="highlight-apache notranslate">
 
<div class="highlight-apache notranslate">
第107行: 第108行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
+
<syntaxhighlight lang="apache">WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
WSGIProcessGroup example.com</pre>
+
WSGIProcessGroup example.com</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
如果你想在子目录中开放你的项目(本例中 <code>https://example.com/mysite</code>),你可在上述配置中添加 <code>WSGIScriptAlias</code>:
+
如果你想在子目录(本例中为<code>https://example.com/mysite</code>)中为你的项目提供服务,你可以在上面的配置中添加<code>WSGIScriptAlias</code>:
  
 
<div class="highlight-apache notranslate">
 
<div class="highlight-apache notranslate">
第119行: 第120行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com</pre>
+
<syntaxhighlight lang="apache">WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
参考官方 mod_wsgi 文档获取 [https://modwsgi.readthedocs.io/en/develop/user-guides/quick-configuration-guide.html#delegation-to-daemon-process 配置后台模式的细节]。
+
有关设置守护进程模式 [https://modwsgi.readthedocs.io/en/develop/user-guides/quick-configuration-guide.html#delegation-to-daemon-process 的详细信息,请参阅官方 mod_wsgi 文档] 。
  
  
第130行: 第131行:
 
<div id="serving-files" class="section">
 
<div id="serving-files" class="section">
  
<span id="id1"></span>
+
<span id="id3"></span>
 
== 提供文件服务 ==
 
== 提供文件服务 ==
  
Django 本身并不提供文件服务;他将这个职责交给了你选择的 Web 服务器。
+
Django 本身不提供文件; 它将这项工作留给您选择的任何 Web 服务器。
  
我们推荐使用一个独立的 Web 服务器,即其未运行 Django——仅用于媒体服务。以下是一些不错的选项:
+
我们建议使用单独的 Web 服务器(即不运行 Django 的服务器)来提供媒体服务。 这里有一些不错的选择:
  
* [https://nginx.org/en/ Nginx]
+
* [https://nginx.org/en/ nginx]
* 一个 [https://httpd.apache.org/ Apache] 的朴素版本
+
* [https://httpd.apache.org/ Apache] 的精简版
  
然而,若你别无选择,只能在与 Django 相同的 Apache <code>VirtualHost</code> 上提供媒体文件,你可以让 Apache 为一些 URL 提供静态媒体服务,其它的用 mod_wsgi 接口传递给 Django。
+
但是,如果您别无选择,只能在与 Django 相同的 Apache <code>VirtualHost</code> 上提供媒体文件,您可以将 Apache 设置为将某些 URL 作为静态媒体提供,而其他使用 mod_wsgi 接口的 Django。
  
本例在站点根目录配置 Django,但以静态文件的形式提供 <code>robots.txt</code><code>favicon.ico</code> 以及 <code>/static/</code> 和 <code>/media/</code> 中的内容。其它所有 URL mod_wsgi 提供服务:
+
此示例在站点根目录设置 Django,但将 <code>robots.txt</code><code>favicon.ico</code> 以及 <code>/static/</code> 和 <code>/media/</code> URL 空间中的任何内容作为静态文件提供。 所有其他 URL 将使用 mod_wsgi 提供:
  
 
<div class="highlight-apache notranslate">
 
<div class="highlight-apache notranslate">
第148行: 第149行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>Alias /robots.txt /path/to/mysite.com/static/robots.txt
+
<syntaxhighlight lang="apache">Alias /robots.txt /path/to/mysite.com/static/robots.txt
 
Alias /favicon.ico /path/to/mysite.com/static/favicon.ico
 
Alias /favicon.ico /path/to/mysite.com/static/favicon.ico
  
第154行: 第155行:
 
Alias /static/ /path/to/mysite.com/static/
 
Alias /static/ /path/to/mysite.com/static/
  
&lt;Directory /path/to/mysite.com/static&gt;
+
<Directory /path/to/mysite.com/static>
 
Require all granted
 
Require all granted
&lt;/Directory&gt;
+
</Directory>
  
&lt;Directory /path/to/mysite.com/media&gt;
+
<Directory /path/to/mysite.com/media>
 
Require all granted
 
Require all granted
&lt;/Directory&gt;
+
</Directory>
  
 
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
 
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
  
&lt;Directory /path/to/mysite.com/mysite&gt;
+
<Directory /path/to/mysite.com/mysite>
&lt;Files wsgi.py&gt;
+
<Files wsgi.py>
 
Require all granted
 
Require all granted
&lt;/Files&gt;
+
</Files>
&lt;/Directory&gt;</pre>
+
</Directory></syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
若使用早于 2.4 的 Apache,将 <code>Require all granted</code> 替换为 <code>Allow from all</code> ,并在其上添加 <code>Order deny,allow</code>。
+
如果您使用的 Apache 版本早于 2.4,请将 <code>Require all granted</code> 替换为 <code>Allow from all</code>,并在其上方添加行 <code>Order deny,allow</code>。
  
  
第179行: 第180行:
 
<div id="serving-the-admin-files" class="section">
 
<div id="serving-the-admin-files" class="section">
  
<span id="id3"></span>
+
<span id="id5"></span>
 
== 服务后台文件 ==
 
== 服务后台文件 ==
  
[[../../../../ref/settings#std-setting-INSTALLED_APPS|<code>INSTALLED_APPS</code>]] 中包含 [[../../../../ref/contrib/staticfiles#module-django.contrib|<code>django.contrib.staticfiles</code>]] 时,Django 开发服务器自动为这些归属于后台应用(也包含其它已安装的应用)的静态文件提供服务。这与你使用其它服务器时不太一样。你需要正确配置 Apache 或其它你使用的 Web 服务器,另其正确的为后台文件提供服务。
+
[[../../../../ref/contrib/staticfiles#module-django.contrib|django.contrib.staticfiles]] 在 [[#id6|:setting:`INSTALLED_APPS`]] 中时,Django 开发服务器会自动提供管理应用程序(以及任何其他已安装应用程序)的静态文件。 但是,当您使用任何其他服务器安排时,情况并非如此。 您负责设置 Apache 或您使用的任何 Web 服务器,以提供管理文件。
  
后台文件位于 Django 发行版的 (<code>django/contrib/admin/static/admin</code>) 中。
+
管理文件位于 Django 发行版的 (<code>django/contrib/admin/static/admin</code>) 中。
  
我们 '''强烈''' 建议用 [[../../../../ref/contrib/staticfiles#module-django.contrib|<code>django.contrib.staticfiles</code>]] 处理后台文件(连同上一节所述的 Web 服务器;这意味着用 [[../../../../ref/contrib/staticfiles#django-admin-collectstatic|<code>collectstatic</code>]] 管理命令收集 [[../../../../ref/settings#std-setting-STATIC_ROOT|<code>STATIC_ROOT</code>]] 中的静态文件,然后配置 Web 服务器,使其在 [[../../../../ref/settings#std-setting-STATIC_URL|<code>STATIC_URL</code>]] 为 [[../../../../ref/settings#std-setting-STATIC_ROOT|<code>STATIC_ROOT</code>]] 提供服务),不过,这还有几个方法:
+
我们 '''强烈''' 建议使用 [[../../../../ref/contrib/staticfiles#module-django.contrib|django.contrib.staticfiles]] 来处理管理文件(以及上一节中概述的 Web 服务器;这意味着使用 [[#id8|:djadmin:` collectstatic`]] 管理命令收集 [[#id10|中的静态文件:setting:`STATIC_ROOT`]],然后配置您的 Web 服务器以在 [[#id14|:setting:`STATIC_URL`]]),但这里有其他三种方法:
  
# 在文档根目录中创建一个指向后台静态文件的符号链接(Apache 配置中可能要添加 <code>+FollowSymLinks</code>)。
+
# 从您的文档根目录中创建一个指向管理静态文件的符号链接(这可能需要您的 Apache 配置中的 <code>+FollowSymLinks</code>)。
# 使用前文介绍的 <code>Alias</code> 指令,为合适的 URL (可能是 [[../../../../ref/settings#std-setting-STATIC_URL|<code>STATIC_URL</code>]] + <code>admin/</code>) 取个别名,指向后台文件的实际位置。
+
# 使用 <code>Alias</code> 指令,如上所示,将适当的 URL(可能是 [[#id16|:setting:`STATIC_URL`]] + <code>admin/</code>)别名到管理文件的实际位置。
 
# 直接将后台静态文件拷贝至 Apache 的文档根目录。
 
# 直接将后台静态文件拷贝至 Apache 的文档根目录。
  
第196行: 第197行:
 
<div id="authenticating-against-django-s-user-database-from-apache" class="section">
 
<div id="authenticating-against-django-s-user-database-from-apache" class="section">
  
== Apache 利用 Django 的用户数据库进行验证 ==
+
== Apache Django 的用户数据库进行身份验证 ==
 +
 
 +
Django 提供了一个处理程序,允许 Apache 直接针对 Django 的身份验证后端对用户进行身份验证。 请参阅 [[../apache-auth|mod_wsgi 身份验证文档]] 。
  
Django 提供了一个处理器,允许 Apache 直接用 Django 的认证授权后端认证用户。参考文档 [[../apache-auth|<span class="doc">mod_wsgi 认证授权文档</span>]]。
 
  
 +
</div>
  
 
</div>
 
</div>
 +
<div class="clearer">
 +
 +
  
 
</div>
 
</div>
  
[[Category:Django 2.2.x 中文文档]]
+
[[Category:Django 2.2.x 文档]]

2021年10月31日 (日) 04:04的最新版本

如何在 Apache 和 mod_wsgi 中使用 Django

使用 Apachemod_wsgi 部署 Django 是将 Django 投入生产的一种久经考验的方法。

mod_wsgi 是一个 Apache 模块,它可以托管任何 Python WSGI 应用程序,包括 Django。 Django 可以与任何支持 mod_wsgi 的 Apache 版本一起使用。

官方 mod_wsgi 文档 是有关如何使用 mod_wsgi 的所有详细信息的来源。 您可能希望从 安装和配置文档 开始。

基本配置

安装并激活 mod_wsgi 后,编辑 Apache 服务器的 httpd.conf 文件并添加以下内容。 如果您使用的 Apache 版本早于 2.4,请将 Require all granted 替换为 Allow from all,并在其上方添加行 Order deny,allow

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 行中的第一位是您希望为应用程序提供服务的基本 URL 路径(/ 表示根 url),第二位是“WSGI 文件”的位置 –见下文——在您的系统上,通常在您的项目包内(在本例中为 mysite)。 这会告诉 Apache 使用该文件中定义的 WSGI 应用程序处理给定 URL 下的任何请求。

如果您将项目的 Python 依赖项安装在 virtualenv 中,请使用 WSGIPythonHome 添加到 virtualenv 的路径。 有关更多详细信息,请参阅 mod_wsgi virtualenv 指南

WSGIPythonPath 行确保您的项目包可在 Python 路径上导入; 换句话说,import mysite 有效。

<Directory> 部分只是确保 Apache 可以访问您的 wsgi.py 文件。

接下来我们需要确保这个带有 WSGI 应用程序对象的 wsgi.py 存在。 从 Django 1.4 版本开始,:djadmin:`startproject` 会为你创建一个; 否则,您需要创建它。 请参阅 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

有关详细信息,请参阅 Unicode 参考指南的 Files 部分。


使用 mod_wsgi 守护进程模式

“守护进程模式”是运行 mod_wsgi 的推荐模式(在非 Windows 平台上)。 要创建所需的守护进程组并委托 Django 实例在其中运行,您需要添加适当的 WSGIDaemonProcessWSGIProcessGroup 指令。 如果您使用守护进程模式,则需要对上述配置进行进一步更改,即不能使用 WSGIPythonPath; 相反,您应该将 python-path 选项用于 WSGIDaemonProcess,例如:

WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
WSGIProcessGroup example.com

如果你想在子目录(本例中为https://example.com/mysite)中为你的项目提供服务,你可以在上面的配置中添加WSGIScriptAlias

WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com

有关设置守护进程模式 的详细信息,请参阅官方 mod_wsgi 文档


提供文件服务

Django 本身不提供文件; 它将这项工作留给您选择的任何 Web 服务器。

我们建议使用单独的 Web 服务器(即不运行 Django 的服务器)来提供媒体服务。 这里有一些不错的选择:

但是,如果您别无选择,只能在与 Django 相同的 Apache VirtualHost 上提供媒体文件,您可以将 Apache 设置为将某些 URL 作为静态媒体提供,而其他使用 mod_wsgi 接口的 Django。

此示例在站点根目录设置 Django,但将 robots.txtfavicon.ico 以及 /static//media/ URL 空间中的任何内容作为静态文件提供。 所有其他 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>

如果您使用的 Apache 版本早于 2.4,请将 Require all granted 替换为 Allow from all,并在其上方添加行 Order deny,allow


服务后台文件

django.contrib.staticfiles:setting:`INSTALLED_APPS` 中时,Django 开发服务器会自动提供管理应用程序(以及任何其他已安装应用程序)的静态文件。 但是,当您使用任何其他服务器安排时,情况并非如此。 您负责设置 Apache 或您使用的任何 Web 服务器,以提供管理文件。

管理文件位于 Django 发行版的 (django/contrib/admin/static/admin) 中。

我们 强烈 建议使用 django.contrib.staticfiles 来处理管理文件(以及上一节中概述的 Web 服务器;这意味着使用 :djadmin:` collectstatic` 管理命令收集 中的静态文件:setting:`STATIC_ROOT`,然后配置您的 Web 服务器以在 :setting:`STATIC_URL`),但这里有其他三种方法:

  1. 从您的文档根目录中创建一个指向管理静态文件的符号链接(这可能需要您的 Apache 配置中的 +FollowSymLinks)。
  2. 使用 Alias 指令,如上所示,将适当的 URL(可能是 :setting:`STATIC_URL` + admin/)别名到管理文件的实际位置。
  3. 直接将后台静态文件拷贝至 Apache 的文档根目录。


从 Apache 对 Django 的用户数据库进行身份验证

Django 提供了一个处理程序,允许 Apache 直接针对 Django 的身份验证后端对用户进行身份验证。 请参阅 mod_wsgi 身份验证文档