安装
参考如下博文安装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代替。(下阶段研究)