mod_wsgi (Apache)

如果您正在使用 Apache Web服务器,考虑使用 mod_wsgi .

当心

请确保在任何 app.run() 调用之前,你应该把应用文件放在一个 if __name__ == __main__: 块中或移动到独立的文件。只确保它没被调用是因为这总是会启动一个本地的 WSGI 服务器,而当我们使用 mod_wsgi 部署应用时并不想让它出现。

安装'mod'wsgi`

如果你没有 mod_wsgi 您必须使用包管理器安装它,或者自己编译它。mod_wsgi 的 安装指引 涵盖了 UNIX 系统中的源码安装。

如果您使用的是Ubuntu/Debian,您可以按如下方式获取并激活它:

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

如果你使用 Ubuntu/Debian 你可以按照下面的命令使用 apt-get 获取并激活它:

$ yum install mod_wsgi

在 FreeBSD 上,通过编译 www/mode_wsgi port 或使用 pkg_add 来安装:

$ pkg install ap24-py37-mod_wsgi

如果你在使用 pkgsrc 你可以编译 www/ap2-wsgi 包来安装 mod_wsgi 。

如果在第一次重新加载Apache之后遇到SegFaulting子进程,可以安全地忽略它们。只需重新启动服务器。

创建`.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 载入的路径。如果你不想在系统全局安装它,请考虑使用 virtual 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 documentation .

故障排除

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

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

应用文件中有 app.run() 调用,但没有放在 if __name__ == '__main__': 块内。要么把这个调用放入块内,要么把它 放在一个单独的 run.py 文件中。

**问题:**应用程序提供权限错误

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

**问题:**应用程序在打印时出错而歇菜

请记住 mod_wsgi 不允许使用 sys.stdout 和 sys.stderr 。 把 WSGIRestrictStdout 设置为 off 可以去掉这个保护:

WSGIRestrictStdout Off

或者你可以在 .wsgi 文件中把标准输出替换为其他的流:

import sys
sys.stdout = sys.stderr
**问题:**访问资源会导致IO错误

您的应用程序可能是一个符号链接到站点包文件夹的.py文件。请注意,这不起作用,您要么将文件夹放入存储文件的路径,要么将应用程序转换为包。

产生这种错误的原因是对于非安装包来说,模块的文件名用于定位资源,如果使用符号连接的话就会定位到错误的文件名。

支持自动重新加载

为了帮助部署工具,您可以激活对自动重新加载的支持。每当有什么改变 .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))

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