项目

概况

个人资料

操作

想法

通用事项

  • 使用 Ragel 生成解析器
  • 将好用的工具拆分为独立的树(spawn-fcgi, fcgi-stat-accel)
  • 使用 glib2 作为容器及其他用途(模块、日志记录等?)
  • 绝不使用全局变量。绝不!
  • 通过将日志文件路径传递给日志线程而非日志指针,允许动态日志文件

让开发者和公司建立联系

  • http://www.cherokee-project.com/contribute.html - 悬赏任务,让公司出资购买他们想要的功能,并邀请社区编写模块或扩展以赚取报酬,好主意!用户可以提交他们的补丁/模块给开发者,由开发者决定哪些会被实现以及谁赢得奖金。

天使

  • 应该使用独立的配置文件
    • 管理套接字以实现优雅重启
  • 插件(例如用于 fcgi 启动)

配置结构

  • 通用后端
  • 旧式配置前端
  • Lua 前端
  • 线性的请求处理,避免令人困惑的条件块(当然仍然支持条件判断)
  • 用于加载/卸载额外配置项的良好接口(例如用于 SQL 虚拟主机)
  • 更好的异步配置处理接口(同样用于 SQL 虚拟主机)

选项

struct option

我们有几种不同的选项结构
  • 布尔型 (gboolean)
  • 整数型 (gint)
  • 字符串 (GString*)
  • 数组 (GArray*) - 子选项的有序列表
  • 哈希表 (GHashTable*) - 字符串到子选项的映射

对于重写等一些功能,我们目前使用关联数组,现在可以使用 (键, 值) 对的数组,也许可以为此使用特殊语法(如 "abc": "xyz" 用于有序键值对,而非 "abc" => "xyz" 用于哈希表)。

内部选项

每个模块都可以定义一个选项列表(通过名称标识,例如“debug.log-something”)。对于每个选项,连接表中有对应的 `gpointer` 条目,模块可以通过索引找到所需的值。

选项的定义包括
  • 名称
  • 类型(与选项相同的值 + 也许是“custom”的值)
  • 两个函数:`parse_option` 和 `free_option`(见下文)
索引的两个想法
  • 模块手动注册每个选项,并将返回的索引保存在其插件结构中。
  • 模块定义一个选项列表,并使用模块基本索引(来自插件结构)+ 该列表的本地索引。

由于模块拥有除“选项结构”之外的内容可能非常有用,例如保存文件描述符(access.log),因此我们为每个可能的选项注册一个选项特定的解析器。默认是直接使用选项结构中的值。
此解析器返回一个 `gpointer`,如果选项被设置,它将被放置在连接表中的相应位置。
为了实现选项的卸载,还有一个 `free_option` 函数,它应该释放内存。

动作

在当前的 Lighttpd 版本中,选项用于控制哪个后端处理请求——这通常取决于加载模块的顺序以及一些只有少数人知道(或知道在哪里可以找到)的其他事项。
我们想用“动作”来取代它:我们明确调用一些函数并知道它们会做什么。

有几种不同类型的动作
  • 设置配置选项
  • 执行动作列表
  • 如果条件为真则执行子动作
  • 调用特殊处理程序(由某个模块提供)
  • 调用后端负载均衡器(由某个模块提供)
每个动作返回以下代码之一
  • ERROR - 内部错误,停止连接处理
  • GO_ON - 没有发生特殊情况
  • COMEBACK - 稍后返回,记住当前位置
  • WAIT_FOR_EVENT - 等待虚拟请求唤醒 (`li_vrequest_joblist_append`),记住当前位置

stbuehler近 13 年前 更新 · 7 次修订