我有一个运行在Nginx和Gunicorn后面的Django项目。其中一个应用程序使用Exscript与网络设备交互,而Exscript又使用Paramiko。一些设备在Gunicorn后面时无法正常工作。
完全相同的代码在django-admin shell中可以很好地工作。如果我启动内置的django服务器,它也会工作,但如果我绕过nginx,直接连接到Gunicorn,我仍然会得到错误。
我试着把这个功能移到一个芹菜任务上,也遇到了同样的问题,但只是在Gunicorn后面。
我使用django-extensions编写了一个脚本,它可以从命令行运行,但如果通过子进程调用,将会失败。但仅次于Gunicorn。
失败的设备似乎都是exscript LTM,而且看起来F5对象上的缓冲区正在以某种方式被修改。如果要我猜的话,我会说Gunicorn和Exscript/Paramiko以某种方式踩在了彼此的内存上,或者Gunicorn正在设置某个Exscript正在拾取的环境变量。
在任何情况下,我都被彻底难住了,我非常感谢任何关于如何解决这个问题的指导。
发布于 2015-04-25 15:28:00
完全是猜测,但这可能会对调试有所帮助。基本上,确保你已经移除了所有的输出缓冲,这通常会隐藏在分层多个大框架时真正发生的事情(就像你在这里做的那样)。
确保禁用Python中的所有输出缓冲,包括前台way服务器进程和任何工作进程(设置PYTHONUNBUFFERED是一种简单的方法,可以确保您的python脚本都没有缓冲,至少在标准库函数上如此)。
终端还可以引入缓冲区,这使得调试变得异常困难。考虑将your command切换到stdbuf -o0 -e0 your command,以禁用标准输出和标准错误上的缓冲区(your command仍然可以重新启用它们,但大多数程序不会)。
https://stackoverflow.com/questions/26660542
复制相似问题