找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[ 项目开发 ] 【守望者 linux项目】mini WEB服务器设计

2014-03-28 20:11| 发布者: watchmen | 查看: 8812 | 收藏

摘要: 以下是曾经Watchmen一个朋友学习网络编程时设计的一个简单的MiniWEB服务器。可以方便的应用于嵌入式设备,当然,更多的是适合学习HTTP协议。
MINI WEB服务器设计

以下是曾经Watchmen一个朋友学习网络编程时设计的一个简单的MiniWEB服务器。以下是其工作计划:
1、查看HTTP/1.0协议
参见:RFC1945, <>第9章

2、配置文件格式定义<详见minim.conf>
option=val1, val2,...
# 注释文本
#选项集开始
option=val #选项值定义
#选项集结束

3、定义所要实现的功能
主功能:
3.1 日志记录
服务器程序日志:由配置文件minim.conf的全局变量(islog, logfile, loglevel)确定
日志格式:ID:TIME:IP:PORT:DOMAIN:LEVEL:MSG
客户访问日志:由具体主机定义(islog, logfile, loglevel)
日志格式:CLIENT_IP:CLIENT_PORT:TIME:REQUEST_MSG:RESPONSE_MSG
3.2 支持多个实主机:IP与PORT唯一确定
ip=
port=
*3.3 支持虚拟主机:IP与PORT还要加上域名进行唯一确定
明白虚拟主机与实主机之间的区别
ip=
port=
domain=
3.4 错误信息回复
400--
404--
3.5 主目录与默认主页
home=
index=
3.6 request_method
GET
3.7 主机线程设置
default=
max=
increase=
min_idle=
max_idle=
辅助功能
3.8 服务器运行用户与组:minim-www:minim-www
3.9 可作为守护进程启动,参见<>第13章

其它
*3.10 服务器状态查询,如apache的server-status功能
* 此功能在第1版中不提供

4、功能实现方法
4.1 日志记录
(1). 服务器程序信息发送到stderr
(2). 客户访问日志发送到stdout
(3). 在进入deamon模式之前,可确保所有信息显示在终端上;而进入deamon模式之后,把stderr重定向到全局日志文件,把stdout重定向到客户访问日志文件

4.2 多主机
(1). fork()出的子进程首先应该关闭掉对于其它web 服务器的访问句柄
(2). 先扫描配置文件,查找出所有的,每个server即为一个web服务器;根据唯一确定原则处理冲突问题
(3). 为每个server定义一个struct web_server实体,并产生相应的进程

*4.3 虚拟主机
(1). 虚拟主机问题比实主机更加复杂,因为它要求在一组IP:PORT上可以绑定多个主机,每个主机用domain进行区分,这就要用到SO_REUSEADDR与SO_REUSEPORT选项
(2). 合理的利用惊群效应(进程)

4.4. 错误信息回复
(1). 定义全局错误信息回复页面
(2). 为每个web服务器(含)定义相应的struct err_response结构
(3). 处理好全局与个体web服务器的映射关系

4.5 主目录与默认主页
(1). home=重点检查以下可能出现的问题
a. 目录名以及访问文件名中不能有".."出现,防止客户越权访问
b. 可以考虑chroot()--see man -S2 chroot--到相应的目录
(2). index=

4.6 Request_method
(1). 采用enum定义所要实现的method及相应的处理函数,为方便扩展

4.7 线程
(1). 每个进程在进入线程之前完成listen(), 在线程中调用accept(),
(2). 调用accept()的代码定义为临界代码, 采用sem_*()或pthread_mutex_*()的信号量进行同步
(3). 定义一个idle线程链表,确保idle线程数在min_idle与max_idle之间
(4). 当idle线程数小于min_idle时,由主线程一次创建increase个线程
(5). 总线程数不能大于max数量,从而可以有效设置一个web服务器的规模
(6). idle线程的退出由线程自己来处理,为了防止振荡出现,idle线程的判定与退出操作定义为临界代码
(7). 每个线程的recv阻塞时间不应该大于timeout时间(unit:second)

4.8 服务器运行用户与组:
(1). 安装时定义相应的用户与组:minim-www
(2). 程序启动时,设置自己的sid,sgid,seid, segid

4.9 可作为守护进程启动,参见<>第13章
(1). 要多次fork()之前,处理好配置文件

*4.10 服务器状态查询,如apache的server-status功能
(1). 每个进程向一个统一的文件中按指定协议(需自定义)写入状态信息
(2). 主进程建立一个线程来侦听对服务器状态的请求
(2). 侦听线程读取状态文件,生成网页文件,并向客户端发送

5、程序启动顺序(详见flow-chart.pdf)


6、注意事项
(1). 程序中所有文件目录不能直接写在代码中,应该是由宏定义,具体的值应该是在configure配置时确定,然后生成在一个头文件(path.h)中,由程序包含此文件。为了便于调试,可以先行手动编辑path.h
(2). 配置文件doc/minim.h中部分值也应该由configure配置时确定
(3). 需要配置时由autoconf确定的文件有
path.h.in --> path.h
minim.conf.in --> minim.conf
config.h.in --> config.h

FYI: (automake system variables)
  --bindir=DIR           user executables [EPREFIX/bin]
  --sbindir=DIR          system admin executables [EPREFIX/sbin]
  --libexecdir=DIR       program executables [EPREFIX/libexec]
  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
  --libdir=DIR           object code libraries [EPREFIX/lib]
  --includedir=DIR       C header files [PREFIX/include]
  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR          info documentation [DATAROOTDIR/info]
  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR           man documentation [DATAROOTDIR/man]
  --docdir=DIR           documentation root [DATAROOTDIR/doc/charpter3]
  --htmldir=DIR          html documentation [DOCDIR]
  --dvidir=DIR           dvi documentation [DOCDIR]
  --pdfdir=DIR           pdf documentation [DOCDIR]
  --psdir=DIR            ps documentation [DOCDIR]


7、程序文件结构
minim
 |
 |--doc
     |--minim.conf
     |--Plan.text
     |--Request.txt
 |--include
     |--path.h
     |--minim.conf.h
 |--err_pages
     |--400.html
     |--404.html
     |--500.html
 |--conf
     |--minim.conf
     |
 |--lib
     |--
 |--src
     |--
 |--Readme
 |--Todo.txt




所有文档及代码下载

*******************************************************************
对于在嵌入式开发中,显然更多的是使用开源的嵌入式WEB服务器。常见的有嵌入式WEB服务器如下:

lighttpd
shttpd
thttpd
boa
mathopd
minihttpd
appweb
goahead

嵌入式WEB服务器BOA的移植方法(一)

     Boa是一个非常小巧的Web服务器,可执行代码只有约60KB。它是一个单任务Web服务器,只能依次完成用户的请求,而不会fork出新的进程来处理 并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度和安全,在其站点公布的性能测试中,Boa的性能 要好于Apache服务器。
(1)从
www.boa.org下载Boa源码,将其解压并进入源码目录的src子目录
 # tar xzf boa-0.94.13.tar.gz
 # cd boa-0.94.13/src
 生成Makefile文件
 # ./configure
修改Makefile文件,找到CC=gcc,将其改成CC = arm-linux-gcc,再找到CPP = gcc –E将其改成CPP = arm-linux-gcc –E,并保存退出。
然后运行make进行编译,得到的可执行程序为boa,将调试信息剥去,得到的最后程序只有约60KB大小。
 # make
 # arm-linux-strip boa

(2)完成Boa的配置,使其能够支持CGI程序的执行。Boa需要在/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf。在Boa源码目录下已有一个示例boa.conf,可以在其基础上进行修改,下面解释一下该文件的含义:
#
监听的端口号,缺省都是80,一般无需修改
Port 80


# bind
调用的IP地址,一般注释掉,表明绑定到INADDR_ANY,通配于服务器的所有IP地址
#Listen 192.68.0.5


#
作为哪个用户运行,即它拥有该用户的权限,一般都是nobody,需要/etc/passwd中有
#nobody
用户
User nobody
#
作为哪个用户组运行,即它拥有该用户组的权限,一般都是nogroup,需要在/etc/group件中有nogroup
Group nogroup


#
当服务器发生问题时发送报警的email地址,目前未用,注释掉
#ServerAdmin 
root@localhost


#
错误日志文件。如果没有以/开始,则表示从服务器的根路径开始。如果不需要错误日志,则用#/dev/null。在下面设置时,注意一定要建立/var/log/boa目录
ErrorLog /var/log/boa/error_log


#
访问日志文件。如果没有以/开始,则表示从服务器的根路径开始。如果不需要错误日志,则用#/dev/null或直接注释掉。在下面设置时,注意一定要建立/var/log/boa目录
#AccessLog /var/log/boa/access_log


#
是否使用本地时间。如果没有注释掉,则使用本地时间。注释掉则使用UTC时间
#UseLocaltime


#
是否记录CGI运行信息,如果没有注释掉,则记录,注释掉则不记录
#VerboseCGILogs


#
服务器名字
ServerName 
hostname


#
是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的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/mime.types文件用来指明不同文件扩展名对应的MIME类型,一般 可以直接从Linux主机上拷贝一个,大部分也都是在主机的/etc目录下。


===================================================================

 

(3)系统测试
1.
进入 boa-0.94.13/src
 ./configure
 make
2.
etc/下建立boa目录并将boa.conf拷贝到该目录下.更改
boa.conf
      Group nogroup  
===》Group 0

3. /var/log/下建立boa目录,该目录下可以查看boa服务器的日志

4.其它的一些路径

默认是/var/www下的内容可以访问                       DocumentRoot /var/www
默认cgi ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/  cgi可执行程序放在 /usr/lib/cgi-bin/目录下)
例子
http://201.201.201.249/cgi-bin/cgi-test.cgi
CGIPath /bin:/usr/bin:/usr/local/bin

只有这些目录下的命令可以被调用,如果要root的权限(如ifconfig配置ip)需要加上/sbin

会员评论  

已有0参与评论

推荐阅读

[守望者   java初中级视频]22_javaNIO,AIO编程
[守望者 java初中级视频]22_javaNIO,
内容简介:本课程介绍阻塞,非阻塞,同步和异步的基本概念,介绍javaNIO,AIO
[守望者 算法视频]01_数据存储(链表与数组)
[守望者 算法视频]01_数据存储(链表与
本章重点介绍数据的在计算机的存储方式 :连续存储(数组)与链式存储,同时
【守望者 观点】智能路由和Wi-Fi探针是一对好基友
【守望者 观点】智能路由和Wi-Fi探针是
智能路由与Wifi探针可以收集用户行为,同时可以收集用户MAC地址,还可以跟踪
【守望者 游戏项目】基于cocos2d-x的跑酷游戏项目教程
【守望者 游戏项目】基于cocos2d-x的跑
Cocos2d-x跑酷游戏项目教程Cocos2d-x跑酷游戏项目教程cocos2d-x特性cocos2
【守望者 linux项目】mini WEB服务器设计
【守望者 linux项目】mini WEB服务器设
以下是曾经Watchmen一个朋友学习网络编程时设计的一个简单的MiniWEB服务器。
[守望者   java初中级视频]00_java初中级课程学习导航
[守望者 java初中级视频]00_java初中
内容简介:全面贾少这套视频课程学习需要具备的理论基础,以及适合的学习人群
【守望者 linux项目】linux下的FTP服务器与客户端,作者 灯下野狐 ...
【守望者 linux项目】linux下的FTP服务
本项目是一个完整的FTP服务器及FTP客户端设计示例,对于需要学习网络编程项目
[守望者 算法视频]08_数据查找_hash算法
[守望者 算法视频]08_数据查找_hash算
守望者:普通逐个查找O(n),组织方式可以无序的数组或者普通链表。已经排序的
[守望者 linux视频]01_开发工具与开发平台
[守望者 linux视频]01_开发工具与开发
本课主要介绍gcc,gdb等系列开发工具,开始编写程序之旅。要求理解Linux开发平
【解读】什么样性格的人会被夸性格好
【解读】什么样性格的人会被夸性格好
守望者:性格决定命令。好的性格意识着给别人面子,能接受别人装逼,而且以上

行业聚焦  面试交流  职位推荐  开发视频   技术交流  腾讯微博  新浪微博

友情链接:课课家教育  阿里云  鲜果  W3Cfuns前端网  中国企业家  环球企业家  投资界  传媒梦工场  MSN中文网  Android开发者社区  cnbeta  投资中国网  又拍云存储  美通说传播  IT茶馆  网商在线  商业评论网  TechOrange  IT时代周刊  3W创新传媒  开源中国社区  二维工坊  Iconfans  推酷  智能电视网  FreeBuf黑客与极客  财经网  DoNews  凤凰财经  新财富  eoe移动开发者社区  i黑马  网易科技  新浪科技  搜狐IT  创业家  创业邦  腾讯财经  福布斯中文网  天下网商  TechWeb  雷锋网  新浪创业  和讯科技  品途O2O  极客公园  艾瑞网  抽屉新热榜  卖家网  人民网通信频道  拉勾网  创新派  简单云主机  

手机版|黑名单|守望者在线 在线教育 linux 高级程序设计 C/C++ 大数据 ( 蜀ICP备14029946号

成都守望者科技有限公司 © 2013-2016 All Rights Reserved