欧耶!在忙碌纠结了几天之后终于把boa webserver搞定,这个小小的东西花费了我不少的时间来实验阿。所以一定要记录下来,同时也给需要的人参考,因为我从网上搜到好多资料都是复制粘贴,我试过后根本没成功,这篇算是给大家一个借鉴了。
1、下载Boa Webserver的源码
http://www.boa.org/boa-0.94.13.tar.gz
2、解压并编译Boa Webserver
$ tar zxvf boa-0.94.13.tar.gz
由于Boa Webserver的Makefile中没有install,我们只是进行编译,然后手动拷贝编译后的二进制文件到相应的文件目录中,因此在使用 configure时无须指定位置。同时在make时,可能会出现不少错误,部分的错误处理方法可以参看<附录>:
$ cd boa-0.94.13/src/
$ ./configure
$ make
3、配置Boa Webserver环境
编译后在boa-0.94.13/src/中有2个二进制文件,那就是我们需要的执行档,只需拷贝到/bin中,注意这里的操作权限:
$ sudo cp boa/boa-0.94.13/src/boa /bin
$ sudo cp boa-0.94.13/src/boa_indexer /bin
$ ls /bin/boa*
/bin/boa /bin/boa_indexer
修改src下的头文件defines.h,找到#define SERVER_ROOT “/etc/boa”修改成 #define SERVER_ROOT “/var/www”,这里定义的是web服务器的文件根目录(用户可以自行定义,只要跟 boa.conf 中设置 一致就可以了)
Boa Webserver的配置文件是boa.conf。该文件需要被放置在/etc/boa目录下。同时我们需要对boa.conf稍做修改,注意一定是在/etc/boa下的boa.conf进行修改:
# sudo mkdir /etc/boa
# cp boa/boa-0.94.13/boa.conf /etc/boa/
# vim /etc/boa/boa.conf
a)修改: Group nogroup修改为Group 0; user nobody修改为user 用户名;
修改Group的参数为0是因为系统中没有nogroup组,如果你没有nobody用户,那么User nobody也要做相应修改(修改成自己的用户名亦可)。其它采用默认设置。如有必要,可以参看<附录>中的参数说明。
b)servername www.your.org.here的注解去掉;
c)修改DocumentRoot后的路径为 /var/www,这个是文档的主目录;
d)修改: ScriptAlias /cgi-bin/ /usr/lib/cgi-bin
为: ScriptAlias /cgi-bin/ /var/www/cgi-bin
e)修改MimeTypes /etc/mime.types为MimeTypes /var/www/mime.types来指明mime.types文件位置。如果没有以/开始,则表示从服务器的根路径开始。可以注释掉,避免使用mime.types文件,此时需要用 AddType在本文件里指明。
建立一些Boa Webserver必要的文件目录:
# mkdir -p /var/www/cgi-bin
# mkdir -p /var/log/boa
目录/var/www/用于保存HTML文档,而/var/www/cgi-bin用于保存CGI脚本。
目录/var/log/boa是相关的日志文件保存目录。
4、测试
可以随意下载页面作为起始,但是一定要保存为:index.html。把网页相关图片自动保存在index_files文件夹中。要将这2个文件拷贝到/var/www目录下。
# ls /var/www
cgi-bin index_files index.html
在测试之前,需要先运行Boa Webserver。注意这里使用的是root权限,如果是普通用户可能会有报错。
#cd boa.0.94.13/src
# ./boa
然后打开浏览器,输入:127.0.0.1
就可以看到自己的主页了。当然127.0.0.1是本机地址。可以使用ifconfig命令查看ip地址。然后输入也可以达到一样的效果。
# ifconfig
首页可以打开,可是在我进行cgi的测试时一直报错。如下:
# cp boa-0.94.13/examples/cgi-test.cgi /var/www/cgi-bin
在浏览器中输入:
http://127.0.0.1/cgi-bin/cgi-test.cgi
始终报错:404 not found the request URL /cgi-bin/cgi-test.cgi was not found on this server.在网上查404错误一直行不通,怀疑是路径设置不正确,在boa.conf中改了很多次,尝试了很多方法都未果,最终在一篇百度博文上看到了这样的修改:
进入 /电脑主机目录/boa-0.94.13/src目录下,把makefile文件中:LDFLAGS = -g修改为:LDFLAGS = -static 就可以了。虽然不太理解什么意思,可是做了这个修改后终于成功了。如果有大牛看到希望能指点一二。
遗留问题:为什么即使测试成功了,在终端上ps还是没有boa的进程显示呢。
附录:
编译时错误处理:
编译需要bison和flex,如果没有这2个将报错,因此:
$ sudo apt-get install flex bison
由于我的ubuntu环境有bison,因此这里没有列出bison的错误。
错误1:
bison -y -d boa_grammar.y
gcc -g -O2 -pipe -Wall -I. -c -o y.tab.o y.tab.c
y.tab.c: In function ‘yyparse’:
y.tab.c:1295: warning: implicit declaration of function ‘yylex’
lex boa_lexer.l
make: lex: Command not found
make: *** [lex.yy.c] Error 127
解决办法:由于没有flex,出现了缺少lex.yy.c文件的报错。只要安装上flex即可。
$ sudo apt-get install flex
错误2:
request.c: In function ‘get_request’:
request.c:84: warning: pointer targets in passing argument 3 of ‘accept’ differ in signedness
gcc -g -O2 -pipe -Wall -I. -c -o response.o response.c
gcc -g -O2 -pipe -Wall -I. -c -o select.o select.c
gcc -g -O2 -pipe -Wall -I. -c -o signals.o signals.c
gcc -g -O2 -pipe -Wall -I. -c -o util.o util.c
util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token
make: *** [util.o] Error 1
解决办法:根据提示修改源码中的src/compat.h文件。
修改:#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
为:#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff
错误3:Could not open boa.conf for reading这个是因为根目录定义好了后,启动boa就要去这个根目录下读取boa.conf mime.types,因此根目录下必须有这两个文件。错误4:boa.c:226 - icky Linux kernel bug!: Success这是从log/boa/error_log中读到的,打没打开boa从这个文件就可看到。注释掉下面语句:if (setuid(0) != -1) { DIE(”icky Linux kernel bug!”); }为#if 0 if (setuid(0) != -1) { DIE(”icky Linux kernel bug!”); }#endif打开正确后,error_log将显示boa: server version Boa/0.94.13[20/Sep/2010:08:26:24 +0000] boa: server built Sep 20 2010 at 16:20:39.[20/Sep/2010:08:26:24 +0000] boa: starting server pid=28683, port 80同时一定要注意权限问题,配置里的用户一定要和实际一致
在那些文件拷贝过程中,要注意拷贝到/bin,/var/www/cgi-bin下后,文件权限需要做修改,用sudo chmod 755 文件名,这时才可用。
Boa Webserver配置参数说明:
Port:boa服务器监听的端口,默认的端口是80。如果端口小于1024,则必须是root用户启动服务器。
Listen:绑定的ip地址。不使用这个参数时,将绑定所有的地址。
User:连接到服务器的客户端的身份,可以是用户名或UID。(为什么非要指定为文件的所有者才能访问网页呢?nobody用户也有读权限啊)
Group:连接到服务器的客户端的组,可以是组名或GID。
ServerAdmin:服务器出故障时要通知的邮箱地址。
ErrorLog:指定错误日志文件。如果路径没有以“/”开始,则相对于ServerRoot路径。没有配置时默认的文件是/dev/stderr。若不想记录日志,指定文件为/dev/null。
AccessLog:设置存取日志文件,与ErrorLog类似。
UseLocaltime:设置使用本地时间,使用UTC时注释这个参数。这个参数没有值。
VerboseCGILogs:在错误日志文件中记录CGI启动和停止时间,若不记录,注释这个参数。这个参数没有值。
ServerName:指定服务器的名称,当客户端使用gethostname + gethostbyname时返回给客户端。
VirtualHost:虚拟主机开关。使用此参数,则会在DocumentRoot设定的目录添加一个ip地址作为新的DocumentRoot来处理客户端的请求。如DocumentRoot设置为/var/www,则http://localhost/ 则转换成/var/www/127.0.0.1/,若注释此参数,则为/var/www/。
DocumentRoot:HTML文件的根目录(也就是网站的目录)。
UserDir:指定用户目录。
DirectoryIndex:指定预生成目录信息的文件,注释此变量将使用DirectoryMaker变量。这个变量也就是设置默认主页的文件名。
DirectoryMaker:指定用于生成目录的程序,注释此变量将不允许列目录。
DirectoryCache:当DirectoryIndex文件不存在,而DirecotryMaker又被注释掉时,将列出这个参数指定目录给客户端。
KeepAliveMax:每个连接允许的请求数量。如果将此值设为" 0 ",将不限制请求的数目。
KeepAliveTimeOut:在关闭持久连接前等待下一个请求的秒数。(秒)。
MimeTypes:设置包含mimetypes信息的文件,一般是/etc/mime.types。
DefaultType:默认的mimetype类型,一般是text/html。
CGIPath:相当于给CGI程序使用的$PATH变量。
SinglePostLimit:一次POST允许最大的字节数,默认是1MB.
AddType: 增加MimeType没有指定的类型,例: AddType type extension [extension ...]。要使用cgi,必须添加cgi类型:AddType application/x-httpd-cgi cgi
Redirect:重定向文件
Aliases:指定路径的别名。
ScriptAlias:指定脚本路径的虚拟路径。
1、下载Boa Webserver的源码
http://www.boa.org/boa-0.94.13.tar.gz
2、解压并编译Boa Webserver
$ tar zxvf boa-0.94.13.tar.gz
由于Boa Webserver的Makefile中没有install,我们只是进行编译,然后手动拷贝编译后的二进制文件到相应的文件目录中,因此在使用 configure时无须指定位置。同时在make时,可能会出现不少错误,部分的错误处理方法可以参看<附录>:
$ cd boa-0.94.13/src/
$ ./configure
$ make
3、配置Boa Webserver环境
编译后在boa-0.94.13/src/中有2个二进制文件,那就是我们需要的执行档,只需拷贝到/bin中,注意这里的操作权限:
$ sudo cp boa/boa-0.94.13/src/boa /bin
$ sudo cp boa-0.94.13/src/boa_indexer /bin
$ ls /bin/boa*
/bin/boa /bin/boa_indexer
修改src下的头文件defines.h,找到#define SERVER_ROOT “/etc/boa”修改成 #define SERVER_ROOT “/var/www”,这里定义的是web服务器的文件根目录(用户可以自行定义,只要跟 boa.conf 中设置 一致就可以了)
Boa Webserver的配置文件是boa.conf。该文件需要被放置在/etc/boa目录下。同时我们需要对boa.conf稍做修改,注意一定是在/etc/boa下的boa.conf进行修改:
# sudo mkdir /etc/boa
# cp boa/boa-0.94.13/boa.conf /etc/boa/
# vim /etc/boa/boa.conf
a)修改: Group nogroup修改为Group 0; user nobody修改为user 用户名;
修改Group的参数为0是因为系统中没有nogroup组,如果你没有nobody用户,那么User nobody也要做相应修改(修改成自己的用户名亦可)。其它采用默认设置。如有必要,可以参看<附录>中的参数说明。
b)servername www.your.org.here的注解去掉;
c)修改DocumentRoot后的路径为 /var/www,这个是文档的主目录;
d)修改: ScriptAlias /cgi-bin/ /usr/lib/cgi-bin
为: ScriptAlias /cgi-bin/ /var/www/cgi-bin
e)修改MimeTypes /etc/mime.types为MimeTypes /var/www/mime.types来指明mime.types文件位置。如果没有以/开始,则表示从服务器的根路径开始。可以注释掉,避免使用mime.types文件,此时需要用 AddType在本文件里指明。
建立一些Boa Webserver必要的文件目录:
# mkdir -p /var/www/cgi-bin
# mkdir -p /var/log/boa
目录/var/www/用于保存HTML文档,而/var/www/cgi-bin用于保存CGI脚本。
目录/var/log/boa是相关的日志文件保存目录。
4、测试
可以随意下载页面作为起始,但是一定要保存为:index.html。把网页相关图片自动保存在index_files文件夹中。要将这2个文件拷贝到/var/www目录下。
# ls /var/www
cgi-bin index_files index.html
在测试之前,需要先运行Boa Webserver。注意这里使用的是root权限,如果是普通用户可能会有报错。
#cd boa.0.94.13/src
# ./boa
然后打开浏览器,输入:127.0.0.1
就可以看到自己的主页了。当然127.0.0.1是本机地址。可以使用ifconfig命令查看ip地址。然后输入也可以达到一样的效果。
# ifconfig
首页可以打开,可是在我进行cgi的测试时一直报错。如下:
# cp boa-0.94.13/examples/cgi-test.cgi /var/www/cgi-bin
在浏览器中输入:
http://127.0.0.1/cgi-bin/cgi-test.cgi
始终报错:404 not found the request URL /cgi-bin/cgi-test.cgi was not found on this server.在网上查404错误一直行不通,怀疑是路径设置不正确,在boa.conf中改了很多次,尝试了很多方法都未果,最终在一篇百度博文上看到了这样的修改:
进入 /电脑主机目录/boa-0.94.13/src目录下,把makefile文件中:LDFLAGS = -g修改为:LDFLAGS = -static 就可以了。虽然不太理解什么意思,可是做了这个修改后终于成功了。如果有大牛看到希望能指点一二。
遗留问题:为什么即使测试成功了,在终端上ps还是没有boa的进程显示呢。
附录:
编译时错误处理:
编译需要bison和flex,如果没有这2个将报错,因此:
$ sudo apt-get install flex bison
由于我的ubuntu环境有bison,因此这里没有列出bison的错误。
错误1:
bison -y -d boa_grammar.y
gcc -g -O2 -pipe -Wall -I. -c -o y.tab.o y.tab.c
y.tab.c: In function ‘yyparse’:
y.tab.c:1295: warning: implicit declaration of function ‘yylex’
lex boa_lexer.l
make: lex: Command not found
make: *** [lex.yy.c] Error 127
解决办法:由于没有flex,出现了缺少lex.yy.c文件的报错。只要安装上flex即可。
$ sudo apt-get install flex
错误2:
request.c: In function ‘get_request’:
request.c:84: warning: pointer targets in passing argument 3 of ‘accept’ differ in signedness
gcc -g -O2 -pipe -Wall -I. -c -o response.o response.c
gcc -g -O2 -pipe -Wall -I. -c -o select.o select.c
gcc -g -O2 -pipe -Wall -I. -c -o signals.o signals.c
gcc -g -O2 -pipe -Wall -I. -c -o util.o util.c
util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token
make: *** [util.o] Error 1
解决办法:根据提示修改源码中的src/compat.h文件。
修改:#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
为:#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff
错误3:Could not open boa.conf for reading这个是因为根目录定义好了后,启动boa就要去这个根目录下读取boa.conf mime.types,因此根目录下必须有这两个文件。错误4:boa.c:226 - icky Linux kernel bug!: Success这是从log/boa/error_log中读到的,打没打开boa从这个文件就可看到。注释掉下面语句:if (setuid(0) != -1) { DIE(”icky Linux kernel bug!”); }为#if 0 if (setuid(0) != -1) { DIE(”icky Linux kernel bug!”); }#endif打开正确后,error_log将显示boa: server version Boa/0.94.13[20/Sep/2010:08:26:24 +0000] boa: server built Sep 20 2010 at 16:20:39.[20/Sep/2010:08:26:24 +0000] boa: starting server pid=28683, port 80同时一定要注意权限问题,配置里的用户一定要和实际一致
在那些文件拷贝过程中,要注意拷贝到/bin,/var/www/cgi-bin下后,文件权限需要做修改,用sudo chmod 755 文件名,这时才可用。
Boa Webserver配置参数说明:
Port:boa服务器监听的端口,默认的端口是80。如果端口小于1024,则必须是root用户启动服务器。
Listen:绑定的ip地址。不使用这个参数时,将绑定所有的地址。
User:连接到服务器的客户端的身份,可以是用户名或UID。(为什么非要指定为文件的所有者才能访问网页呢?nobody用户也有读权限啊)
Group:连接到服务器的客户端的组,可以是组名或GID。
ServerAdmin:服务器出故障时要通知的邮箱地址。
ErrorLog:指定错误日志文件。如果路径没有以“/”开始,则相对于ServerRoot路径。没有配置时默认的文件是/dev/stderr。若不想记录日志,指定文件为/dev/null。
AccessLog:设置存取日志文件,与ErrorLog类似。
UseLocaltime:设置使用本地时间,使用UTC时注释这个参数。这个参数没有值。
VerboseCGILogs:在错误日志文件中记录CGI启动和停止时间,若不记录,注释这个参数。这个参数没有值。
ServerName:指定服务器的名称,当客户端使用gethostname + gethostbyname时返回给客户端。
VirtualHost:虚拟主机开关。使用此参数,则会在DocumentRoot设定的目录添加一个ip地址作为新的DocumentRoot来处理客户端的请求。如DocumentRoot设置为/var/www,则http://localhost/ 则转换成/var/www/127.0.0.1/,若注释此参数,则为/var/www/。
DocumentRoot:HTML文件的根目录(也就是网站的目录)。
UserDir:指定用户目录。
DirectoryIndex:指定预生成目录信息的文件,注释此变量将使用DirectoryMaker变量。这个变量也就是设置默认主页的文件名。
DirectoryMaker:指定用于生成目录的程序,注释此变量将不允许列目录。
DirectoryCache:当DirectoryIndex文件不存在,而DirecotryMaker又被注释掉时,将列出这个参数指定目录给客户端。
KeepAliveMax:每个连接允许的请求数量。如果将此值设为" 0 ",将不限制请求的数目。
KeepAliveTimeOut:在关闭持久连接前等待下一个请求的秒数。(秒)。
MimeTypes:设置包含mimetypes信息的文件,一般是/etc/mime.types。
DefaultType:默认的mimetype类型,一般是text/html。
CGIPath:相当于给CGI程序使用的$PATH变量。
SinglePostLimit:一次POST允许最大的字节数,默认是1MB.
AddType: 增加MimeType没有指定的类型,例: AddType type extension [extension ...]。要使用cgi,必须添加cgi类型:AddType application/x-httpd-cgi cgi
Redirect:重定向文件
Aliases:指定路径的别名。
ScriptAlias:指定脚本路径的虚拟路径。