安装

参考如下博文安装thttpd软件

http://blog.csdn.net/21aspnet/article/details/7045845

http://blog.csdn.net/dragoncheng/article/details/5614559

thttpd配置文件:

cgilua采用luarocks安装。 其依赖 wsapi运行。

cgilua.cgi launcher:

流程分析

thttpd配置遇到 cgipat规则的请求, 则启动cgi程序

cgipat规则为

cgipat=/cgi-bin/*

即, URL中含有  /cgi-bin/开头的文件名请求。

对应thttpd中的启动cgi子程序代码:

启动cgi程序逻辑

cgi函数中,其实是fork了一个子进程

cgi_child为子进程继续执行逻辑

1、 准备环境变量:

环境变量中, 包括若干 cgi参数:

2、 将连接fd设置为cgi程序的标准输入:

3、 将连接fd设置为cgi程序的标准输出 和 错误:

4、 启动cgi的业务进程, 替代当前的 fork映像

注意 环境变量已经被注入到 启动进程中, 即在业务进程中, 可以访问到 cgi参数。

包括当前脚本名称: SCRIPT_NAME

execv功能

http://www.tutorialspoint.com/unix_system_calls/execve.htm

如果待执行文件为脚本, 则启动脚本脚本的解释器程序, 并执行脚本。

脚本内容

Z:\cgilua-master\cgilua-master\examples\index.lp 样例中的此脚本

意思为 启动程序 env,  执行cgilua.cgi程序, 来处理脚本文件

env命令程序的作用, 可以看出此处专门是用来 启动命令的(cgilua.cgi), 并没有设置环境变量

cgilua.cgi

cgilua.cgi 主要业务文件为 /usr/local/lib/luarocks/rocks/cgilua/5.1.4-2/bin/cgilua.cgi

依赖wsapi.cgi 和  wsapi.common 和 wsapi.cgi模块

1、 wsapi.cgi模块为 脚本入口, 其提供了 获取环境变量的通道, 设置到 wsapi_env表中:

并将前文中说的, cgi程序将  连接fd, 接管后, 作为标准输入 和 输出 以及错误的代表。

2、 wsapi.sapi 脚本实现, 启动cgilua执行的逻辑:

至此, thttpd到cgilua的调用流程已经明确。

诚然, cgi运行模式, 为启动子进程处理请求, 对于每一个请求, 都会启动单独的cgi执行,执行完毕退出。

这样会有效率问题, 对于静态资源, 例如纯html和css图片等, 都不应该走cgi程序。

解决此问题的方法:

1、 将cgi脚本的处理 固定在 thttpd进程中处理。(是不是openresty是这种模式?)

2、 使用fastcgi代替。(下阶段研究)

04-14 18:12