【问题标题】:Could gunicorn cause an issue with exscript/paramiko?gunicorn 会导致 exscript/paramiko 出现问题吗?
【发布时间】:2014-12-26 22:32:52
【问题描述】:

我有一个在 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 正在接受的一些环境变量。

无论如何,我都被难住了,如果能提供任何有关如何解决此问题的指导,我将不胜感激。

【问题讨论】:

  • 你是如何安装 paramiko 的?使用操作系统包?用点子?你使用虚拟环境吗?你确定 gunicorn 使用与你的命令行相同的 paramiko 吗?
  • Parimiko 是使用 pip 安装的,并且仅在 gunicorn 使用的 virtualenv 中。好主意。
  • 如果您仍有问题,请评论您在 gunicorn 中使用的是哪个 runner type?当您说它失败时,您能否详细说明究竟发生了什么(异常、进程挂起等)?
  • 我的猜测是,您通过 paramiko 与之交互的对象是 TTY——一个交互式终端。

标签: python django gunicorn paramiko f5


【解决方案1】:

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

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

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

【讨论】:

  • 赞成,因为我当时没有考虑过,但我们最终通过使用 f5 库解决了这个问题。
猜你喜欢
  • 2016-06-16
  • 2012-08-21
  • 1970-01-01
  • 2023-04-04
  • 2016-05-20
  • 2011-09-18
  • 2023-03-05
  • 2015-09-07
相关资源
最近更新 更多