uWSGI 1.9.3

更新日志 20130328

错误修复

修复当使用虚拟环境的时候,在JVM构建系统中的导入问题 (Ryan Kaskel)

修复apache 2.4的mod_proxy_uwsgi问题

修复当Status是由php应用自身创建的时候的php头部问题

新特性

可插拔配置系统 (带Lua支持)

从此版本起,你将能够将配置器 (例如已经可用的xml, ini, yaml, json, ldap, sqlite…) 作为插件实现。

第一个可用的配置器是Lua (由lua插件提供)。

这是一个用Lua写的样例配置:

  1. config = {}
  2.  
  3. config['immediate-uid'] = 'roberto'
  4. config['immediate-gid'] = 'roberto'
  5. config['http-socket'] = ':9090'
  6. config['env'] = { 'FOO=bar', 'TEST=topogigio' }
  7. config['module'] = 'werkzeug.testapp:test_app'
  8.  
  9. return config

你可以这样加载它:

  1. uwsgi --plugin lua --config config.lua

–config选项是加载可插拔配置器的方式。你甚至可以使用自己的版本来覆盖已经可用的内嵌的配置器。

Emperor已被扩展来支持可插拔配置器:

  1. [uwsgi]
  2. emperor = /etc/uwsgi/vassals
  3. emperor-extra-extension = .lua
  4. emperor-extra-extension = .foo

增加emperor-extra-extension将会允许emperor搜索指定的扩展名,使用–config选项传递配置文件给vassal。

即用setuid和setgid

在最近的uWSGI邮件列表支线中,对于tyrant模式,不依赖于文件系统权限的需求应运而生。

尽管它是最安全的方法,但是还是添加了两个新的选项–immediate-uid和–immediate-gid。

在你的vassal文件顶部设置它们将会强制实例尽快setuid()/setgid(),并且(理论上来讲)不可能覆盖掉它们。

这里,“理论上来讲”这个词是关键,你需要记住,uWSGI中的一个安全性问题可能允许恶意用户修改权限,因此,如果你真的在意安全性 (或者不信任uWSGI开发者;) ,那么就要在生成vassal/实例之前删除权限 (就像在标准的tyrant模式中)

已经添加了选项–emperor-tyrant-nofollow,用来在tyrant模式中搜索uid/gid的时候,迫使emperor遵循符号链接。

该选项允许系统管理员简单的符号连接配置,并且只是修改符号连接自身的uid/gid (记得把-h选项传递给chown!!!)

“rpcret”路由动作 (或者使用Lua编写高级规则)

uWSGI内部路由 在持续改善中。

你已经可以为路由系统调用rpc函数了 (生成绕过WSGI/PSGI/Rack/…引擎的响应):

  1. [uwsgi]
  2. lua-load = myrpcfunctions.lua
  3. route = ^/foo/(.+)/call rpc:hello_world ${REMOTE_ADDR} $1

hello_world rpc函数是在myrpcfunctions.lua中定义(以及注册)的,它接收两个参数。

当路由正则表达式匹配上的时候,会调用该函数,而它的输出会被发送给客户端。

“rpcret”工作方式相似,但不是生成响应,而是生成一个路由返回码:

  1. function choose(request_uri, remote_addr)
  2. print( 'REQUEST_URI is ' ..request_uri.. ' (from Lua)')
  3. if request_uri == '/topogigio' then
  4. return "goto topogigio"
  5. end
  6. return "break 500 Internal server Error !!!"
  7. end
  8.  
  9. print('Hello Hello')
  10. uwsgi.register_rpc('choose', choose)

以及uWSGI配置:

  1. [uwsgi]
  2. route-run = rpcret:choose ${REQUEST_URI} ${REMOTE_ADDR}
  3. route-run = break
  4.  
  5. route-label = topogigio
  6. route-run = log:i am topogigio !!!

这个’choose’ rpc函数将会在每个请求中被调用,传递REQUEST_URI和REMOTE_ADDR作为它的参数。

函数的返回字符串将会被用来指示下一步做什么 (从内部路由的角度)。

目前支持的返回字符串是:

next 移到下一条规则

continue 将请求传递给请求处理器

goon 移动到下一个有着不同动作的规则

break 关闭连接,有一个可选的状态码

goto <label> 跳到指定的标签

显然,可以在任何uWSGI支持的语言/平台中编写用于rpcret的rpc函数,但是我们强烈建议出于性能原因,使用Lua(与纯C相比,影响是非常不相关的)。如果你幸运,可以使用LuaJit,你会体验到甚至更好的性能,因为对于这种任务,JIT编译器是最好的方法。

可用性

uWSGI 1.9.3已经在20130328发布,你可以从下面的地址中下载:

http://projects.unbit.it/downloads/uwsgi-1.9.3.tar.gz