1: 下载thttpd: http://acme.com/software/thttpd/
2: 参考前面文章安装kepler/xavante (实际上要不了那么多lua module,但这种方式安装最简单),或者只安装如下module:
wsapi cgilua md5 luasocket (luaexpat)
3: 创建www组
groupadd www
usermod -G alex www
4: 进入thttpd目录
./configure
make
make install
5: 创建www目录
mkdir /www
cd /www
cp -rf /usr/local/www/cgi-bin .
cp /usr/local/bin/cgilua.cgi ./cgi-bin/cgi
6: 配置文件
vi thttpd.conf
port=80
user=nobody
dir=/www
nochroot
cgipat=/cgi-bin/*
logfile=/www/thttpd.log
7:将网页相关文件放入到/www目录, 目录结构如下:
/usr/local/sbin/
thttpd/www/
thttpd.conf
test.lp
cgi-bin/
cgi
当然,你可将配置文件放到其他目录
8: 运行
/usr/local/sbin/thttpd -C /www/thttpd.conf
9:在浏览器中按如下方式输入
http://192.168.100.119/cgi-bin/cgi/test.lp
1: 不需要用到权限验证
config.h 屏蔽
/*#define AUTH_FILE ".htpasswd"*/
libhttpd.c
#ifdef AUTH_FILE
extern char* crypt( const char* key, const char* setting );
#endifMakefile
LIBS =
2: 传递AUTHORIZE信息给cgi服务
libhttpd.c cgi_child函数:
if ( hc->authorization[0] != '/0' )
{
envp[envn++] = build_env( "AUTH_TYPE=%s", "Basic" );
envp[envn++] = build_env( "AUTHORIZATION=%s",hc->authorization);
}
3: 调用cgi时,限制只有lp的文件才需要交给cgi,其它文件仍然由thttpd处理(此处默认cgi为cgilua.cgi, cgilua文件后缀为lp)
由于cgi调用非常耗cpu和内存,如果一个lp文件中包含图片,js等时,会造成cpu和内存的浪费,故在此处直接屏蔽掉。
在此基础之上,再限制cgi的连接数,见下面说明。
libhttpd.c really_start_request函数判断是否调用cgi时修改如下:
/* Is it world-executable and in the CGI area? */
if ( hc->hs->cgi_pattern != (char*) 0 &&
( hc->sb.st_mode & S_IXOTH ) &&
match( hc->hs->cgi_pattern, hc->expnfilename ) )
{
if((hc->encodedurl == (char*)0 )
|| (strstr(hc->encodedurl, ".lp") != (char*)0)
|| (strcmp(hc->expnfilename, "/cgi-bin/cgi") == -1))
return cgi( hc );
else
{
char szbuf[256];
//source url="/cgi-bin/cgi/img/spacer.gif"
//strlen("/cgi-bin/cgi") = 12
//expnfilename="img/spacer.gif"
//encodedurl="/img/spacer.gif"
(void)strcpy(szbuf, hc->encodedurl + 12);
httpd_realloc_str(&hc->expnfilename, &hc->maxexpnfilename, strlen(szbuf));
(void)strcpy(hc->expnfilename, szbuf+1);
httpd_realloc_str(&hc->encodedurl, &hc->maxencodings, strlen(szbuf));
(void)strcpy(hc->encodedurl, szbuf);
stat( hc->expnfilename, &hc->sb );
hc->pathinfo[0]='/0';
if(hc && hc->hs && hc->hs->logfp && hc->expnfilename)
{
(void) fprintf( hc->hs->logfp,"new file: %s method: %s url:%s/n", hc->expnfilename, httpd_method_str( hc->method ), hc->encodedurl );
}
}
}
4: 编译
(本来试图用configure搞定的,但其对host支持好像不是很好,修改如下)
./configure --prefix=/home/alex/thttpd/build
vi Makefile
CC=arm-linux-uclibc-gcc
make
make install
当然,如果要用到thttpd提供的几个小工具,也需要按照上面方法修改
1:最好关闭防火墙和selinux
service iptables stop
setenforce 0
2:出现500错误, 最快最方便解决办法:
chmod -R 777 /www
3: 需要加入权限验证
cd /www/cgi-bin
/usr/local/sbin/htpasswd c .htpasswd admin此时会提示你输入用户名和密码
4: 注意控制文件的权限
对于目录建议使用777
对于文件,建议使用666
对于cgi-bin下,建议使用777、
5:限制cgi的连接数, 在thttpd.conf加入
cgilimit=4
6:针对每次cgi访问,thttpd都会启动一个新进程去执行,所以如果网页中文件太多或者连续点击次数太多,内存和CPU会占用较多。
如果针对嵌入式开发,建议多用html,少用cgi,同时cgi文件中,如果有图片或者js,也会产生一次cgi调用的,还有如果url中是安装如下格式输入 http://192.168.1.1/cgi-bin/cgi/filename
即使filename是html文件,也会产生cig调用。如果不想被调用cgi,请见上面修改
同时,最好限制cgi的连接数