mod_wsgi (Apache) — Flask 文档
mod_wsgi (Apache)
如果您使用 Apache 网络服务器,请考虑使用 mod_wsgi。
当心
请提前确保您的应用程序文件中的任何 app.run()
调用都在 if __name__ == '__main__':
块内或移动到单独的文件中。 只要确保它没有被调用,因为如果我们将该应用程序部署到 mod_wsgi,这将始终启动我们不想要的本地 WSGI 服务器。
安装 mod_wsgi
如果您还没有安装 mod_wsgi,您必须使用包管理器安装它或自己编译它。 mod_wsgi 安装说明 涵盖了 UNIX 系统上的源代码安装。
如果您使用的是 Ubuntu/Debian,您可以 apt-get 它并按如下方式激活它:
如果您使用的是基于 yum 的发行版(Fedora、OpenSUSE 等),您可以按如下方式安装它:
在 FreeBSD 上,通过编译 www/mod_wsgi 端口或使用 pkg_add 来安装 mod_wsgi:
如果您使用 pkgsrc,您可以通过编译 www/ap2-wsgi 包来安装 mod_wsgi。
如果您在第一次 apache 重新加载后遇到段错误的子进程,您可以放心地忽略它们。 只需重新启动服务器。
创建 .wsgi 文件
要运行您的应用程序,您需要一个 yourapplication.wsgi
文件。 该文件包含在启动时执行以获取应用程序对象的代码 mod_wsgi。 然后将该文件中名为 application 的对象用作应用程序。
对于大多数应用程序,以下文件应该足够了:
如果在 __init__.py
文件中使用了工厂函数,则应导入该函数:
如果您没有用于创建应用程序的工厂函数但有一个单例实例,您可以直接将其导入为 application。
将该文件存储在可以再次找到的地方(例如:/var/www/yourapplication
),并确保 yourapplication 和所有正在使用的库都在 python 加载路径上。 如果您不想在系统范围内安装它,请考虑使用 虚拟 python 实例。 请记住,您还必须将应用程序实际安装到 virtualenv 中。 或者,可以选择在导入前修补 .wsgi
文件中的路径:
配置 Apache
您需要做的最后一件事是为您的应用程序创建一个 Apache 配置文件。 在这个例子中,出于安全原因,我们告诉 mod_wsgi 在不同的用户下执行应用程序:
注意:WSGIDaemonProcess 未在 Windows 中实现,Apache 将拒绝以上述配置运行。 在 Windows 系统上,删除这些行:
注意:Apache 2.4 的访问控制配置有一些变化。
最值得注意的是,目录权限的语法已从 httpd 2.2 更改
到 httpd 2.4 语法
有关更多信息,请参阅 mod_wsgi 文档 。
故障排除
如果您的应用程序没有运行,请按照本指南进行故障排除:
- 问题: 应用程序不运行,错误日志显示 SystemExit 被忽略
您的应用程序文件中有一个
app.run()
调用,该调用不受if __name__ == '__main__':
条件的保护。 从文件中删除run()
调用并将其移动到单独的run.py
文件中,或者将其放入这样的 if 块中。- 问题: 应用程序给出权限错误
可能是由于您的应用程序以错误的用户身份运行造成的。 确保应用程序需要访问的文件夹设置了正确的权限,并且应用程序以正确的用户身份运行(WSGIDaemonProcess 指令的
user
和group
参数)- 问题: 应用程序因打印错误而终止
请记住,mod_wsgi 不允许对
sys.stdout
和sys.stderr
进行任何操作。 您可以通过将 WSGIRestrictStdout 设置为off
来从配置中禁用此保护:或者,您也可以使用不同的流替换 .wsgi 文件中的标准输出:
- 问题:访问资源出现IO错误
您的应用程序可能是您符号链接到 site-packages 文件夹的单个 .py 文件。 请注意,这不起作用,您必须将文件夹放入存储文件的 pythonpath 中,或者将您的应用程序转换为包。
这样做的原因是对于未安装的软件包,模块文件名用于定位资源,而对于符号链接,则选择了错误的文件名。
支持自动重新加载
为了帮助部署工具,您可以激活对自动重新加载的支持。 每当 .wsgi
文件发生变化时,mod_wsgi 都会为我们重新加载所有守护进程。
为此,只需将以下指令添加到 Directory 部分:
使用虚拟环境
虚拟环境的优势在于它们从不在系统范围内安装所需的依赖项,因此您可以更好地控制在哪里使用什么。 如果你想使用 mod_wsgi 的虚拟环境,你必须稍微修改你的 .wsgi
文件。
将以下行添加到 .wsgi
文件的顶部:
对于 Python 3,将以下行添加到 .wsgi
文件的顶部:
这会根据虚拟环境的设置设置加载路径。 请记住,路径必须是绝对的。