goahead-5.2.0(嵌入式Web服务器)静态库移植
一、编译环境配置
嵌入式交叉编译环境的配置主要注意下面几个参数的配置
## The cross complier
CROSS = 工具链(例如arm-himix200-linux-)
# The C program compiler. Uncomment it to specify yours explicitly.
CC = $(CROSS)gcc
STRIP=$(CROSS)strip
# The C++ program compiler. Uncomment it to specify yours explicitly.
CXX = $(CROSS)g++
# The GNU ar program creates, modifies, and extracts from archives.
AR = $(CROSS)ar
project 文件夹有很多.mk demo文件,如goahead-linux-default.mk 可选取相应的文件做模版。
二、编译库
编译命令: make -f ./project/你的定制mk
如: make -f ./project/goahead-linux-arm_static.mk
将编译生成的.a 文件,头文件,以及直接拷到移植目标使用。
三、rount.txt文件的配置
1、auth
auth=xxx 该语句指定了该请求需要用那种方式验证身份。
auth=form 表单式身份验证,参考设置:
# route uri=/pub/
# route uri=/action/login methods=POST handler=action redirect=200@/ redirect=401@/pub/login.html
# route uri=/action/logout methods=POST handler=action redirect=200@/pub/login.html
# route uri=/ auth=form handler=continue redirect=401@/pub/login.html
第一行是指定未进行登陆验证之前可访问的目录,登陆界面相关的css和js文件都需要在该目录下。
第二行指明登录操作的重定向,验证成功返回状态为200时将界面重定向到index.asp,验证失败时,继续在login.asp界面。
第三行是退出登录的重定向。
第四行定义与所有其他 URI 匹配的route,并规定基于表单的身份验证。continue 处理程序对用户进行身份验证,如果用户成功通过身份验证,则继续处理,让其他处理程序为请求提供服务并生成响应。如果身份验证失败,用户将被重定向回登录页面。
auth=basic 基本身份验证,参考设置:
# route uri=/auth/basic/ auth=basic abilities=manage
auth=digest 摘要式身份验证。该方法是在基本身份验证的基础上,对密码进行MD5加密;
route uri=/auth/digest/ auth=digest abilities=manage
注意:abilities 的配置一定要和auth.txt 设置密码时选择的角色的abilities 移植,否则会有权限不够的错误问题。
2、handlers
常见配置如下,通过上述语句指定每种请求对应的handle。
route uri=/action handler=action
route uri=/ methods=OPTIONS|TRACE handler=options
route uri=/ extensions=asp,css,js handler=jst
3、methods
标准的http方法有 : DELETE, GET, OPTIONS, POST, PUT,HEAD and TRACE,常用的就是GET与POST。
4、uri
URI、URL、URN概念:
URI = Uniform Resource Identifier 统一资源标志符
URL = Uniform Resource Locator 统一资源定位符
URN = Uniform Resource Name 统一资源名称
简单来说,就是URI是抽象的定义,不管用什么方法表示,只要能定位一个资源,就叫URI。可以使用两种方法定位:1,URL,用地址定位;2,URN 用名称定位。所以URL是URI的子集。
5、extensions
route uri=/ extensions=jst,asp handler=jst
注意:
在route.txt文件里的route uri=/cgi-bin dir=根路径 handler=cgi 设置根路径,最终的路径为:根路径/cgi-bin,如设置根路径为/mnt/nfs/goheah12/,则cgi文件存放的路径为/mnt/nfs/goheah12/cgi-bin。
四、auth.txt文件的配置**
auth.txt的文件格式:
# Schema
role name=manage abilities=manage
user name=admin password=344c4110ad757e29261719ec1fb48b4b roles=manage
1、配置文件需要以空行结尾
通过代码websLoad(“auth.txt”) 加载的配置文件,最后一行一定要是一个空行,不然就会有问题。
2、密码的加密方式为 username:ME_GOAHEAD_REALM:password 这个字符串的MD5码。其中 ME_GOAHEAD_REALM 的定义如下:
#ifndef ME_GOAHEAD_REALM
#define ME_GOAHEAD_REALM "example.com"
#endif
4、密码的生成
借助一个工具gopass(编译库的时候已经同步生成),用于生成登录密码的密文,命令格式:
gopass [--cipher blowfish|md5] [--file filename] [--password password] realm username roles...
示例: ./gopass --cipher md5 --password 123456 example.com admin manage
–cipher md5:加密采用md5
–password 123456:auth.txt中password字段的明码
example.com:加密中的salt,定义在me.h中,即上面讲到第二点提到的内容
admin :auth.txt的name字段
manage:roles字段
五、可能出现的其他问题
问题1:
goahead: 0: Cannot get host address for host (none): errno 2
goahead: 0: Cannot initialize server. Exiting.
原因分析:
没有设置好IP,需要goahead设置IP
解决措施:
在http.c的setLocalHost函数里,将这块代码
struct hostent *hp;
if ((hp = gethostbyname(host)) == NULL) {
error("Cannot get host address for host %s: errno %d", host, errno);
return -1;
}
memcpy((char*) &intaddr, (char *) hp->h_addr_list[0], (size_t) hp->h_length);
ipaddr = inet_ntoa(intaddr);
屏蔽掉,并添加 ipaddr=“0.0.0.0”;
注:0.0.0.0 代表本机的所有ip地址
2、查不到网页
#ifndef ME_GOAHEAD_DOCUMENTS
#define ME_GOAHEAD_DOCUMENTS "web"
#endif
这个宏定义了网页所在的目录,检查测试文件夹和设置的是否一致
3、问题三:
goahead: 0: Unable to read key self.key
goahead: 0: Cannot initialize server. Exiting.
解决办法:
在goahead库编译生成文件目录中找到self.key和self.crt文件拷贝到执行文件目录下