web接口是一个应用系统常用的接口,本文所说的轻量级的web server是指应用系统不以web访问为主,web接口提供辅助作用,例如,修改配置等,此时,对web server的要求是程序简单、无或者很轻的并发、能嵌入到应用中最好。
在开源的web sever中,应用最广的是apache,它的功能很强,但是一个重量级的应用,不符合我们的要求,另外两个有名的web server是nginx和lighttpd,下载后,下载后大小在1M左右,据文档介绍,它们也可以用在嵌入式系统,所以从“份量”上将是轻量级的,不过,它们是独立的应用,不是高手的话,很难将其嵌入到自己的应用中。那么是否还有更轻量级的?最后找到了Robin(wrhttpd)。以下是它们的一点简要介绍,有关Nginx和Lighttpd更详细的介绍,请参阅其官方网站。
Nginx是俄罗斯人开发的,它是一个很高效的web server,你日常访问的网站中,有些就采用的是Nginx(据报导大陆的有新浪博客、网易、 腾讯,有些网站的出错信息中,就包含nginx字样)。Nginx是基于消息驱动的,最大特点就是高并发,低消耗,它也可以用作HTTP代理服务器和邮件代理服务器(因而可以起到负载均衡的作用),另外它是跨平台的。
Linux上Nginx的安装依赖于pcre,这是一个与perl兼容的正则表达式库。
对大部分人来说,Nginx的最大的障碍是复杂的使用规则,特别是主配置文件nginx.conf的编写。
Lighttpd是一个德国人领导的开源软件,它特点与Nginx类似:高效、低耗,也有许多网站使用它(YouTube, wikipedia ,meebo)。它支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。
wrhttpd可以说是一个更小的web server,只有几十K,完全可以源代码级嵌入到我们的应用中,它有两个版本:
Robin_e(embedded):顾名思义,就是可以用于嵌入式的web server,因此也就是跨平台的(windows,linux),它采用C语言,本文主要介绍的就是该程序。
Robin_w:目前这个版本只适合于windows平台,它的处理与Robin_e类似,但采用的是cpp语言,因此从感觉上稍有不同(这个版本中多一个CGIBase类)。
下载该程序代码(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万行代码,且代码集中到一个文件中,也便于部署或将其源代码级嵌入到应用程序中)
北航在职研究生招生老师为大家介绍专硕和学硕是有区别的。专硕即专业学位(professional degree),是相对于学术型学位(academic degree)而言的学位类型,其目的是培养具有扎实理论基础,并适应特定行业或职业实际工作需要的应用型高层次专门人才。学硕即学术型学位,以培养教学和科研人才为主,授予学位的类型主要是学术型学位。学术型学位按招生学科门类分为哲学、经济学、法学、教育学、文...
#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. 象棋游戏目录322. 象棋游戏鸣谢322. 象棋游戏在棋盘上给定一个长度为N的二元组数组queen,代表N个皇后棋子的坐标给定一个长度为M的二元组数组knight,代表M个骑士棋子的坐标每个皇后可以袭击同行,同列,或者同对角线的任意一个骑士棋子请你返回一个长度为M的答案数组,依次代表每个骑士棋子是否会被攻击到样例 1:输入:[[1,1],[2,2]][[3,3],[1,3],[4,5]]输出:[true.true,false]解释:第.
EMC存储配置说明一、硬件说明1、名词解释:SP:storage processor磁盘控制器,一般可分为SPA和SPB,是EMC控制的核心部分。每个SP有一个IP地址,方便进行远程管理。SPS:Storage Power Supplies电池,也有两块,主要功能在于停电时还可放电保证cache中的数据顺利写入磁盘。一般充电时间40分钟。LCC:链路控制,连接在磁盘柜与SP之间,是SP控制硬盘的通...
鸟哥的 Linux 私房菜 -- 服务器架设篇目录特别强调底下这些文件主要是针对在 Linux 上的网络服务器来书写架设方式的,鸟哥主要以使用 RPM/YUM 作为软件安装的 CentOS 为基础系统。 CentOS 是属于 Red Hat Enterprise Linux (RHEL) 的操作系统,所以理论上 RHEL, CentOS, Fedora 等版本都
basepath的使用 basePath 的使用 <在JSP中的如果使用 “相对路径” 则有可能会出现问题. 因为 网页中的 “相对路径” , 他是相对于 “URL请求的地址” 去寻找资源.上面这句话是什么意思呢 ? 举个例子:假如我们有一个项目: MyApp 在该项目下, 有一个jsp文件夹
有时候发现->setStyleSheet不起作用,就重写这个事件void 类名::paintEvent(QPaintEvent *e){QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);QWid...
原码: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<=0;else if(cont==509)cont<=0;elsecont<=cont+1’b1;endalw...
CLiPS设计之初,是为了帮助开发基于人类知识、经验为模型的软件。开发一个专家系统软件,除了常规软件开发所需的人员配置,还需要一名知识工程师。所谓知识工程师,就是负责学习、掌握特定领域的专业知识,并将这些知识整理成“文字知识库”。此后,CLIPS工程师负责将“文字知识库”翻译成CLIPS知识库。CLIPS的知识主要体现在以下三个方面:规则:主要用于体现以经验为基础的启发性知识。通用函数
人类的进步是从会制造工具和使用工具开始的,作为IT行业,亦不例外。针对<a onclick="function onclick(){tagshow(event, %B2%E2%CA%D4);}" href="javascript:;" target="_self">测试这个近几年来风靡的新兴的“工种”,其测试工具的发展和应用已然进入相对“成熟化”。 标准化和流程化
前言相信大家都用过任务管理器,不同的手机上面启动的方式可能会有不同,有虚拟按键或者实体按键的,可能会通过短按或者长按Menu键来触发,如果这些都没有,只有一个指纹按键的,可能是通过长按的方式来触发。这个功能我们经常会用到,他可以让我们快速回到之前任务栈,好了,废话不多说了,直接来分析代码。 我们分为五个部分来讲解,分别是:最近任务管理器的触发Task的获取缩略图的获取Task的移除其他
【Git】Git目录中各个文件(文件夹)的说明