嵌⼊式linux项⽬,嵌⼊式linux项⽬开发(⼀)
项⽬⽬标:使⽤BOA、CGIC、SQLite搭建嵌⼊式web服务器
⼀、嵌⼊式web服务器BOA简介
在嵌⼊式设备的管理与交互中,基于Web⽅式的应⽤成为⽬前的主流,即在嵌⼊式设备上运⾏⼀个⽀持脚本或CGI功能的Web服务器,能够⽣成动态页⾯,在⽤户端只需要通过Web浏览器就可以对嵌⼊式设备进⾏管理和监控,使⽤极为⽅便。
⽬前嵌⼊式设备中所使⽤的web服务器主要有:boa、thttpd、mini_httpd、shttpd、lighttpd、goaheand、appweb和apache等。
BOA是Paul Philips在1991年开发的开源的嵌⼊式web服务器,BOA功能强⼤,⽀持认证,CGI等,应⽤⼴泛,特别适合于嵌⼊式设备。与传统的web服务器为每个访问连接开启⼀个进程不同,BOA是⼀个单任务的web服务器,不会为多个连接开启多个任务进程。BOA对所有的活动的http连接在内部进⾏处理,⽽且只为每个CGI连接(独⽴的进程)开启新的进程。因此,BOA在同等硬件条件下显⽰出更快的速度。测试表明boa在Pentium 300MHZ下能够每秒钟处理⼏千次点击,在20 MHz 386/SX下能够每秒钟处理⼏⼗次点击访问。
BOA与apache等⾼性能web服务器主要区别是,BOA是单进程的服务器,只有在完成⼀个⽤户请求后才能响应另⼀个⽤户的请求,⽆法并发响应,在嵌⼊式设备的应⽤场合⾥已经⾜够。
BOA是⼀个⾮常⼩巧的Web服务器,可执⾏代码只有约60KB,是⼀个单任务Web服务器,只能依次完成⽤户的请求,⽽不会fork出新的进程来处理并发连接请求;但BOA⽀持CGI,能够为CGI程序fork出⼀个进程来执⾏。
BOA的设计⽬标是速度和安全,是指不被恶意⽤户暗中破坏,⽽不是指它有很好的访问控制和通信加密。可以添加SSL来保证数据传输中的保密和安全。在其站点公布的性能测试中,BOA的性能要好于Apache服务器。
⼆、嵌⼊式BOA服务器编译
1、下载BOA源码
从下载boa-0.94.源码
2、⽣成配置⽂件
在BOA顶层⽬录src下运⾏./configure
3、修改Makefile⽂件
修改Makefile⽂件中的交叉编译⼯具选项
CC = arm-linux-gcc
CPP = arm-linux-gcc–E
LDFLAGS = -static
4、修改boa.c⽂件
将boa.c⽂件中的⼀下内容注释
if ( setuid ( 0 ) != - 1 ) {
DIE ( "icky Linux kernel bug!" );
}
5、修改compat.h⽂件
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
6、修改config.c⽂件
将if(!server_name){..........}内容注释,位于266-286⾏
不注释会报错:gethostbyname:: Resource temporarily unavailable
7、修改log.c⽂件
注释掉以下内容
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
不注释会报错:unable to dup2 the error log:bad file descriptor
8、编译
嵌入式linux开发书籍make
9、去除调试信息
arm-linux-strip boa
10、修改执⾏权限
chmod 777 boa
三、BOA服务器配置
1、f⽂件解析
#监听的端⼝
Port 80
#服务器绑定的IP地址,注释掉表⽰绑定到INADDR_ANY,适配服务器所有的IP #Listen 192.68.0.5
#服务器运⾏的⽤户和组
#User o
User 0
#Group o
Group 0
#当服务器发⽣问题时发送报警的email地址
#ServerAdmin root@localhost
#错误⽇志⽂件
ErrorLog /var/log/boa/error_log
#访问⽇志⽂件
AccessLog /var/log/boa/access_log
#是否使⽤本地时间。如果没注释掉,则使⽤本地时间。注释掉则使⽤UTC时间#UseLocaltime
#是否记录CGI运⾏信息
#VerboseCGILogs
#服务器名字
#是否启动虚拟主机功能,即设备可以有多个⽹络接⼝,每个接⼝都可以拥有⼀个虚拟的Web服务器
#VirtualHost
#⾮常重要,HTML⽂档的主⽬录
DocumentRoot /var/www
#如果收到⼀个⽤户请求的话,在⽤户主⽬录后再增加的⽬录名
UserDir public_html
#HTML⽬录索引的⽂件名
DirectoryIndex index.html
#⼀个连接所允许的HTTP持续作⽤请求最⼤数⽬
KeepAliveMax 1000
#HTTP持续作⽤中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接
KeepAliveTimeout 10
#指明pes⽂件位置
MimeTypes /pes
#⽂件扩展名没有或未知的话,使⽤的缺省MIME类型
DefaultType text/plain
#提供CGI程序的PATH环境变量值
CGIPath /bin:/usr/bin:/usr/local/bin
#为路径加上别名
Alias /doc /usr/doc
#指明CGI脚本的虚拟路径对应的实际路径
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
2、其他⽂件移植
从linux的etc⽬录拷贝pes、passwd、group⽂件到开发板系统的etc⽬录
创建web服务器HTML⽂档的主⽬录/var/www
创建CGI脚本所在⽬录/var/www/cgi-bin/
四、BOA移植过程中错误的解决⽅案
1、gethostbyname:: No such file or directory
解决办法: 修改f  去掉ur.org.here 前的注释符号(#)
2、util.c:100:1: error: pasting "t" and "->"does not give a valid preprocessing token make: *** [util.o]解决办法:
修改src/compat.h
#defineTIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#defineTIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
3、boa.c:211 - getpwuid: No such file or directory
解决办法: 修改src/boa.c
注释掉下⾯这段程序:
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) { DIE(”initgroups”);
}
即修改为:
#if 0
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if(initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) { DIE(”initgroups”);
}
#endif
4、boa.c:228 - icky Linux kernel bug!: No such file or directory 解决办法:
修改src/boa.c,注释掉下⾯语句:
if(setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
即修改为:
#if 0
if(setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
#endif
5、log.c:73 unable to dup2 the error log:bad file descriptor
解决⽅法:
修改src/log.c
注释掉
if(dup2(error_log, STDERR_FILENO) == -1) { DIE("unableto dup2 the error log");
}
即修改为:
#if 0
if (dup2(error_log, STDERR_FILENO) == -1) { DIE("unable to dup2 the error log");
}
#endif
6、执⾏boa程序报错not found
解决⽅法:
修改Makefile
LDFLAGS = -static

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。