10

我有一个在 Nginx 和 Gunicorn 后面运行的 Django 项目。其中一个应用程序使用 Exscript 与网络设备交互,而 Exscript 又使用 Paramiko。有些设备在 Gunicorn 后面时无法正常工作。

相同的代码在 django-admin shell 中可以正常工作。如果我启动内置的 django 服务器,它也可以工作,但如果我绕过 nginx 并直接连接到 Gunicorn,我仍然会收到错误消息。

我尝试将功能移至 celery 任务,它有同样的问题,但只在 Gunicorn 后面。

我使用 django-extensions 编写了一个脚本,该脚本可以从命令行运行,但如果通过子进程调用会失败。但只在Gunicorn后面。

出现故障的设备似乎都是 F5 LTM,看起来 exscript 对象上的缓冲区正在以某种方式被修改。如果我不得不猜测,我会说 Gunicorn 和 Exscript/Paramiko 不知何故踩到了彼此的内存,或者 Gunicorn 正在设置一些 Exscript 正在接受的环境变量。

无论如何,我完全被难住了,并希望获得有关如何解决此问题的任何指导。

4

1 回答 1

1

总猜测,但也许这将有助于调试。基本上,确保您已删除所有输出缓冲,这通常会隐藏在分层多个大型框架时实际发生的事情(就像您在这里所做的那样)。

确保禁用 Python 中的所有输出缓冲,包括前台 Web 服务器进程和任何工作进程(设置PYTHONUNBUFFERED是确保 Python 脚本没有缓冲的简单方法,至少在标准库函数上)。

终端还可以引入使调试异常困难的缓冲区。考虑切换your commandstdbuf -o0 -e0 your command禁用 stdout 和 stderr 上的缓冲区(your command仍然可以重新启用它们,但大多数程序不会)。

于 2015-04-25T07:27:59.510 回答