uWSGI重启时停机

ald*_*ido 2 django nginx uwsgi

每次当我有代码更新时重新启动服务器时,我都会遇到 uwsgi 问题。

  1. 当我使用“sudo restart account”重新启动 uwsgi 时,停止和启动实例之间存在一个小间隙,导致停机并停止所有当前请求。

  2. 当我尝试“sudo reloadcounting”时,它有效,但我的记忆力上升(双倍)。当我运行命令“ps aux | grep account”时,它显示我有 10 个正在运行的进程 (accounting.ini),而不是 5 个,并且当内存达到限制时,它会冻结我的服务器。

会计.ini

在此输入图像描述

我在跑步

  • 乌班图14.04
  • 姜戈 1.9
  • nginx 1.4.6
  • uwsgi 2.0.12

Kam*_*ski 6

这就是 uwsgi 优雅地重新加载的方式。保留旧进程,直到请求得到服务为止,并创建新进程来接管传入请求。

\n\n

可能出错的事情

\n\n
\n

不要忘记,仍在运行请求的工作线程/线程可能会阻止重新加载(出于各种原因),时间超过代理服务器可以容忍的秒数。

\n
\n\n

和这个

\n\n
\n

优雅重载的另一个重要步骤是避免破坏仍在管理请求的工作线程/线程。显然,请求\n可能会被卡住,所以你应该有一个运行工作线程的超时(在\n uWSGI中,它被称为\xe2\x80\x9cworker\xe2\x80\x99s怜悯\xe2\x80\x9d,它有一个默认值值\n 60 秒)。

\n
\n\n

所以我建议尝试worker-reload-mercy

\n\n

默认值是等待 60 秒,只需将其降低到服务器可以处理的值即可。

\n\n

告诉我是否有效。

\n\n
\n\n

Uwsgi链重新加载

\n\n

这是解决您的问题的另一次尝试。正如您提到的,您的 uwsgi 工作人员正在以下述方式重新启动:

\n\n
    \n
  1. SIGHUP向主机发送信号
  2. \n
  3. 等待正在运行的工人。
  4. \n
  5. 关闭除映射到套接字的文件描述符之外的所有文件描述符。
  6. \n
  7. 对自身调用 exec()。
  8. \n
\n\n

这种重新加载的缺点之一可能是工作人员被卡住。\n此外,您报告说,当 uwsgi 维护 10 个进程(5 个旧进程和 5 个新进程)时,您的服务器崩溃。

\n\n

我建议尝试chain reload。文档中的直接引用解释了这种重新加载的最佳方式:

\n\n
\n

触发后,它将在时间 重新启动一个工作程序,并且直到前一个工作程序准备好接受新请求时,才会重新加载后面的工作程序。

\n
\n\n

这意味着您的服务器上不会有 10 个进程,而是只有 5 个。

\n\n

应该有效的配置:

\n\n
# your .ini file\nlazy-apps = true\ntouch-chain-reload = /path/to/reloadFile\n
Run Code Online (Sandbox Code Playgroud)\n\n

有关链重载和其他类型的一些资源位于以下链接中:

\n\n

链重载 uwsgi 文档

\n\n

uWSGI 优雅的Python代码部署

\n