mod_wsgi (Apache) — Flask 文档

来自菜鸟教程
Flask/docs/2.0.x/deploying/mod wsgi
跳转至:导航、​搜索

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 它并按如下方式激活它:

$ apt-get install libapache2-mod-wsgi-py3

如果您使用的是基于 yum 的发行版(Fedora、OpenSUSE 等),您可以按如下方式安装它:

$ yum install mod_wsgi

在 FreeBSD 上,通过编译 www/mod_wsgi 端口或使用 pkg_add 来安装 mod_wsgi:

$ pkg install ap24-py37-mod_wsgi

如果您使用 pkgsrc,您可以通过编译 www/ap2-wsgi 包来安装 mod_wsgi。

如果您在第一次 apache 重新加载后遇到段错误的子进程,您可以放心地忽略它们。 只需重新启动服务器。


创建 .wsgi 文件

要运行您的应用程序,您需要一个 yourapplication.wsgi 文件。 该文件包含在启动时执行以获取应用程序对象的代码 mod_wsgi。 然后将该文件中名为 application 的对象用作应用程序。

对于大多数应用程序,以下文件应该足够了:

from yourapplication import app as application

如果在 __init__.py 文件中使用了工厂函数,则应导入该函数:

from yourapplication import create_app
application = create_app()

如果您没有用于创建应用程序的工厂函数但有一个单例实例,您可以直接将其导入为 application。

将该文件存储在可以再次找到的地方(例如:/var/www/yourapplication),并确保 yourapplication 和所有正在使用的库都在 python 加载路径上。 如果您不想在系统范围内安装它,请考虑使用 虚拟 python 实例。 请记住,您还必须将应用程序实际安装到 virtualenv 中。 或者,可以选择在导入前修补 .wsgi 文件中的路径:

import sys
sys.path.insert(0, '/path/to/the/application')

配置 Apache

您需要做的最后一件事是为您的应用程序创建一个 Apache 配置文件。 在这个例子中,出于安全原因,我们告诉 mod_wsgi 在不同的用户下执行应用程序:

<VirtualHost *>
    ServerName example.com

    WSGIDaemonProcess yourapplication user=user1 group=group1 threads=5
    WSGIScriptAlias / /var/www/yourapplication/yourapplication.wsgi

    <Directory /var/www/yourapplication>
        WSGIProcessGroup yourapplication
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

注意:WSGIDaemonProcess 未在 Windows 中实现,Apache 将拒绝以上述配置运行。 在 Windows 系统上,删除这些行:

<VirtualHost *>
    ServerName example.com
    WSGIScriptAlias / C:\yourdir\yourapp.wsgi
    <Directory C:\yourdir>
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

注意:Apache 2.4 的访问控制配置有一些变化。

最值得注意的是,目录权限的语法已从 httpd 2.2 更改

Order allow,deny
Allow from all

到 httpd 2.4 语法

Require all granted

有关更多信息,请参阅 mod_wsgi 文档


故障排除

如果您的应用程序没有运行,请按照本指南进行故障排除:

问题: 应用程序不运行,错误日志显示 SystemExit 被忽略

您的应用程序文件中有一个 app.run() 调用,该调用不受 if __name__ == '__main__': 条件的保护。 从文件中删除 run() 调用并将其移动到单独的 run.py 文件中,或者将其放入这样的 if 块中。

问题: 应用程序给出权限错误

可能是由于您的应用程序以错误的用户身份运行造成的。 确保应用程序需要访问的文件夹设置了正确的权限,并且应用程序以正确的用户身份运行(WSGIDaemonProcess 指令的 usergroup 参数)

问题: 应用程序因打印错误而终止

请记住,mod_wsgi 不允许对 sys.stdoutsys.stderr 进行任何操作。 您可以通过将 WSGIRestrictStdout 设置为 off 来从配置中禁用此保护:

WSGIRestrictStdout Off

或者,您也可以使用不同的流替换 .wsgi 文件中的标准输出:

import sys
sys.stdout = sys.stderr
问题:访问资源出现IO错误

您的应用程序可能是您符号链接到 site-packages 文件夹的单个 .py 文件。 请注意,这不起作用,您必须将文件夹放入存储文件的 pythonpath 中,或者将您的应用程序转换为包。

这样做的原因是对于未安装的软件包,模块文件名用于定位资源,而对于符号链接,则选择了错误的文件名。


支持自动重新加载

为了帮助部署工具,您可以激活对自动重新加载的支持。 每当 .wsgi 文件发生变化时,mod_wsgi 都会为我们重新加载所有守护进程。

为此,只需将以下指令添加到 Directory 部分:

WSGIScriptReloading On

使用虚拟环境

虚拟环境的优势在于它们从不在系统范围内安装所需的依赖项,因此您可以更好地控制在哪里使用什么。 如果你想使用 mod_wsgi 的虚拟环境,你必须稍微修改你的 .wsgi 文件。

将以下行添加到 .wsgi 文件的顶部:

activate_this = '/path/to/env/bin/activate_this.py'
with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this))

这会根据虚拟环境的设置设置加载路径。 请记住,路径必须是绝对的。