uwsgi协议

uwsgi协议是uWSGI服务器使用的本地协议。

它是一个二进制协议,可以携带任何类型的数据。一个uwsgi分组的头4个字节描述了这个分组包含的数据类型。

每个uwsgi请求生成一个uwsgi格式的响应。

甚至是web服务器处理程序也遵循这个规则,因为一个HTTP响应是一个有效的uwsgi包 (看下 modifier1 = 72)。

该协议主要通过TCP工作,但是master经常可以为 内嵌SNMP服务器 或者集群管理/消息请求绑定到一个UDP单播/组播。

SCTP支持正在开发中。

uwsgi包头

  1. struct uwsgi_packet_header {
  2. uint8_t modifier1;
  3. uint16_t datasize;
  4. uint8_t modifier2;
  5. };

除非另有指定的 datasize 值包含了包体大小 (小端的16位)。

包描述

modifier1datasizemodifier2packet type
0WSGI块变量大小 (HTTP请求体除外)0标准WSGI请求,后面跟着HTTP请求体
1为UNBIT保留
2为UNBIT保留
3为UNBIT保留
5PSGI 块变量 (HTTP请求体除外)的大小0标准 PSGI 请求,后面跟着HTTP请求体
6LUA WSAPI块变量 (HTTP请求体除外) 大小0标准LUA/WSAPI请求,后面跟着HTTP请求体
7RACK块变量 (HTTP请求体除外) 大小0标准RACK请求,后面跟着HTTP请求体
8JWSGI/Ring块变量 (HTTP请求体除外) 大小0用于 JWSGI接口Clojure/Ring JVM请求处理器 的标准JVM请求,后面跟着HTTP请求体
9CGI块变量 (HTTP请求体除外) 大小0标准 在uWSGI上运行CGI脚本 请求,后面跟着HTTP请求体
10块变量大小0- 255管理接口请求:由modifier2指定的setup标志。关于管理标志列表,查看ManagementFlag
14CGI块变量 (HTTP请求体除外) 大小0标准 在uWSGI中运行PHP脚本 请求,后面跟着HTTP请求体
15Mono ASP.NET块变量 (HTTP请求体除外) 大小0标准 Mono ASP.NET插件 请求,后面跟着HTTP请求体
17Spooler块变量大小0- 255uWSGI Spooler 请求,块变量会被转换成一个字典/哈希/表,然后被传递给spooler可调用对象。当前忽略第二个modifier.
18CGI块变量的大小0-255直接调用到类C符号
22代码字符串大小0- 255原始代码评估。由modifier2选定解释器。0是Python, 5是Perl。它不会返回一个有效的uwsgi响应,但会返回一个原始字符串 (可能是一个HTTP响应)
23CGI变量大小0- 255调用 XSLT插件
24CGI变量大小0- 255调用 uWSGI V8支持
25CGI变量大小0- 255调用 GridFS插件
26CGI变量大小0- 255调用 GlusterFS插件
2700- 255调用modifier2字段指定的 FastFuncs
2800- 255调用 RADOS插件
30WSGI块变量 (HTTP请求体除外) 大小0 (如果定义,那么块变量的大小是24位,目前,没有web服务器处理器支持这个特性)标准WSGI请求,后面跟着HTTP请求体。会自动修改PATH_INFO,将SCRIPT_NAME从中删除
31块变量大小0- 255一般消息传递 (保留)
32字符数组大小0- 255字符数组传递 (保留)
33marshal对象大小0- 255编组/序列化对象传递 (保留)
48snmp特定snmp特定标识一个SNMP请求/响应 (主要通过UDP)
72chr(TT)chr(P)相对于’HTTP’字符串,标志这是一个原始的HTTP响应。
73宣告消息大小 (完备性检查)宣告类型(0 = 主机名)宣告消息
74多播消息大小 (完备性检查)0字符数组;一个自定义的多播消息,由 uwsgi.multicast_manager 管理
95集群成员字典大小action从一个机器添加/移除/启用/禁用节点。操作可以是 0 = 添加, 1 = 移除, 2 = 启用, 3 = 禁用。添加操作要求一个至少包含3个键的字典: hostname, addressworkers
96日志消息大小0远程日志记录 (集群/多播/单播)
9700, 1粗鲁重载请求 (0 请求 - 1 确认)
9800, 1优雅重载请求 (0 请求 - 1 确认)
99选项字典的大小 (如果响应)0, 1来自一个uwsgi节点的请求配置数据 (即使通过多播)
10000, 1PING- PONG 如果modifier2为0,那么它是一个PING请求,否则它是一个PONG (一个响应)。对于集群健康检查有用
101包大小0ECHO服务
109干净的有效负荷的大小0 to 255legion消息 (UDP, 请求体被加密)
110负载大小0 to 255uwsgi_signal 框架 (有效负荷是可选的), modifier2是信号数字
111包大小0, 1, 2, 3缓存操作。0: 读, 1: 写, 2: 删除, 3: 基于字典
123包大小-用于通知核心路由器特殊条件的特殊modifier
173包大小0, 1RPC。包时一个uwsgi数组,其中,第一个项是函数名,而接下来是参数 (如果 modifier2 是1,那么RPC将会是’raw’,并且所有的响应将会被返回给应用,包含uwsgi头,如果可用的话。
20000用于持久性连接的关闭标志
224包大小0订阅包。见SubscriptionServer
25500- 255一般响应。请求相关。例如,一个spooler响应为一个失败的spool设置0,而为一个成功的spool设置1

uwsgi变量

uwsgi块变量表示一个字典/哈希。hash. 每个键值对都以这种方式进行编码:

  1. struct uwsgi_var {
  2. uint16_t key_size;
  3. uint8_t key[key_size];
  4. uint16_t val_size;
  5. uint8_t val[val_size];
  6. }