“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 和 mod_wsgi 中使用 Django = |
− | + | 使用 [https://httpd.apache.org/ Apache] 和 [https://modwsgi.readthedocs.io/en/develop/ mod_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/ | + | [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] | + | 安装并激活 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"> | ||
− | < | + | <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 | ||
− | + | <Directory /path/to/mysite.com/mysite> | |
− | + | <Files wsgi.py> | |
Require all granted | Require all granted | ||
− | + | </Files> | |
− | + | </Directory></syntaxhighlight> | |
</div> | </div> | ||
</div> | </div> | ||
− | <code>WSGIScriptAlias</code> | + | <code>WSGIScriptAlias</code> 行中的第一位是您希望为应用程序提供服务的基本 URL 路径(<code>/</code> 表示根 url),第二位是“WSGI 文件”的位置 –见下文——在您的系统上,通常在您的项目包内(在本例中为 <code>mysite</code>)。 这会告诉 Apache 使用该文件中定义的 WSGI 应用程序处理给定 URL 下的任何请求。 |
− | + | 如果您将项目的 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> | + | <code>WSGIPythonPath</code> 行确保您的项目包可在 Python 路径上导入; 换句话说,<code>import mysite</code> 有效。 |
− | <code><Directory></code> | + | <code><Directory></code> 部分只是确保 Apache 可以访问您的 <code>wsgi.py</code> 文件。 |
− | + | 接下来我们需要确保这个带有 WSGI 应用程序对象的 <code>wsgi.py</code> 存在。 从 Django 1.4 版本开始,[[#id1|:djadmin:`startproject`]] 会为你创建一个; 否则,您需要创建它。 请参阅 [[../index|WSGI 概述文档]] ,了解您应该放入此文件的默认内容,以及您可以添加的其他内容。 | |
<div class="admonition warning"> | <div class="admonition warning"> | ||
第46行: | 第47行: | ||
警告 | 警告 | ||
− | 如果多个 Django | + | 如果多个 Django 站点在单个 mod_wsgi 进程中运行,则所有站点都将使用碰巧最先运行的站点的设置。 这可以通过更改来解决: |
<div class="highlight-default notranslate"> | <div class="highlight-default notranslate"> | ||
第52行: | 第53行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <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"> | ||
− | < | + | <syntaxhighlight lang="python">os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"</syntaxhighlight> |
</div> | </div> | ||
</div> | </div> | ||
− | + | 或者通过 [[#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> | |
− | + | 如果在上传文件名包含非 ASCII 字符的文件时得到 <code>UnicodeEncodeError</code>,请确保将 Apache 配置为接受非 ASCII 文件名: | |
<div class="highlight-default notranslate"> | <div class="highlight-default notranslate"> | ||
第82行: | 第83行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <syntaxhighlight lang="python">export LANG='en_US.UTF-8' |
− | export LC_ALL='en_US.UTF-8'</ | + | export LC_ALL='en_US.UTF-8'</syntaxhighlight> |
</div> | </div> | ||
</div> | </div> | ||
− | + | 放置此配置的常见位置是 <code>/etc/apache2/envvars</code>。 | |
− | + | 有关详细信息,请参阅 Unicode 参考指南的 [[../../../../ref/unicode#unicode-files|Files]] 部分。 | |
第99行: | 第100行: | ||
<span id="daemon-mode"></span> | <span id="daemon-mode"></span> | ||
− | == 使用 | + | == 使用 mod_wsgi 守护进程模式 == |
− | + | “守护进程模式”是运行 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"> | ||
− | < | + | <syntaxhighlight lang="apache">WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com |
− | WSGIProcessGroup example.com</ | + | WSGIProcessGroup example.com</syntaxhighlight> |
</div> | </div> | ||
</div> | </div> | ||
− | + | 如果你想在子目录(本例中为<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"> | ||
− | < | + | <syntaxhighlight lang="apache">WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com</syntaxhighlight> |
</div> | </div> | ||
</div> | </div> | ||
− | + | 有关设置守护进程模式 [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=" | + | <span id="id3"></span> |
== 提供文件服务 == | == 提供文件服务 == | ||
− | Django | + | Django 本身不提供文件; 它将这项工作留给您选择的任何 Web 服务器。 |
− | + | 我们建议使用单独的 Web 服务器(即不运行 Django 的服务器)来提供媒体服务。 这里有一些不错的选择: | |
− | * [https://nginx.org/en/ | + | * [https://nginx.org/en/ nginx] |
− | * | + | * [https://httpd.apache.org/ Apache] 的精简版 |
− | + | 但是,如果您别无选择,只能在与 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 空间中的任何内容作为静态文件提供。 所有其他 URL 将使用 mod_wsgi 提供: | |
<div class="highlight-apache notranslate"> | <div class="highlight-apache notranslate"> | ||
第148行: | 第149行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <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/ | ||
− | + | <Directory /path/to/mysite.com/static> | |
Require all granted | Require all granted | ||
− | + | </Directory> | |
− | + | <Directory /path/to/mysite.com/media> | |
Require all granted | Require all granted | ||
− | + | </Directory> | |
WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py | WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py | ||
− | + | <Directory /path/to/mysite.com/mysite> | |
− | + | <Files wsgi.py> | |
Require all granted | Require all granted | ||
− | + | </Files> | |
− | + | </Directory></syntaxhighlight> | |
</div> | </div> | ||
</div> | </div> | ||
− | + | 如果您使用的 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=" | + | <span id="id5"></span> |
== 服务后台文件 == | == 服务后台文件 == | ||
− | + | 当 [[../../../../ref/contrib/staticfiles#module-django.contrib|django.contrib.staticfiles]] 在 [[#id6|:setting:`INSTALLED_APPS`]] 中时,Django 开发服务器会自动提供管理应用程序(以及任何其他已安装应用程序)的静态文件。 但是,当您使用任何其他服务器安排时,情况并非如此。 您负责设置 Apache 或您使用的任何 Web 服务器,以提供管理文件。 | |
− | + | 管理文件位于 Django 发行版的 (<code>django/contrib/admin/static/admin</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>)。 |
− | # | + | # 使用 <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 | + | == 从 Apache 对 Django 的用户数据库进行身份验证 == |
+ | |||
+ | Django 提供了一个处理程序,允许 Apache 直接针对 Django 的身份验证后端对用户进行身份验证。 请参阅 [[../apache-auth|mod_wsgi 身份验证文档]] 。 | ||
− | |||
+ | </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
使用 Apache 和 mod_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
行中的第一位是您希望为应用程序提供服务的基本 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 进程中运行,则所有站点都将使用碰巧最先运行的站点的设置。 这可以通过更改来解决:
在 wsgi.py
中:
或者通过 使用 mod_wsgi 守护进程模式 并确保每个站点在自己的守护进程中运行。
修复文件上传的 UnicodeEncodeError
如果在上传文件名包含非 ASCII 字符的文件时得到 UnicodeEncodeError
,请确保将 Apache 配置为接受非 ASCII 文件名:
放置此配置的常见位置是 /etc/apache2/envvars
。
有关详细信息,请参阅 Unicode 参考指南的 Files 部分。
使用 mod_wsgi 守护进程模式
“守护进程模式”是运行 mod_wsgi 的推荐模式(在非 Windows 平台上)。 要创建所需的守护进程组并委托 Django 实例在其中运行,您需要添加适当的 WSGIDaemonProcess
和 WSGIProcessGroup
指令。 如果您使用守护进程模式,则需要对上述配置进行进一步更改,即不能使用 WSGIPythonPath
; 相反,您应该将 python-path
选项用于 WSGIDaemonProcess
,例如:
如果你想在子目录(本例中为https://example.com/mysite
)中为你的项目提供服务,你可以在上面的配置中添加WSGIScriptAlias
:
有关设置守护进程模式 的详细信息,请参阅官方 mod_wsgi 文档 。
提供文件服务
Django 本身不提供文件; 它将这项工作留给您选择的任何 Web 服务器。
我们建议使用单独的 Web 服务器(即不运行 Django 的服务器)来提供媒体服务。 这里有一些不错的选择:
但是,如果您别无选择,只能在与 Django 相同的 Apache VirtualHost
上提供媒体文件,您可以将 Apache 设置为将某些 URL 作为静态媒体提供,而其他使用 mod_wsgi 接口的 Django。
此示例在站点根目录设置 Django,但将 robots.txt
、favicon.ico
以及 /static/
和 /media/
URL 空间中的任何内容作为静态文件提供。 所有其他 URL 将使用 mod_wsgi 提供:
如果您使用的 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`),但这里有其他三种方法:
- 从您的文档根目录中创建一个指向管理静态文件的符号链接(这可能需要您的 Apache 配置中的
+FollowSymLinks
)。 - 使用
Alias
指令,如上所示,将适当的 URL(可能是 :setting:`STATIC_URL` +admin/
)别名到管理文件的实际位置。 - 直接将后台静态文件拷贝至 Apache 的文档根目录。
从 Apache 对 Django 的用户数据库进行身份验证
Django 提供了一个处理程序,允许 Apache 直接针对 Django 的身份验证后端对用户进行身份验证。 请参阅 mod_wsgi 身份验证文档 。