mod_wsgi(Apache)¶
如果您使用的是Apache网络服务器,请考虑使用mod_wsgi。
小心
请确保在任何 app.run()
调用之前,你应该把应用文件放在一个 if __name__ == `__main__`:
块中或移动到独立的文件。 只确保它没被调用是 因为这总是会启动一个本地的 WSGI 服务器,而当我们使用 mod_wsgi 部署应用 时并不想让它出现。
安装mod_wsgi ¶
如果你还没有安装过 mod_wsgi ,你需要使用包管理器来安装或手动编译它。 mod_wsgi 安装说明涵盖UNIX系统上的源安装。
如果你使用 Ubuntu/Debian 你可以按照下面的命令使用 apt-get 获取并激活它:
# apt-get install libapache2-mod-wsgi
如果你使用基于yum的发行版(Fedora,OpenSUSE等),你可以安装它如下:
# yum install mod_wsgi
如果你在使用 pkgsrc 你可以编译 www/ap2-wsgi 包来安装 mod_wsgi 。
# pkg install ap22-mod_wsgi2
无论何时,当 .wsgi 文件, mod_wsgi 会为我们自动重新加载所有的守护进程。
如果你在 apache 第一次重加载后遇到子进程段错误,你可以安全地忽略它们。 只需要重启服务器。
创建.wsgi文件¶
要运行应用程序,您需要一个yourapplication.wsgi
文件。 这个文件包含 mod_wsgi 启动时执行的获取应用对象的代码。 这个对象在该文件中名为 application ,并在 之后作为应用。
对于大多数应用,下面度文件就可以胜任:
from yourapplication import app as application
如果你没有一个用于创建应用的工厂函数而是单例的应用,你可以直接导入它为 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文档。
疑难解答¶
如果你的应用不能运行,按照下面的指导来排除故障:
- 问题: 应用不能运行,错误日志显示, SystemExit 忽略
- 你的应用文件中有一个不在
if __name__ == '__main__':
声明保护下的app.run()
调用。 或者从文件中删除run()
调用,并将其移动到单独的run.py
文件中,或将其放入if块。 - 问题: 应用报出权限错误
- 可能是因为使用了错误的用户运行应用。 确保需要访问的应用有合适的权限设置, 并且使用正确的用户来运行( WSGIDaemonProcess 指令的
user
和group
参数) - 问题: 应用崩溃时打印一条错误
请记住,mod_wsgi不允许使用
sys.stdout
和sys.stderr
执行任何操作。 你可以通过设定配置中的 WSGIRestrictStdout 为off
来禁用这个保护。WSGIRestrictStdout Off
或者,你可以在 .wsgi 文件中用不同的流来替换标准输出:
import sys sys.stdout = sys.stderr
- 问题: 访问资源时报出 IO 错误
你的应用可能是一个你符号链接到 site-packages 文件夹的单个 .py 文件。 请注意这不会正常工作,除非把这个文件放进 pythonpath 包含的文件夹中, 或是把应用转换成一个包。
这个问题同样适用于非安装的包,模块文件名用于定位资源,而符号链接会获取 错误的文件名。
支持自动重新加载¶
你可以激活自动重载入支持来协助部署工具。 每当有东西改变.wsgi
文件时,mod_wsgi会为我们重新加载所有的守护进程。
为此,只需向您的目录部分添加以下指令:
WSGIScriptReloading On
使用虚拟环境¶
虚拟环境的优势是它们永远不在系统全局安装所需的依赖关系,这样你可以更好 地控制使用什么。 如果要使用带有mod_wsgi的虚拟环境,您必须稍微修改.wsgi
文件。
将以下行添加到您的.wsgi
文件的顶部:
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
对于Python 3,将以下行添加到.wsgi
文件的顶部:
activate_this = '/path/to/env/bin/activate_this.py'
with open(activate_this) as file_:
exec(file_.read(), dict(__file__=activate_this))
这根据虚拟环境的设置设定了加载路径。 记住这个路径一经是绝对的。