注册

EasyARM-imx28开发板嵌入web服务器
首页 > 嵌入式开发 > Linux嵌入式    作者:RainFly   2016年3月5日 10:36 星期六   热度:7971°   字号:   评论:1    
时间:2016-3-5 10:36   热度:7971°  评论:1 条 

    boa_banner.png 

      随着互联网应用的普及,越来越多的信息化产品需要接入互联网通过Web页面进行远程访问。嵌入式Web系统提供了一种经济、实用的互联网嵌入式接入方案。这里结合一种嵌入式Web Server BOA来介绍嵌入式Linux系统下的CGI程序设计技术。

关于实现项目所出现的相关问题解决办法

 一、编译配置boa服务器
1 、[root@localhost /]#mkdir web                           //在根目录下创建web目录
2 、[root@localhost /]# cd /web/
3 、[root@localhost web]# rz
4 、[root@localhost web]# tar –zxvf boa-0.94.13.tar.gz      //将源码解压到/web目录下
5 、[root@localhost web]# cd boa-0.94.13/
6 、[root@localhost boa-0.94.13]# cd src/   
7 、[root@localhost src]# ls
8 、[root@localhost src]# ./configure                         //运行./configure使之生成Makefile文件
9 、[root@localhost src]# vi Makefile
修改内容如下:
把CC=gcc 和CPP=gcc -E改写成CC=arm-none-linux-gnueabi-gcc    CPP=arm-none-linux-gnueabi-g++ -E
10 、[root@localhost src]# vi compat.h
在一般模式下输入:set nu显示行编号,再用120进到120行,修改内容如下:

120 #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff

  改为define TIMEZONE_OFFSET(foo) foo->tm_gmtoff
把120行foo后两个#号去掉


11 、[root@localhost src]# make                       //编译

12 、[root@localhost src]# arm-linux-strip boa        //优化boa可执行文件(此步非必须)

13 、[root@localhost web]# cd boa-0.94.13/     

14 、[root@localhost boa-0.94.13]# vi boa.conf         //修改boa的配置文件

在一般模式下输入:set nu显示行编号,再用111进到111行,  修改内容如下:
 把111 DocumentRoot /var/www
改为111 DocumentRoot /var/www
//指明html文件所放的路径
把193 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
改为193 ScriptAlias /cgi-bin/ /var/www/cgi-bin/
//指明cgi脚本的虚拟路径所对应的实际路径

15、将/src目录下新生成的boa文件下载到目标板的/bin目录下,将boa.conf文件下载到目标板的/etc/boa/目录下。

16、进入开发板的/bin目录,运行boa。

二、可能遇到的问题

1、Could not chdir to "/etc/boa": aborting

      必须创建/etc/boa目录

2、Could not open mime.types file, "/etc/mime.types", for reading

     /etc/目录下缺少mime.types文件,从它处拷贝。

3、gethostbyname:: Connection timed out

     把“#ServersName www.your.org.here”的“#”去掉。

 

三、修改boa.conf文件
# 监听的端口号,缺省都是80 ,一般无需修改
Port 80
# bind 调用的IP 地址,一般注释掉,表明绑定到INADDR_ANY ,通配于服务器的所有IP 地址
#Listen 192.68.0.5
User 0
Group 0
# 当服务器发生问题时发送报警的email 地址,目前未用,注释掉
#ServerAdmin root@localhost 
# 错误日志文件。如果没有以/ 开始,则表示从服务器的根路径开始。如果不需要错误日志,则用#/dev/null 。在下面设置时,注意一定要建立/var/log/boa 目录
ErrorLog /mnt/log/boa/error_log
# 访问日志文件。如果没有以/ 开始,则表示从服务器的根路径开始。如果不需要错误日志,则用#/dev/null 或直接注释掉。在下面设置时,注意一定要建立/var/log/boa 目录
#AccessLog /var/log/boa/access_log
# 是否使用本地时间。如果没有注释掉,则使用本地时间。注释掉则使用UTC 时间
#UseLocaltime
# 是否记录CGI 运行信息,如果没有注释掉,则记录,注释掉则不记录
#VerboseCGILogs
# 服务器名字
ServerName www.hyesco.com 
# 是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的Web 服
# 务器。一般注释掉,即不需要启动
#VirtualHost
# 非常重要,HTML 文档的主目录。如果没有以/ 开始,则表示从服务器的根路径开始。
DocumentRoot /var/www
# 如果收到一个用户请求的话,在用户主目录后再增加的目录名
UserDir public_html
#HTML 目录索引的文件名,也是没有用户只指明访问目录时返回的文件名
DirectoryIndex index.html
# 当HTML 目录没有索引文件时,用户只指明访问目录时,boa 会调用该程序生成索引文件然后
# 返回给用户,因为该过程比较慢最好不执行,可以注释掉或者给每个HTML 目录加上#DirectoryIndex 指明的文件
#DirectoryMaker /usr/lib/boa/boa_indexer
# 如果DirectoryIndex 不存在,并且DirectoryMaker 被注释,那么就用Boa 自带的索引
# 生成程序来生成目录的索引文件并输出到下面目录,该目录必须是Boa 能读写
# DirectoryCache /var/spool/boa/dircache
# 一个连接所允许的HTTP 持续作用请求最大数目,注释或设为0 都将关闭HTTP 持续作用
KeepAliveMax 1000
#HTTP 持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接
KeepAliveTimeout 10
# 指明mime.types 文件位置。如果没有以/ 开始,则表示从服务器的根路径开始。可以注释掉
# 避免使用mime.types 文件,此时需要用AddType 在本文件里指明
MimeTypes /etc/mime.types
# 文件扩展名没有或未知的话,使用的缺省MIME 类型
DefaultType text/plain
# 提供CGI 程序的PATH 环境变量值
CGIPath /bin:/usr/bin:/usr/local/bin
# 将文件扩展名和MIME 类型关联起来,和mime.types 文件作用一样。如果用mime.types
# 文件,则注释掉,如果不使用mime.types 文件,则必须使用
#AddType application/x-httpd-cgi cgi
# 指明文档重定向路径
#Redirect /bar http://elsewhere/feh/bar 
# 为路径加上别名
Alias /doc /usr/doc
# 非常重要,指明CGI 脚本的虚拟路径对应的实际路径。一般所有的CGI 脚本都要放在实际路径
# 里,用户访问执行时输入站点+ 虚拟路径+CGI 脚本名
ScriptAlias /cgi-bin/ /var/www/cgi-bin/

 

  用户可以根据自己需要,对boa.conf 进行修改,但必须要保证其他的辅助文件和设置必须和boa.conf 里的配置相符,不然Boa 就不能正常工作。 在上面的例子中,我们还需要创建日志文件所在目录/var/log/boa ,创建HTML 文档的主目录/var/www ,将mime.types 文件拷贝 到/etc 目录,创建CGI 脚本所在目录/var/www/cgi-bin/ .

www 目录放index.html 文件。mime.types 文件用来指明不同文件扩展名对应的MIME 类型,一般 可以直接从Linux 主机上拷贝一个,大部分也都是在主机的/etc 目录下。访问方式:http://192.168.3.223/index.html

BOA源文件编译出错解决方案

        捕获.PNG

编译boa时提示:      

make: yacc:命令未找到
make: *** [y.tab.c] 错误 127
make: lex:命令未找到
make: *** [lex.yy.c] 错误 127

解决方法:

安装需要工具
        apt-get install bison

        apt-get install flex


编译会出错:
util.c: 100: 1: pasting “t” and “->” does not give a valid preprocessing token make: [util.o] Error1
解决方法,修改compat.h中的
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
为:
#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff


捕获.PNG

1.必须要在板子的/etc下建一个boa目录(错误代码忘了)

2.”can't open boa.conf for reading“
解决:不仅要在你自己放置boa的目录下放入boa.conf配置文件,而且要在板子的/etc/boa下也要放入boa.conf文件,这样系统在运行boa的时候才可以读取到boa.conf文件。

3.“unable to dup2 the error log bad file descriptor
解决:在boa源码里,即src文件夹下把log.c中的第73行的if语句注释掉。

其实主要原因在于没有创建/var/log/boa/文件夹下面的 两个记录文件 error_log access_log  创建完成后重新运行boa

4."unable to dup2 the error log:Bad file descriptor"
解决:在boa.conf里,把“#AccessLog /var/log/boa/access_log”注释掉(即去掉#号)。

5.“[01/Jan/2031:00:12:25 +0000] boa.c:226 - icky Linux kernel bug!: No such file or directory”
解决:在boa源码里,即src文件夹下把boa.c中的第226行的if语句注释掉。

 6."gethostbyname:: Resource temporarily unavailable"
解决:把“#ServerName www.your.org.here”的“#”号去掉。

 7."./boa: 1: syntax error: "(" unexpected"
解决:没有修改Makefile,是用gcc编译的,应该改成是arm-linux-gcc编译。

8.如果页面上是:“502 Bad Gateway The CGI was not CGI/1.1 compliant.“
解决:给你要执行的cgi可执行程序赋个权限。chmod 777 filename

9.在<form action="cgi-bin/test2.cgi" method="get">中,cgi可执行程序的路径就直接写“cgi-bin/test2.cgi”就可以了,不要写板子上的绝对路径,这样就重复了,因为cgi执行时会自动去boa.conf的指定的路径里找。

10.出现警告:“control reaches end of non-void function”,是因为某个函数没有return,而函数定义时是非void型的。所以需要有个返回值。比如int cgiMain()这个函数就一定要有个返回值的,否则会报这个错误。

12.运行网页时老出现错误:“mkstemp:No such file or diectory”
解决:不能用post,只能用get。因为post方式需要新建一个临时文件,这就需要用到mkstemp函数。这个函数是在系统中以唯一的文件名创建一个文件并打开,且只有当前用户才能访问这个临时文件。故权限不够,或其他什么问题都会报这个错误。那么就用get吧!这里具体原因细节笔者暂时也不是很清楚...

13.直接写的含有system()函数的c程序用arm-linux-gcc编译到板子上的可以执行,而如果写在cgi中的就不一定能执行了。因为牵涉到一个cgi的权限的问题。即使给你的cgi-bin文件夹下的所有cgi可执行文件都赋了权限,也不一定能执行。

boa程序无法运行
 如果要将运行用户为 root 则还要改, 首先在 boa.conf 中 
48行   User nobody 改为   User root
如果这样重新运行boa 则会邮错,请看 error_log 中的提示

       src/boa.c:226 - icky Linux kernel bug!: Success

在linux中很少以root 用户作为应用程的运行者,一般的应用程序也会禁止认root作为程序的运行者

 所以在boa.c 的225行中有
      if (setuid(0) != -1)    }注释掉下面语句:
if(setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
即修改为:
#if 0
if(setuid(0) != -1) {
   DIE(”icky Linux kernel bug!”);
   }
#endif

上面修改完成 查看/var/log/error/boa/error_log   

捕获.PNG


继而可以打开浏览器查看是否能打开index.htmlQQ截图20160305182310.png

cgi文件也可以正常打开!

QQ截图20160305205653.png

写写改改一天终于完成了在imx283开发版上面移植web服务器了,本想上传一些大的网页素材结果发现 /var 目录分配的时候给的太小了 只有512k,需要重新做个根文件,(笔者想更改掉网站的根目录 DocumentRoot 结果发现CGI程序无法正常运行,改日再继续修改!)

捕获.PNG

通过修改了DocumentRoot /www 和ScriptAlias          /www/cgi-bin/   

将网站文件放到了根目录,boa服务器顺利完成搭建!

参考资料

            基于嵌入式web服务器的远程数据采集系统的应用   韩改宁,梁新月      

资源网盘              

           http://pan.baidu.com/s/1dEh0lLf



  您阅读这篇文章共花了:  
捐赠支持:如果觉得这篇文章对您有帮助,请 "扫一扫"鼓励作者!
二维码加载中...
本文作者:RainFly      文章标题: EasyARM-imx28开发板嵌入web服务器
本文地址:http://www.rainfly.cn/?post=176
版权声明:若无注明,本文皆为“雨夜轩”原创,转载请保留文章出处。

还有小板凳哦!

中国围棋  Google Chrome 63.0.3239.132 Google Chrome 63.0.3239.132 Windows 7 Windows 7  2019-04-11 09:48 沙发
感谢分享。

QQ游客评论

返回顶部    首页    捐赠支持    手气不错    友情链接    关于我们    站长工具    站长介绍    手机版本    后台登陆   
版权所有:雨夜轩    站长:RainFly    特别鸣谢   文章归档   皖ICP备15003600号-1   百度统计
Copyright©2015 雨夜轩 Powered by emlog强力驱动 七牛CDN全球加速 360站长联盟安全认证 中国博客联盟荣誉成员 可信赖网站 站点地图   
页面加载耗时:0.033秒 数据库查询次数:13次
背景设置