uWSGI 1.9.9
更新日志[20130508]
特别警告!!!
router_basicauth插件已经更改了它的默认行为,当鉴权失败的时候,会返回”break”。
“basicauth-next”动作,使用老行为 (返回”next”)
这个新方法应该减少由错误配置引发的安全性问题
错误修复
- 不为“不负责的”插件增加”tx”统计数据计数
- 修复–backtrace-depth
- 修复cache-sync解析
- 修复mule farm初始化
- 修复当使用正则表达式条件路由时的多线程问题
- 修复psgi插件中的default-app使用
- 修复python动态模式 + 线程
- 修复重试出现时corerouter中的错误报告
- 为网关正确报告harakiri条件
新特性
WebDav插件
WebDav是该项目要求得挺多的特性之一。现在,我们有了一个测试版本的插件,已经支持诸如carddav这样的其他标准:
https://github.com/unbit/uwsgi/blob/master/t/webdav/carddav.ini
官方的modifier是35,并且要把一个简单的目录作为webdav共享(适用于windows, gnome….)进行挂载,你仅需指定–webdav-mount选项:
- [uwsgi]
- plugin = webdav
- http-socket = :9090
- http-socket-modifier1 = 35
- webdav-mount = /home/foobar
记得保护共享:
- [uwsgi]
- plugin = webdav,router_basicauth
- http-socket = :9090
- http-socket-modifier1 = 35
- route-run = basicauth:CardDav uWSGI server,unbit:unbit
- webdav-mount = /home/foobar
WebDav属性是作为文件系统xattr进行存储的,因此,一定要使用支持它的文件系统 (ext4, xfs, hfs+…)
LOCK/UNLOCK支持仍然是不完整的
稍后会有官方文档。
支持Go 1.1 (或多或少,对于go用户而言,是个坏消息……)
虽然你可以成功地把go 1.1应用嵌入到uWSGI中,但是go 1.1将是完全fork()不安全的。
那意味着,你不能使用多进程,master,mule等等。
基本上,一半的uWSGI特性在go应用中都不怎么能用。
以后可能会有所改变,但目前,我们的目标是与gccgo项目更好的集成。
将会继续支持Go 1.0.x (除非gccgo显示了自己是一个更好的选择)
将会实现更多的特性。
改进的异步模式
已经更新Stackless, Greenlet和Fiber支持,以支持新的异步特性
radius插件
现在,你可以使用router_radius插件来鉴权radius服务器了:
- [uwsgi]
- plugin = webdav,router_radius
- http-socket = :9090
- http-socket-modifier1 = 35
- route-run = radius:realm=CardDav uWSGI server,server=127.0.0.1:1812
- webdav-mount = /home/foobar
SPNEGO插件
另一个鉴权后端,使用SPNEGO (kerberos)
- [uwsgi]
- plugin = webdav,router_spnego
- http-socket = :9090
- http-socket-modifier1 = 35
- route-run = spnego:HTTP@localhost
- webdav-mount = /home/foobar
这个插件还在测试阶段,因为它会内存泄漏 (看起来是MIT-kerberos中的一个问题),并Heimdal实现并没有用。
欢迎更多的报告
ldap认证
(作者:Łukasz Mierzwa)
目前,它缺乏SASL支持。很快会对其进行改善。
- [uwsgi]
- ...
- plugins = router_ldapauth
- route = ^/a ldapauth:LDAP realm,url=ldap://ldap.domain,com;basedn=ou=users,dc=domain.com;binddn=uid=proxy,dc=domain,dc=com;bindpw=password
新的内部路由特性
我们移除了GOON动作,因为它乱糟糟的,并且基本上对新的鉴权方法没用
添加了”setscriptname”动作来覆盖内部计算的SCRIPT_NAME (不仅是变量)
“donotlog”动作强制uWSGI不要记录当前请求
改进了”regexp”路由条件,以允许分组。现在,你可以很容易地操作字符串,并把它们当成新的请求变量进行添加:
- [uwsgi]
- ...
- route-if = regexp:${REQUEST_URI};^/(.)oo addvar:PIPPO=$1
- route-run = log:PIPPO IS ${PIPPO}
这将会获取foo的第一个字符,然后将其放到PIPPO请求变量中
Gevent atexit钩子
uwsgi.atexit钩子现在由gevent插件兑现 (作者:André Cruz)
流转换
可以在运行时应用转换 (不涉及缓冲)。
看看已更新的文档: uWSGI转换
xattr插件
xattr插件让你在内部路由子系统中应用文件扩展属性:
- [uwsgi]
- ...
- route-run = addvar:MYATTR=user.uwsgi.foo.bar
- route-run = log:The attribute is ${xattr[/tmp/foo:MYATTR]}
或者 (带2个变量的变种)
- [uwsgi]
- ...
- route-run = addvar:MYFILE=/tmp/foo
- route-run = addvar:MYATTR=user.uwsgi.foo.bar
- route-run = log:The attribute is ${xattr2[MYFILE:MYATTR]}
airbrake插件
(作者:Łukasz Mierzwa)
目前处于开发的早期阶段,允许发送uWSGI异常和高级给airbrake服务器。
稍后将会有官方文档。
Legion守护进程
(作者:Łukasz Mierzwa)
不,这不是一个黑金属乐队,它是 uWSGI Legion子系统 的一个新特性,允许你只在实例是lord的时候运行外部进程:
- [uwsgi]
- master = true
- http = :8081
- stats = :2101
- wsgi-file = tests/staticfile.py
- logdate = true
- legion = legion1 225.1.1.1:19678 100 bf-cbc:abc
- legion-node = legion1 225.1.1.1:19678
- legion-attach-daemon = legion1 memcached -p 10001
- legion-smart-attach-daemon = legion1 /tmp/memcached.pid memcached -p 10002 -d -P /tmp/memcached.pid
–touch-exec
有一个新的”touch”选项 (像–touch-reload)可以用了,触发一条命令的执行:
- [uwsgi]
- ...
- touch-exec = /tmp/foobar run_my_script.sh
- touch-exec = /var/test/foo.txt run_my_second_script.sh arg1 arg2
用于缓存的数学运算
现在,你可以使用缓存子系统来存储64位有符号数,并在其上应用原子操作。
已使用5个新函数扩展了uwsgi api (目前仅有python插件公开):
*uwsgi.cache_num(key[,cache]) ->从指定项获取64位数
*uwsgi.cache_inc(key[,amount=1,expires,cache]) -> 增加指定键指定值
*uwsgi.cache_dec(key[,amount=1,expires,cache]) -> 减少指定键指定值
*uwsgi.cache_mul(key[,amount=2,expires,cache]) -> 乘以指定键指定值
*uwsgi.cache_div(key[,amount=2,expires,cache]) -> 除以指定键指定值
已将该新api暴露给路由子系统了,允许你事先高级模式,例如请求限制器:
https://github.com/unbit/uwsgi/blob/master/t/routing/limiter.ini
这个例子显示了热限制一个单一的IP的请求为每30秒10个
这个新功能的长期目标是作为即将到来的度量子系统的基础
可用性
uWSGI 1.9.9自20130508起可用,你可以在下面的url中找到它