Master FIFO

自uWSGI 1.9.17起可用。

一般来说,使用UNIX信号来管理maser,但是我们正在用尽信号数,并且(更重要的是)不需要跟PID混在一起回极大地简化外部管理脚本的实现。

因此,取代信号,你可以告诉master创建一个UNIX命名管道 (FIFO),这样,你刻意用它来发布命令给master。

要创建一个FIFO,仅需添加 --master-fifo <filename> ,然后开始发布命令给它。

echo r > /tmp/yourfifo

你可以一次性发送多个命令。

# add 3 workers and print stats
echo +++s > /tmp/yourfifo

可用命令

  • ‘0’ to ‘9’ - 设置fifo slot (见下文)
  • ‘+’ - 在cheaper模式的时候增加worker数 (添加 --cheaper-algo manual 以获得完全控制)
  • ‘-‘ - 在cheaper模式的时候减少worker数 (添加 --cheaper-algo manual 以获得完全控制)
  • ‘B’ - 让Emperor进行加固 (broodlord模式,要求uWSGI >= 2.0.7)
  • ‘C’ - 设置cheap模式
  • ‘c’ - 出发链重载
  • ‘E’ - 触发一次Emperor重新扫描
  • ‘f’ - 重新fork master (危险,但很强大)
  • ‘l’ - 重新打开日志文件 (需要 –log-master 和 –logto/–logto2)
  • ‘L’ - 触发日志循环 (需要 –log-master 和 –logto/–logto2)
  • ‘p’ - 暂定/恢复实例
  • ‘P’ - 更新pidfile (在master重新fork之后会非常有用)
  • ‘Q’ - 粗鲁地关闭实例
  • ‘q’ - 优雅地关闭实例
  • ‘R’ - 发送粗鲁重载
  • ‘r’ - 发送优雅重载
  • ‘S’ - 阻塞/消除阻塞订阅
  • ‘s’ - 在日志中打印统计信息
  • ‘W’ - 粗鲁地重载worker
  • ‘w’ - 优雅地重载worker

FIFO slot

uWSGI支持多至10个不同的FIFO文件。默认情况下,绑定第一个指定的(映射为‘0’)。

在实例的生命周期中,你可以通过简单发送要使用的FIFO slot的数字来从一个FIFO改成另一个。

[uwsgi]
master-fifo = /tmp/fifo0
master-fifo = /tmp/fifo1
master-fifo = /var/run/foofifo
processes = 2
...

默认情况下,会分配 /tmp/fifo0 ,但在发送以下命令之后:

echo 1 > /tmp/fifo0

将会绑定 /tmp/fifo1 文件。

当你(滥)用“fork master”命令(’f’)时,映射FIFO文件到特定的实例是非常有用的。

echo 1fp > /tmp/fifo0

在发送这个命令后,一个新的uWSGI实例(继承所有的绑定socket)将会生成,而老的将会被置为”暂停”模式(‘p’命令)。

如果我们在’f’和’p’之前已经发送了‘1’命令,那么老的实例现在将会接收在/tmp/fifo1 (slot 1)的命令,而新的将会使用默认的(‘0’)。

你可以做到很多技巧,也有很多方法尽情使用master的fork。

只需考虑到,极端情况可能会发生在任何地方,特别是如果你使用uWSGI最复杂的功能。

小抄

  • FIFO是创建于非阻塞模式,并且在每次客户端断连的时候由master重新创建。
  • 你可以通过插件或者C钩子,使用全局数组 uwsgi_fifo_table 来覆盖(或添加)命令。
  • 只有运行master的uid才有fifo的写权限。