uWSGI 2.0.1

更新日志 [20140209]

错误修复和改进

  • 由于错误的原型声明,无SSL构建uWSGI会导致编译错误。此问题已得到修复。
  • 已修复PyPy插件中防止大量线程使用的竞争条件
  • 只有在心跳子系统已启用的情况下才检查心跳状态
  • 改进心跳代码,以支持各种边缘情况
  • 改进psgi.input以支持read()中的偏移
  • 修复 (和简化) perl堆栈跟踪使用情况
  • 修复sni安全订阅
  • CGI插件不再需要了,Status头部是第一个 (Andjelko Horvat)
  • 修复CPython mule_msg_get超时时间解析
  • 允许通过绝对路径嵌入配置文件
  • 修复symcall rpc
  • 修复CPython spooler api中的内存泄漏 (xiaost)
  • –no-orphans加固已经回来了 (目前仅Linux)
  • 改进dotsplit路由器模式,以减少DOS风险
  • 子Emperor现在默认是loyal的
  • 修复非共享ruby 1.8.7支持
  • 修复harakiri CPython对tracebacker
  • 请求变量现在正确由统计信息服务器公开
  • 对logfile-chown支持log-master
  • 改进legion重载
  • 修复tuntap网络掩码
  • 修复busyness插件,无需度量子系统

新特性

uWSGI 2.0是一个LTS分支,因此,别期待有灰常多的新特性。2.0.1是第一个维护发布版本,因此,你仍然可以获得一堆新特性 (主要特性并未在2.0完成)

Perl原生Spooler支持

Perl最终获得了对Spooler子系统的支持。在2.0中,我们添加了服务器支持,而在2.0.1中,我们也完成了客户端支持。

use Data::Dumper;

uwsgi::spooler(sub {
     my $env = shift;
     print Dumper($env);
     return uwsgi::SPOOL_OK;
});

uwsgi::spool({'foo' => 'bar', 'arg2' => 'test2'})

–alarm-backlog

当监听队列满的时候,引发指定告警

[uwsgi]
alarm = myalarm cmd:mail -s 'ALARM ON QUEUE' admin@example.com
alarm-backlog = myalarm

–close-on-exec2

关于作者:Kaarle Ritvanen

这个标志在所有服务器socket上应用CLOSE_ON_EXEC socket标志。如果你不想要你请求生成进程继承服务器描述符,那么使用它。

注意:–close-on-exec在所有的socket(客户端和服务器)上应用此标志

简单通知子系统

订阅的一个烦人问题是,客户端不知道它是否已正确被订阅至服务器了。

该通知子系统允许你添加订阅包到一个数据报地址 (udp或者unix),服务器将会发送回消息(例如成功的订阅)到该地址

[uwsgi]
; enable the notification socket
notify-socket = /tmp/notify.socket
; pass it in subscriptions
subscription-notify-socket = /tmp/notify.socket
...

该通知子系统是真正通用的。期待未来会有更多的子系统使用它。

用于守护进程的pid名字空间 (仅Linux)

这是一个仅Linux的实验性特性,允许你在一个新的pid名字空间内生成守护进程。这个特性要求master作为root运行。

看看: 管理外部守护进程/服务

重订阅

fastrouter和http/https/spdy路由器现在支持”重订阅”。

你可以指定一个数据报地址 (udp或unix),所有的订阅请求将会被转发到该地址 (明显改变节点地址到这个路由器地址)

这个系统在构建“联合”设置时会有用:

[uwsgi]
fastrouter = 192.168.0.1:3031
fastrouter-subscription-server = 127.0.0.1:5000
fastrouter-resubscribe = 192.168.0.2:5000

使用这个设置,192.168.0.2上的fastrouter会拥有目的被设置为192.168.0.1:3031的所有192.168.0.1的记录。

文件系统监控API

该实时文件通知API已被标准化,现在可以通过插件使用它了。注册一个监控器的原型是:

struct uwsgi_fsmon *uwsgi_register_fsmon(char *path, void (*func) (struct uwsgi_fsmon *), void *data) {

它将会在“path”上注册一个监控器,触发函数”func”,并将”data”作为参数传递给该函数。

记住,这与”touch” api不同,它是基于poll的,并且只能监控文件。(而fsmon还可以监控文件夹)

对yajl 1.0的支持

2.0添加了yajl JSON解析器 (version 2)的支持。2.0.1也添加了对1.0的支持。

for-readline

一个配置逻辑迭代器,它生成(yield)文件行:

[uwsgi]
for-readline = /etc/myenvs
  env = %(_)
end-for =

%i和%j魔术变量

%i -> 返回当前解析文件的inode

%j -> 返回当前解析绝对文件名的32位djb33x哈希的十六进制表示

–inject-before 和 –inject-after

这两个新的选项应该为每个人使配置模板系统完整。

它们基本上前置和附加’blobs’到一个配置文件。

是哒,这听起来有点扯淡。

看看下面的例子:

header.xml:

<uwsgi>
    <socket>:3031</socket>

footer.xml:

<master/>
    </uwsgi>

和body.xml:

<processes>8</processes>

你可以这样构建一个单一的配置树:

uwsgi --show-config --inject-before header.xml --inject-after footer.xml --xml body.xml

这个方法,虽然原始,但是让你以更高级的方式使用魔术变量(因为你可以使用它们控制文件的上下文)

注意:顺序很重要,–inject-before和–inject-after必须在相关配置选项之前指定。

–http-server-name-as-http-host

一些Ruby/Rack中间件在SERVER_NAME/HTTP_HOST检查的时候进行可疑检查。

这个标志允许http路由器自动映射SERVER_NAME到HTTP_HOST,而不是指示你的uWSGI实例来做这件事。

更好的Emperor的Ragnarok (关闭过程)

‘Ragnarok’是Emperor阶段,当你让它关闭时,会执行此阶段。

在2.0.1之前,这个过程简单发送KILL给vassal,来粗暴销毁它们。

而这个新的Ragnarok则是一种更加仁慈的方式,让vassal优雅关闭。

Emperor对vassal不关闭的容忍可以使用–reload-mercy来调整 (默认30秒)

PyPy粘贴支持

已添加两个用于PyPy插件的新选项,用于粘贴支持:

–pypy-paste <config>

–pypy-ini-paste <ini>

它们都1:1映射到CPython变量,但与其相反,它们自动修复日志记录

可用性

你可以从这里下载uWSGI 2.0.1: http://projects.unbit.it/downloads/uwsgi-2.0.1.tar.gz