我有一个在Nginx和Gunicorn背后运行的Django项目。其中一个应用程序使用Exscript与网络设备交互,后者又使用Paramiko。有些设备在Gunicorn后面无法正常工作。
同样精确的代码可以在django-admin shell中正常工作。 如果我启动内置的django服务器,它也会工作,但如果我绕过nginx,我仍然会收到错误,并直接连接到Gunicorn。
我尝试将功能转移到芹菜任务,它有同样的问题,但仅限于Gunicorn。
我使用django-extensions编写了一个脚本,该脚本可以从命令行运行,但如果通过子进程调用则会失败。但仅限于Gunicorn。
失败的设备似乎都是F5 LTM,看起来exscript对象上的缓冲区正在以某种方式被修改。如果我不得不猜测我会说Gunicorn和Exscript / Paramiko以某种方式踩到彼此的记忆,或者Gunicorn正在设置一些环境变量,Exscript正在接受。
在任何情况下,我都会感到非常难过,并会对如何解决此问题提供任何指导。
答案 0 :(得分:1)
总猜,但也许这对调试很有帮助。基本上,确保您已经删除了所有输出缓冲,这通常可以隐藏在分层多个大框架时真正发生的事情(就像您在这里所做的那样)。
确保在Python中禁用所有输出缓冲,包括前台Web服务器进程和任何工作进程(设置PYTHONUNBUFFERED
是一种简单的方法来确保您的python脚本都没有缓冲,至少在标准库函数)。
终端还可以引入缓冲区,使调试异常困难。考虑将your command
切换到stdbuf -o0 -e0 your command
以禁用stdout上的缓冲区,而stderr(your command
仍然可以重新启用它们,但大多数程序都没有)。