我正在尝试在 Windows Server 2012 上的 iis8 上部署 python web 框架 web2py。我正在使用从 Microsoft 下载的 fastcgi,v 2.1 和 python 2.7
web2py 有时会在 docroot 下创建 .py 文件。发生这种情况时,IIS 请求线程会立即崩溃,并出现 500 错误“FastCGI 进程意外退出”。我每次都可以重现这种情况,例如通过在请求处理程序脚本中使用 python 标准库提取 tar 文件。
如果我让 web2py 在文档根目录之外写入,则不会发生错误。因此,当创建 .py 文件时,IIS 会做出反应。这会导致冲突,从而使请求崩溃。不会发生 Python 异常。请求线程立即终止。文件保留为 0 字节。因此,该文件是由执行的用于处理请求的 Python 脚本创建的,但在关闭之前,请求进程或线程终止。我不知道 IIS 在做什么或为什么,但它是否执行某种文件监视?我已经关闭了缓存。
web2py 有时会尝试写入 .py 文件。它在两种情况下会这样做:1) 使用基于浏览器的 IDE 编辑 .py 文件(例如“控制器”)2) 创建新应用程序时,因为它会解压名为 welcome 的模板应用程序,这涉及写入 .py 文件我有一个模拟 (2) 的控制器。也就是说,作为处理浏览器请求的一部分,它会解压组成模板应用程序的文件包,其中包括 .py 文件。
这些问题与文件系统安全无关,因为非 .py 文件是可以的。无论如何,文件权限错误肯定会由 python 异常处理或记录在某处。
集中于 (2),Web 请求一旦遇到第一个 .py 文件就会灾难性地失败。
看起来像是某种锁定。我正在仔细检查 processmon,但没有发现任何有趣的东西。我可以从 IIS 获取崩溃请求的请求跟踪日志,但它没有提供任何原因,尽管我没有解释这些文件的经验。
如果我将 (2) 中使用的路径更改为 IIS 网站的文档根目录之外,它就可以完美运行。不幸的是,这不是解决办法;web2py 需要在文档根目录下更新和创建文件。
因此,当 .py 文件添加到其文档根目录下时,IIS 正在执行某些操作,而这些操作并非发生在实际运行的请求中,而是发生在其他线程或进程中。无论这些操作是什么,请求线程都会被终止,这可能是由于文件系统错误处理得不太好。请求线程似乎立即终止。我有大量日志记录语句,但从未出现等待此文件错误的 Python 异常。
web2py代码已经成熟,可以在其他http服务器下运行。
答案1
发生这种情况的原因是 wfastcgi 有一个非常具体的代码部分,用于处理应用程序目录中文件更改的观察器。不幸的是,如果在执行请求期间添加了新文件,它就会出错。默认情况下,它会以相当突然的方式重新启动任何 *.py 或 *.config 更改的进程。但是,可以通过 WSGI_RESTART_FILE_REGEX 环境变量将其设置为仅监视 *.config 文件。