有谁知道如何mod_wsgi
在任何模块发生更改时自动重新加载 Flask 应用程序?我试过WSGIScriptReloading On
了,但没有运气。官方文档有点像熊......我想如果没有人知道,我会给它一个刺。提前致谢!
此外,如果它不能因语法错误(如 Flask 重新加载器)而永久崩溃,那就太好了。
使用mod_wsgi
,WSGIScriptReloading
查找对.wsgi
配置文件的更改,而不是代码。
我的工作流程是上传我的代码更改然后只是
$ touch MyWebApp.wsgi
这会导致最后修改的文件时间戳更改并mod_wsgi
重新加载代码。
您可以通过将.wsgi
文件保存在本地计算机上然后再次上传来“远程”执行此操作,或者我只是通过 SSH 执行此操作。
对于语法错误,您无能为力,代码要么正在运行,要么没有,但修复加上 atouch
将使其再次运行。
如果您通过 FTP 工作,需要注意的一个问题是:确保最后.wsgi
上传“接触”文件,否则它将尝试从错误的代码开始。
我认为想要在生产中自动重新加载源代码是一个非常现实的情况。考虑一个环境,其中每个版本都部署了源,并且“生产”符号链接指向其中一个版本。每当您想发布较新版本时,只需将符号链接指向另一条路径。但是 apache 和 mod_wsgi 仍然从符号链接目录中收集文件,因此需要根据时间戳、大小或 w/e 建立重新加载机制。当然,一个应用程序可能不是问题,但是托管 15-20 个都在积极开发中的应用程序呢?在这种情况下,与每次重新启动 apache 相比,不自动重新加载源是一种纯粹的损失。
回到问题:如果您使用的框架(在本例中为 flask)没有用于自动重新加载源代码的插件或工具,那么 Graham 和 Malphas 描述的两个选项是您的最佳选择。要么触发 wsgi 进程重启,要么实现监控系统。
您对添加 WSGIScriptReloading 指令是正确的。Flask 文档并没有使其 100% 清楚,但 Apache 会查找对您的 .wsgi 文件的更改。推荐的解决方案是在您的 .wsgi 文件上执行一个触摸命令,作为发布过程的一部分。
对于生产我也更喜欢 apache mod_wsgi,而对于开发我使用烧瓶的内置服务器。我将 prod 和 dev 配置文件分开,并在 dev 配置中设置debug
指令True
,以便 Flask 可以自动检测和重新加载代码更改。
这个问题的正确答案是WSGIScriptReloading On
需要将其添加到000-default.conf
当前/etc/apache2/sites-enabled
文件夹中。
见下面的例子
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerName sentiments.live
ServerAdmin admin@sentiments.live
DocumentRoot /var/www/html
WSGIDaemonProcess flaskapp threads=5
WSGIScriptAlias / /var/www/html/sentiments/flaskapp.wsgi
<Directory sentiments>
WSGIScriptReloading On
WSGIProcessGroup sentiments
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
你是什么意思'官方文件有点像熊'?包含的食谱有什么问题:
该文档还解释了为什么 WSGIScriptReloading 没有达到您的预期。
不,不可能因为语法错误而永久崩溃。它嵌入在 Apache 中,而 Apache 的全部意义在于保持运行。
听起来您不应该使用 Apache/mod_wsgi 进行开发。每个人都知道不应该在生产中使用自动源代码重新加载,所以无法想象你会想要这样做。