想构建嵌入式Linux下的Web服务器,但是手上还没板子,先在Linux上构建进行练习。


环境:Fedora14




一 编译生成二进制文件boa


1 Boa介绍:


是一种非常小巧的Web服务器,其 可执行代码 只有大约60KB左右。作为一种单任务Web服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理 并发连接 请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度和安全。




2 下载源码:


我下载的版本是0.94.14rc21版本:boa-0.94rc21.tar.bz2,解压到~/opt:


$tar xjvf boa-0.94rc21.tar.bz2 -C ~/opt



3 配置Makefile:


需要进入解压后目录下的src目录下进行配置:


$./configure


所以直接在根目录(boa-0.94rc21)下进行配置:


$./configure


得到结果:


[xu@XU boa-0.94.14rc21]$ ls
 

  aclocal.m4    config.status  contrib  examples         
 Makefile 

 

  CHANGES       config.sub     COPYING  extra_macros.m4  Makefile.in 

 

  config.guess  configure      CREDITS  extras           README 

 

  config.log    configure.in   docs     install-sh       src


已经有Makefile文件了,而且,在boa-0.94.14rc21/src/目录下也产生了Makefile文件:


[xu@XU src]$ ls 
 
 
 

   access.c  cgi.c         defines.h  index_dir.c   pipe.c     response.c 
 
 
 

   access.h  cgi_header.c  escape.c   ip.c          poll.c     select.c 
 
 
 

   alias.c   compat.h      escape.h   log.c         queue.c    signals.c 
 
 
 

   boa.c     config.c      get.c       
  Makefile      range.c    sublog.c 
 
 
 

   boa.h     config.h      globals.h  Makefile.in   read.c     timestamp.c 
 
 
 

   buffer.c  config.h.in   hash.c     mmap_cache.c  request.c  util.c

4 得到目标文件boa


如果要在ARM平台构建,需要进入src目录下,修改Makefile:修改编译器的选择,使适合ARM:



CC = gcc



CPP = gcc -E



改为:



CC = arm-linux-gcc



CPP = arm-linux-g++ -E



(注:这里在Fedora上就不用修改。)



修改完后在src目录下直接: make


生成了boa文件:


[xu@XU src]$ ll boa



-rwxrwxr-x 1 xu xu 233461 Mar 15 21:03 boa


为boa文件瘦身:


[xu@XU src]$ arm-linux-strip boa



[xu@XU src]$ ll boa



-rwxrwxr-x 1 xu xu 72896 Mar 15 21:06 boa


果然,文件变成原来的3分之一了,这里,介绍一下这个:arm-linux-strip的作用:


arm-linux-strip:


UNIX下文件压缩命令compress大家都比较熟悉了,它的压缩率比较高, 和tar命令结合使用来做数据备份是最合适不过了。但compress压缩也有缺点,就是被压缩后的文件需要用命令uncompress解压后才能正常使用。而用strip命令就没有这个问题,它能清除执行文件中不必要的标示符及调试信息,可减小文件大小而不影响正常使用。但与compress 不同的是,文件一旦strip后就不能恢复原样了,所以strip是一个减肥工具而不是压缩工具。而且,被strip后的文件不包含调试信息,就不能用dbx来调试程序了。



可见,这个arm-linux-strip也是对文件清除不必要的标示符、调试信息等,减小文件大小。



至此,我们得到了想要的 boa文件。



二 移植cgic


1 下载源码


http://www.boutell.com/cgic/cgic205.tar.gz


然后解压:


$tar xzvf cgic205.tar.gz -C ~/opt


解压了部分,然后出现错误:


gzip: stdin: unexpected end of file



cgic205/cgic.c



tar: Unexpected EOF in archive



tar: Unexpected EOF in archive



tar: Error is not recoverable: exiting now


上网查找原因,别人提示是因为文件不完整,可能是下载或者传输过程出了问题,从新下载就OK了。果然,重新下载源码,继续解压,没有问题。




2 修改Makefile


修改交叉编译项,应用在ARM平台。对解压目录下 Makefile进行修改:


CC=gcc



AR=ar



改为:



CC = arm-linux-gcc



AR = arm-linux-ar



以及:


 23 cgictest.cgi: cgictest.o libcgic.a



        $(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS}  #修改后


 26 capture: capture.o libcgic.a



        $(CC) $(CFLAGS) capture.o -o capture ${LIBS}    #修改后


(注:在Fedora上这里不用修改。)




3 得到可执行文件


然后Make,


得到可执行文件 capture,和次使用的 cgictest.cgi


[xu@XU cgic205]$ ls



capture    cgic.c     cgic.o        cgictest.o   Makefile



capture.c  cgic.h     cgictest.c    libcgic.a    readme.txt



capture.o  cgic.html   cgictest.cgi  license.txt  support.txt


可以继续优化:


$arm-linux-strip capture



三 配置WEB服务器


1 配置boa


修改boa.conf文件,但是在主目录下没有找到这个文件,在src/目录下也没有,看来这个版本不一样,还是有很多区别的啊,不能按照别人的步骤来实现,只能作为参考,细节还要自己搞定。


这个配置文件可以自己写,但是有模板来修改就更快了。在文件目录下有个文件: example,里面应该是例子,进去就发现有要找的文件: boa.conf,可以复制后在里面修改。


[xu@XU examples]$ cp boa.conf ../


在主目录下就有了这个文件:


[xu@XU boa-0.94.14rc21]$ ls



aclocal.m4    config.log     configure.in  docs             install-sh   src



boa.conf      config.status  contrib       examples         Makefile



CHANGES       config.sub     COPYING       extra_macros.m4  Makefile.in



config.guess  configure      CREDITS       extras           README



我的修改内容为:


Port 80



Listen 192.168.1.111 



User 0
Group 0



ErrorLog /var/log/boa/error_log



AccessLog /var/log/boa/access_log



ServerName www.your.org.here



DocumentRoot /var/www



UserDir public_html



DirectoryIndex index.html



DirectoryMaker /usr/lib/boa/boa_indexer



KeepAliveMax 1000



KeepAliveTimeout 10



MimeTypes /etc/mime.types



DefaultType text/plain



CGIPath /bin:/usr/bin:/usr/local/bin



Alias /doc /usr/doc



ScriptAlias /cgi-bin/ /var/www/cgi-bin/




2 测试


在root下建立目录:


#mkdir /etc/boa


复制文件boa.conf到上述目录下,


修改boa.conf:


建立文件目录:依据上面的修改:


#mkdir /var/boa


#mkdir /var/www


#mkdir /var/www/cgi-bin


#mkdir -p /var/lob/boa



把之前编译cgi205得到的文件:


capture和cgictest.cgi拷贝到/var/www/cgi-lin/下面,


运行boa:


./boa


在浏览器输入:


http://192.168.1.111/cgi-bin/cgictest.cgi


能够进入例子。



设计hello代码:


# include < stdio . h >
# include < stdlib . h >
int  main ( void )
{
         printf ( "Content-type: text/html\n\n" ) ;  //注意\n\n
         printf ( "<html>/n" ) ;
         printf ( "<head><title>CGI Output</title></head>/n" ) ;
         printf ( "<body>/n" ) ;
         printf ( "<h1>Hello,world.</h1>/n" ) ;
         printf ( "<body>/n" ) ;
         printf ( "</html>/n" ) ;
         exit ( 0 ) ;
}


编译:


gcc -o hello.cgi hello.c


将得到的hello.cgi拷贝到/var/www/cgi-lin/