管理uWSGI服务器

参见

如果你正在管理多个应用,或者一个高容量站点,那么看一看

启动服务器

启动一个uWSGI服务器是系统管理员的角色,例如启动Web服务器。不应该由Web服务器来启动uWSGI服务器 —— 虽然如果这适合你的架构,你也能那样做。

如何在引导的时候最好的启动uWSGI服务取决于你使用的操作系统。

在现代系统中,下述应该行得通。在“传统的”操作系统上,你可以使用 init.d/rc.d 脚本,或者诸如Supervisor, Daemontools 或 inetd/xinetd 这样的工具。

系统方法
Ubuntu通过Upstart运行uWSGI (the official uwsgi package, available since Ubuntu 12.04 provides an init.d based solution. Read the README.)
DebianSystemd
Arch LinuxSystemd
FedoraSystemd
OSXlaunchd
SolarisSMF

用来控制uWSGI的信号哦

你可以使用 safe-pidfile 选项,指示uWSGI将master进程的PID写入到一个文件中。

uWSGI对以下信号进行响应。

信号描述便捷命令
SIGHUP优雅地重载所有的worker和master进程—reload
SIGTERM粗鲁地重载所有的worker和master进程(使用 —die-on-term 以尊重关闭实例的传统)
SIGINT立即杀死整个uWSGI栈—stop
SIGQUIT立即杀死整个uWSGI栈
SIGUSR1打印统计数据
SIGUSR2打印worker状态或唤醒spooler
SIGURG恢复一个快照
SIGTSTP暂停/挂起/恢复一个实例
SIGWINCH唤醒一个在系统调用中阻塞的worker (内部使用)
SIGFPE生成C回溯
SIGSEGV生成C回溯

注意:比起使用信号,有更好的管理你的实例的方式,例如,master-fifo就是一个更健壮的方式。

重载服务器

当运行在 master 进程模式下时,uWSGI服务器可以在无需关闭主socket的情况下优雅地重启。

这个功能允许你在无需关闭与web服务器的连接以及丢失请求的情况下修补/更新uWSGI服务器。

当你发送 SIGHUP 给主进程时,它会试着优雅地停止所有的worker,等待任何当前运行中的请求完成。

然后,它关闭所有与uWSGI无关的最终打开的文件描述符。

最后,它使用一个新的来二进制修补 (使用 execve()) uWSGI进程镜像,继承所有之前的文件描述符。

服务器将会知道它是一个已重载的实例,并且会跳过所有的socket初始化,重用之前的。

注解

发送 SIGTERM 信号将会获得与优雅地重载相同的结果,但将不会等待运行中的请求的完成。

有多种方式来让uWSGI优雅地重启。

  1. # using kill to send the signal
  2. kill -HUP `cat /tmp/project-master.pid`
  3. # or the convenience option --reload
  4. uwsgi --reload /tmp/project-master.pid
  5. # or if uwsgi was started with touch-reload=/tmp/somefile
  6. touch /tmp/somefile

或在你的应用中,使用Python:

  1. uwsgi.reload()

或者使用Ruby,

  1. UWSGI.reload

停止服务器

如果出于某些原因,你让uWSGI进程在前台运行,那么使用CTRL+C就可以杀死它了。

在处理后台进程时,你将需要再次使用master pidfile。SIGINT信号将会杀死uWSGI.

  1. kill -INT `cat /tmp/project-master.pid`
  2. # or for convenience...
  3. uwsgi --stop /tmp/project-master.pid

Master FIFO

自uWSGI 1.9.17起,添加了一个新的管理系统,它使用unix命名管道 (fifo): Master FIFO