轻量级的web server_轻量版网页入口web_guxch的博客-程序员秘密

技术标签: C/C++  Linux  

一、背景

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

对字符串操作的一些扩展

 程序大致的调用过程如下图。


图中虚线框中的东西需要自己写,服务器的应答主要在http.c和request.c中完成,其余的文件都是支撑性质的。值得注意的是,该服务器是多线程的:主线程一个,侦听线程一个,处理每个请求的线程若干。服务器的运行参数在http.h中设置,不是将配置单独写到配置文件中,大概为了简单吧。

四、一些讨论

1. 不同的要求采用不同的web sever,本文的重点在于server的简单、易用,从这点上看,Robin_e是合适的,它代码很少,总代码大致有2千行,因此即使全部看一遍,也不会太费劲。

2.Robin_e能以源代码的方式嵌入到我们的应用程序中,与我们的应用共享一个进程。对稳定性要求高的web server来说,这样可能不合适,但可以减少编程的复杂性,适用于不以web服务作为主要功能的场合。


(结束本文前,找到一个复杂一些的web sever,叫mongoose,总共不超过2万行代码,且代码集中到一个文件中,也便于部署或将其源代码级嵌入到应用程序中)


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/guxch/article/details/8490078

智能推荐

北航计算机专硕学硕区别,专硕是什么意思啊?和学硕一样吗?_weixin_39531688的博客-程序员秘密

北航在职研究生招生老师为大家介绍专硕和学硕是有区别的。专硕即专业学位(professional degree),是相对于学术型学位(academic degree)而言的学位类型,其目的是培养具有扎实理论基础,并适应特定行业或职业实际工作需要的应用型高层次专门人才。学硕即学术型学位,以培养教学和科研人才为主,授予学位的类型主要是学术型学位。学术型学位按招生学科门类分为哲学、经济学、法学、教育学、文...

Base64实现加密和解密’html文本‘_html代码 富文本 base64 加密_兀行者(做个有情怀的java程序员)的博客-程序员秘密

#BASE64一种较为简单的加密方式,效率较高,不能加密密码,可以加密图片或html文本等。public static void base64(String str) { byte[] bytes = str.getBytes(); //Base64 加密 String encoded = Base64.getEncoder().encodeToString(bytes); System.out.println("Base 64 加密后:"

领扣LintCode算法问题答案-322. 象棋游戏_二当家的白帽子的博客-程序员秘密

领扣LintCode算法问题答案-322. 象棋游戏目录322. 象棋游戏鸣谢322. 象棋游戏在棋盘上给定一个长度为N的二元组数组queen,代表N个皇后棋子的坐标给定一个长度为M的二元组数组knight,代表M个骑士棋子的坐标每个皇后可以袭击同行,同列,或者同对角线的任意一个骑士棋子请你返回一个长度为M的答案数组,依次代表每个骑士棋子是否会被攻击到样例 1:输入:[[1,1],[2,2]][[3,3],[1,3],[4,5]]输出:[true.true,false]解释:第.

java 监控 emc 存储_EMC存储配置说明(转)_您身边的武器小店的博客-程序员秘密

EMC存储配置说明一、硬件说明1、名词解释:SP:storage processor磁盘控制器,一般可分为SPA和SPB,是EMC控制的核心部分。每个SP有一个IP地址,方便进行远程管理。SPS:Storage Power Supplies电池,也有两块,主要功能在于停电时还可放电保证cache中的数据顺利写入磁盘。一般充电时间40分钟。LCC:链路控制,连接在磁盘柜与SP之间,是SP控制硬盘的通...

鸟哥的 Linux 私房菜 -- 服务器架设篇目录_mybluetiankong的博客-程序员秘密

鸟哥的 Linux 私房菜 -- 服务器架设篇目录特别强调底下这些文件主要是针对在 Linux 上的网络服务器来书写架设方式的,鸟哥主要以使用 RPM/YUM 作为软件安装的 CentOS 为基础系统。 CentOS 是属于 Red Hat Enterprise Linux (RHEL) 的操作系统,所以理论上 RHEL, CentOS, Fedora 等版本都

basepath的使用_在路上NEXT的博客-程序员秘密

basepath的使用 basePath 的使用 <在JSP中的如果使用 “相对路径”  则有可能会出现问题. 因为 网页中的 “相对路径” , 他是相对于 “URL请求的地址” 去寻找资源.上面这句话是什么意思呢 ? 举个例子:假如我们有一个项目: MyApp 在该项目下, 有一个jsp文件夹

随便推点

setStyleSheet不起作用,就试试重写paintEvent事件试试_风华正茂的小老弟的博客-程序员秘密

有时候发现-&gt;setStyleSheet不起作用,就重写这个事件void 类名::paintEvent(QPaintEvent *e){QStyleOption opt;opt.init(this);QPainter p(this);style()-&gt;drawPrimitive(QStyle::PE_Widget, &amp;opt, &amp;p, this);QWid...

一个周期为510的脉冲,1的时间周期为10个单位,0的时间周期为500个单位的电路_500个clk_在FPGA的混子的博客-程序员秘密

原码:module cont(input clk,input rst_n,output [9:0] cont_i);reg vs;reg [9:0]cont;always@(posedge clk)beginif(~rst_n)cont&lt;=0;else if(cont==509)cont&lt;=0;elsecont&lt;=cont+1’b1;endalw...

从入门到精通之专家系统CLIPS(二)我的第一个CLIPS_clips专家系统怎么运行_芳满楼的博客-程序员秘密

CLiPS设计之初,是为了帮助开发基于人类知识、经验为模型的软件。开发一个专家系统软件,除了常规软件开发所需的人员配置,还需要一名知识工程师。所谓知识工程师,就是负责学习、掌握特定领域的专业知识,并将这些知识整理成“文字知识库”。此后,CLIPS工程师负责将“文字知识库”翻译成CLIPS知识库。CLIPS的知识主要体现在以下三个方面:规则:主要用于体现以经验为基础的启发性知识。通用函数

软件测试工具分类概述_delphi的测试管理工具_KerryMo的博客-程序员秘密

    人类的进步是从会制造工具和使用工具开始的,作为IT行业,亦不例外。针对<a onclick="function onclick(){tagshow(event, %B2%E2%CA%D4);}" href="javascript:;" target="_self">测试这个近几年来风靡的新兴的“工种”,其测试工具的发展和应用已然进入相对“成熟化”。    标准化和流程化

Andorid N 最近任务管理器流程详解(一)_failed to start recents activity_渔人爱编程的博客-程序员秘密

前言相信大家都用过任务管理器,不同的手机上面启动的方式可能会有不同,有虚拟按键或者实体按键的,可能会通过短按或者长按Menu键来触发,如果这些都没有,只有一个指纹按键的,可能是通过长按的方式来触发。这个功能我们经常会用到,他可以让我们快速回到之前任务栈,好了,废话不多说了,直接来分析代码。 我们分为五个部分来讲解,分别是:最近任务管理器的触发Task的获取缩略图的获取Task的移除其他