我正在使用mod_wsgi在Apache2中提供CherryPy应用程序对象。从用户的角度来看,一切似乎都很好,这意味着他/她可以实际访问应用程序并按预期使用它。但是我面临的问题是由于新的部署而导致代码更改。
以下是Apache中的应用程序配置:
WSGIDaemonProcess app-name user=someuser group=somegroup processes=4 maximum-requests=1000 inactivity-timeout=3600 umask=0007 python-path="path-to-sources:path-to-python-site-packages"
WSGIScriptAlias /app-url /location/of/wsgi/start/script/wsgi.py
<Directory "/location/or/sources">
WSGIProcessGroup somename
</Directory>
wsgi启动脚本包含以下内容:
import sys
import root.index
sys.stdout = sys.stderr
application = root.index.get_wsgi_app()
#which return an object of cherrypy.Application
CherryPy正在“生产模式”中运行,这意味着:
'engine.autoreload_on': False,
'checker.on': False,
'tools.log_headers.on': False,
'request.show_tracebacks': False,
'request.show_mismatched_params': False,
'log.screen': False,
之后我手动覆盖engine.autoreload_on并将其设置为True,因为我希望应用程序获取代码更改并重新启动,但这没有所需的效果。我知道触摸wsgi脚本文件或重新启动Apache应该会产生我想要的,但CherryPy应该自己检测这些更改并相应地重新启动,就像运行本地开发服务器时一样。就我所知,唯一的区别是本地我称之为cherrypy.tree.mount,在生产中我称之为cherrypy.Application。
自下而上:如何让我的生产应用程序接收代码更改并重新加载?
答案 0 :(得分:1)
CherryPy具有与任何其他WSGI框架一样的请求处理程序(和WSGI应用程序)。但它也有一个引擎,它处理在请求本身之外发生的所有事情。当你独立运行时,它包括很多进程管理:PID,守护进程等。当你在Apache内部运行时,很多都是为你完成的,看起来你不需要运行引擎。不对。你仍然应该至少运行它来处理信号,加上任何后台任务的记录,并可能将代码挂钩到线程的启动和停止。在这种情况下,Autoreloader依赖于正在运行的引擎。有关Engine对象的更多信息,请参阅http://docs.cherrypy.org/stable/concepts/engine.html;有关示例代码,请参阅http://tools.cherrypy.org/wiki/ModWSGI。