一、背景
web接口是一个应用系统常用的接口,本文所说的轻量级的web server是指应用系统不以web访问为主,web接口提供辅助作用,例如,修改配置等,此时,对web server的要求是程序简单、无或者很轻的并发、能嵌入到应用中最好。
二、比较
在开源的web sever中,应用最广的是apache,它的功能很强,但是一个重量级的应用,不符合我们的要求,另外两个有名的web server是nginx和lighttpd,下载后,下载后大小在1M左右,据文档介绍,它们也可以用在嵌入式系统,所以从“份量”上将是轻量级的,不过,它们是独立的应用,不是高手的话,很难将其嵌入到自己的应用中。那么是否还有更轻量级的?最后找到了Robin(wrhttpd)。以下是它们的一点简要介绍,有关Nginx和Lighttpd更详细的介绍,请参阅其官方网站。
1. Nginx
Nginx是俄罗斯人开发的,它是一个很高效的web server,你日常访问的网站中,有些就采用的是Nginx(据报导大陆的有新浪博客、网易、 腾讯,有些网站的出错信息中,就包含nginx字样)。Nginx是基于消息驱动的,最大特点就是高并发,低消耗,它也可以用作HTTP代理服务器和邮件代理服务器(因而可以起到负载均衡的作用),另外它是跨平台的。
Linux上Nginx的安装依赖于pcre,这是一个与perl兼容的正则表达式库。
对大部分人来说,Nginx的最大的障碍是复杂的使用规则,特别是主配置文件nginx.conf的编写。
2. Lighttpd
Lighttpd是一个德国人领导的开源软件,它特点与Nginx类似:高效、低耗,也有许多网站使用它(YouTube, wikipedia ,meebo)。它支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。
3. wrhttpd
wrhttpd可以说是一个更小的web server,只有几十K,完全可以源代码级嵌入到我们的应用中,它有两个版本:
Robin_e(embedded):顾名思义,就是可以用于嵌入式的web server,因此也就是跨平台的(windows,linux),它采用C语言,本文主要介绍的就是该程序。
Robin_w:目前这个版本只适合于windows平台,它的处理与Robin_e类似,但采用的是cpp语言,因此从感觉上稍有不同(这个版本中多一个CGIBase类)。
三、Robin_e源代码介绍
下载该程序代码(http://wrhttpd.googlecode.com/files/robin_e_1.1.tar.gz),解压后的目录结构、文件如下图。
wrlib目录包含程序的主体文件,main.c和cgi.c实际上是一个应用(例子),www目录是web server的主目录,里面有示例性的html以及其他资源文件。
wrlib目录下各文件的说明如下。
analysis.c | 对HTTP请求的句法分析 |
http.c | Server实现的主框架,包括初始化、侦听、多线程处理及退出 |
mg_compat.c | 一些文件或socket操作的宏,函数start_thread(跨平台的线程函数) |
misc.c | 主要定义了字符转换函数 |
request.c | 被http.c中的函数调用,实现对HTTP请求的处理,当http请求没有错误时,按要求调用cgi进行处理或者返回一个文件(html等) |
wrhash.c | Hash的实现 |
wrio.c | 文件io及网络io的实现 |
wrmpool.c | 内存(缓存)的管理 |
wrstring.c | 对字符串操作的一些扩展 |
程序大致的调用过程如下图。
四、一些讨论
1. 不同的要求采用不同的web sever,本文的重点在于server的简单、易用,从这点上看,Robin_e是合适的,它代码很少,总代码大致有2千行,因此即使全部看一遍,也不会太费劲。
2.Robin_e能以源代码的方式嵌入到我们的应用程序中,与我们的应用共享一个进程。对稳定性要求高的web server来说,这样可能不合适,但可以减少编程的复杂性,适用于不以web服务作为主要功能的场合。
(结束本文前,找到一个复杂一些的web sever,叫mongoose,总共不超过2万行代码,且代码集中到一个文件中,也便于部署或将其源代码级嵌入到应用程序中)