最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

基于linux的Web服务器设计

来源:动视网 责编:小OO 时间:2025-09-23 06:46:03
文档

基于linux的Web服务器设计

基于嵌入式Linux的嵌入式Web服务器设计摘要:本文先对嵌入式Web服务器技术及发展状况进行了概述,接着对HTTP协议及Socket编程进行了简介,最后采用HTTP协议和CGI技术设计和实现了一个嵌入式Web服务器,并通过CGI动态页面实现了服务器与客户端浏览器的动态交互。关键词:嵌入式Linux;Web服务器;Boa;HTTP协议;0引言从Internet的迅猛发展,传统的Client/Server(客户机/服务器)体系结构[1]渐渐的在某些方面显示出它的局限性,Browser/Serve
推荐度:
导读基于嵌入式Linux的嵌入式Web服务器设计摘要:本文先对嵌入式Web服务器技术及发展状况进行了概述,接着对HTTP协议及Socket编程进行了简介,最后采用HTTP协议和CGI技术设计和实现了一个嵌入式Web服务器,并通过CGI动态页面实现了服务器与客户端浏览器的动态交互。关键词:嵌入式Linux;Web服务器;Boa;HTTP协议;0引言从Internet的迅猛发展,传统的Client/Server(客户机/服务器)体系结构[1]渐渐的在某些方面显示出它的局限性,Browser/Serve
基于嵌入式Linux的嵌入式Web服务器设计

摘  要: 本文先对嵌入式Web服务器技术及发展状况进行了概述,接着对HTTP协议及Socket编程进行了简介,最后采用HTTP协议和CGI技术设计和实现了一个嵌入式Web服务器,并通过CGI动态页面实现了服务器与客户端浏览器的动态交互。

关键词: 嵌入式Linux; Web服务器; Boa; HTTP协议; 

0引言

从Internet的迅猛发展,传统的Client/Server(客户机/服务器)体系结构[1]渐渐的在某些方面显示出它的局限性,Browser/Server结构(浏览器/服务器)[1]的出现恰恰弥补了这种缺陷。B/S方式已成为一种时尚,大部分网络应用系统都是以这种B/S方式与网络用户交换信息。B/S的基础是客户端要有一个浏览器程序,服务器端要有一个与之对应的Web服务器。显然,Web服务器在B/S方式下起着决定性的作用,因此,一般互联网站都采用功能强大的通用Web服务器。但对于嵌入式系统,所需的Web服务功能比较简单,如果仍然采用大型的通用Web服务器,无疑是一种资源的浪费。解决方法是使用功能相对简单、体积更小、消耗资源更少的简单Web服务器,于是嵌入式Web服务器就应运而生了。

1 预备知识

1.1嵌入式web服务器概述

嵌入式web服务器(EWS,Embedded Web Server)是指将Web服务器引入到现场测试和控制设备中,在相应的硬件平台和软件系统的支持下,使传统的测试和控制设备转变为具备了以TCP/IP为底层通信协议,Web技术为核心的基于互联网的网络测试和控制设备[2]。EWS系统与传统的Web应用相比,简化了系统结构,将信息采集和信息发布都集成到现场的测控设备中。而有了标准的接口形式和通信协议,内嵌于设备的Web服务器同样可以向任何接入它所在网络的合法用户提供统一的基于浏览器方式的操作和控制界面,浏览器成了设备的前端控制板[3]。由于Web技术的开放性和平台特性,大大降低了软件系统和通信系统的设计、维护工作量,节省了人员培训费用等,提高了现场测试和控制设备的管理水平。

传统的通用Web服务器被设计用来处理成千上万个用户对普通网站的同时并发访问。它可以有强有力的数据库作为后盾来开展内容繁多的商业服务,但是由于嵌入式设备的处理器能力和有限的存储容量,这样的服务器并不能用来在嵌入式设备上面运行。对于一般的管理信息系统或中小型应用系统,所需的Web服务功能比较简单,如果仍然采用大型的通用Web服务器,无疑是一种资源的浪费。解决方法是使用功能相对简单、体积更小、消耗资源更少的简单Web服务器,于是嵌入式Web服务器就应运而生了。

本论文所研究的嵌入Web服务器是基于B/S结构的,这里有必要对其进行简要的介绍。

1.2 B/S结构

B/S结构即浏览器/服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,只有极少部分事务逻辑在前端(Browser)实现,主要事务逻辑在服务器端(Server)实现,形成所谓三层结构。

B/S结构主要是利用了不断成熟的WWW浏览器技术,结合浏览器的多种Script语言(VBScript、JavaScript)和Active)技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。随着Windows 98/2000将浏览器技术植入操作系统内部,这种结构更成为当今应用软件的首第四章嵌入式Web服务器的设计及实现选体系结构。显然B/S结构应用程序相对于传统的C/S结构应用程序将是巨大的进步。

软件系统的改进和升级越来越频繁,B/S架构的产品明显体现了更方便的特性。对于一个稍微大一点的单位来说,系统管理人员如果需要在几百甚至几千台电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。所以客户机越来越“瘦"而服务器越来越“胖”是将来软件的主流发展方向,这使得升级和维护越来越容易而使用越来越简单。成本降低,选择更多。基于B/S架构的网络图如图1.1所示:

磁盘阵列

图形服务器

打印机

WEB-GIS服务器

数据库服务器

Web服务器

浏览器

防火墙

客户端

客户端

        ………             

远程终端

路由器

图1-1基于B/S架构的网络图

1.3 HTTP协议

Internet的基本协议是TCP/IP协议。目前广泛采用的FTP、Archie、Gopher等是建立在TCP/IP协议之上的应用层协议,不同的协议对应不同的应用。

WWW服务器使用的主要协议是HTTP协议,即超文本传输协议。由于HTTP协议支持的服务不限于WWW,还可以是其他服务,因而HTTP协议允许用户在统一的界面下,采用不同的协议访问不同的服务,如FTP、SMTP等。另外,HTTP协议还可用于名字服务器和分布式对象管理。HTTP为应用层网络协议,是一个可理解URL(Uniform Resource Locator)地址格式的小型化的、适合超文本的、多媒体环境的通信协议。使用MIME(多用途互联网邮件扩充)处理数据,使它能适应多媒体技术。

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过十多年的使用与发展,得到不断的完善和扩展。

HTTP协议是基于请求/响应模式的。一个客户机与服务器建立连接后,发送一个请求给服务器。服务器接到请求后,给予相应的响应信息。在Internet上,HTTP通信通常发生在TCP/IP连接之上。缺省端口是TCP 80,其他端口也是可用的,但这并不预示着一个可靠的传输。

基于HTTP协议的客户/服务器模式的信息交换分四个步骤:建立连接、发送请求信息、发送响应信息和关闭连接。

(1)建立连接

连接的建立是通过申请套接字实现的。客户打开一个套接字并把它约束在一个端口上,如果成功,就相当于建立了一个虚拟文件。以后,就可以在该虚拟文件上写数据并通过网络向外传送。

(2)发送请求

打开一个连接后,客户机把请求信息送到服务器的停留端口上,完成提出请求动作。

HTTP/1.1的请求消息的格式为:

请求信息=请求行(通用信息I请求头I实体头)CRLF[实体内容]

其中:

请求行=方法请求URL HTTP版本号CRLF

方法=GETIHEADIPOSTI扩展方法

UI也=协议名称+宿主名+目录与文件名

请求行中的方法描述指定资源中应该执行的动作,常用的方法有GET、HEAD和POST。不同的请求对象对应GET的结果是不同的,对应关系如表4.1所示。

表1-1 GET命令所取回对象的内容

对象GET的结果

文件文件的内容
程序该程序的执行结果
数据库查询查询结果
HEAD:要求服务器查找某对象的元信息,而不是对象本身。

POST:从客户机向服务器发送数据,在要求服务器和CGI(通用网关接口)做进一步处理时会用到POST方法。POST主要用于发送HTML文本中FORM的内容,让CGI程序处理。

一个请求的例子为:

GET http://www.Cqpu.edu.cn/index.html HTTP/1.1

所有新版本的HTTP协议支持两种不同的请求格式:简单请求方式和完全请求方式。通常使用的都是完全请求方式。

(3)发送响应

服务器在处理完客户的请求后,要向客户机发送响应消息。

HTTP/1.1的响应消息格式如下:

响应消息=状态行(通用信息头I响应头I实体头)CRLF[实体内容]

状态行=HTTP版本号状态码 原因叙述

表4.2列出了各种状态码的含义:

表1-2状态码表示的含义

状态码含义例子
1XX信息100:服务器同意处理客户请求

2XX成功200:请求成功;204:没有内容存在

3XX重定向301:页面发生移动;304:缓存的页面仍然有效

4XX客户错误403:禁止的页面;404:页面没有找到

5XX服务器错误500:服务器内部错误;503:以后再试

 (4)关闭连接

客户和服务器双方都可以通过关闭套接字结束TCP/IP对话。

当使用者单击有超文本链接的文字或图像时,浏览器就将有超文本链接所代表的URL显示出来。一般来说,一个浏览器被使用者选中了一个超文本链接后,进行如下几步操作:

>浏览器中的某个URL被使用者选中;

>浏览器使用DNS查询URL中的域名所代表的口;

>DNS发出一个回应,通知浏览器查询域名所代表的P;

>浏览器通过TCP协议连接到Web服务器的80端口;

>浏览器向W曲服务器发送一个GET HTTP://请求;

>Web服务器将index.html发送过来;

>浏览器结束这个TCP连接;

>浏览器将index.html这个页面显示出来;

>浏览器将index.html中包含的图像、声音等下载、显示和播放。

1.4 Socket简介

如果说两台计算机是利用一个“通道”进行通信,那么这个“通道’’的两端就是两个套接字。Socket屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了Socket规范的计算机之间的通信成为可能。套接字已成为Linux系统下TCP/IP网络编程标准,但是随着网络技术的不断进步,套接字的应用范围已经不再局限于Linux和TCP/IP网络。套接字已经成为网络编程的通用接口。总之,套接字是进行程序间通信的一种方法,在浏览器/服务器通信模型中,一个套接字就是通信的一端,这意味着套接字用来让一个进程和其它的进程互通信息。

网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用叫Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用,数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用[4]。

Linux网络编程中常用的系统调用函数包括:初始化(socket)、连接(connect)、绑定(bind)、监听(1isten)、接收(accept)、关闭(close)、发送(send)。

Socket接口通过以下函数为应用编程提供服务:

>socket():创建一个套接字;

>bind():用于将套接字与本地或远程某个地址和端口建立关联;

>listen():用于在服务器一端监听是否有连接请求;

>connect():客户通过调用该函数主动与服务器建立连接;

>accept():用于接收来自客户的连接请求,服务器先创建一个新的套接字,用

新套接字与客户进行通信,原套接字仍保持侦听状态,以便接收其他连接请求;

>send()和recv():SOCK_STREAM类型套接字数据的发送和接收;

>close():关闭套接字。

Socket工作原理如下:

服务器端:

>创建一个socket;

>将该socket与本机地址/端口号捆绑;

>在监听端口上监听客户机的连接请求;

> 当accept捕捉到一个连接请求时,就建立连接线路并返回一个新的通信文件描述符;

>父进程创建一个子进程,父进程关闭通信文件描述符并继续监听端口上其它客户机的连接请求;

>子进程通过通信文件描述符与客户机进行通信,通信结束后终止子进程并关闭通信文件描述符。

浏览器端:

>创建一个socket;

> 向指定的服务器主机及端口发出连接请求,请求成功将返回通信文件描述符;

>调用connect函数与服务器建立连接;

>连接成功之后与服务器进行通信;

>通信完毕后关闭通信文件描述符。

服务器设置套接字处于侦听之后,将进入永久循环;浏览器端在与服务器建立连接后,通常进行一些数据传输后,就可关闭。

Web服务器的工作方式都是以套接字机制为基础的。对于一个B/S通信模型,在服务器端,首先创建一个套接字,并将此套接字与服务器公认的IP地址绑定在一起,接着将套接字转换成侦听套接字来侦听用户的请求,在接收到客户机的请求后就建立连接,然后服务器和客户机之间就可以使用read()和write()函数进行通信了。多个请求时服务器使用不同的进程来进行处理,互不干扰。

2嵌入式Web服务器的实现

嵌入式Web服务器是基于Socket套接字开发的,主要由如下一些模块组成:初始化模块、侦听模块、请求解析模块、脚本引擎模块、输出模块和命令模块,各模块之间的关系如下图2-1所示。

初始化模块

侦听模块

请求解析模块

带参数命令    

静态文本静

                                  

                              动态 文本

脚本引擎模块

命令执行模块

输出模块

图2-1 Web服务器的模块框图

初始化模块用于定义变量、设置信号量、创建套接字、将套接字与本地地址或端口绑定,并设置套接字处理侦听状态。侦听模块在接收一个连接请求后,读取用户的请求,进行处理,再交给解析模块进行解析。请求解析模块是服务器的核心所在,根据用户的请求,进行相应的处理。当请求为静态文本时,文档直接提交给输出模块输出;请求为动态文本时,请求解析模块自动调用脚本引擎模块,将脚本替换为现场数据,再提交给输出模块输出;当请求为带参数的执行命令时,请求解析器调用命令执行模块分析命令并控制监控前端。

Linux下嵌入式W曲服务器主要有三个:httpd、thttpd和Boa。httpd是最简单的一个Web服务器,它的功能最弱,不支持认证和CGI。thttpd和Boa都支持认证、CGI等,功能比较全。如果Web服务器仅需提供一些静态页面,例如系统介绍、简单的在线帮助等,完全可以用静态服务器httpd来实现。但若需要与用户进行交互,例如数据查询、实时状态查询等,则必须使用动态Web技术,可以选用thttpd或是Boa来实现。但是thttpd在运行过程中所需要的资源远远大于Boa。为了实现动态Web技术,这里选择一个支持CGI的、非常适合于嵌入式系统的W曲服务器Boa。

本节将阐述Boa的基本运行流程、移植过程及其动态页面的实现。

2.1 Boa的运行流程

Boa是一个单任务的http服务器,源代码开放、性能高。Boa最重要的设计目标就是速度和安全性。Boa与传统的Web服务器不同,不对每个进入服务器的连接开辟进程,更不为处理多路复用而开辟进程。Boa对所有活动的HTTP连接在内部进行处理,而只为每个CGI连接启动新的进程。测试表明Boa服务器的速度比常规的Web服务器要快,比Apache服务器快两倍以上,所以Boa应用于嵌入式系统是很有优势和发展前景的。图2-2是Boa的基本运行流程图。

新的连接

从套接字获得请求信息

处理HTTP头

未通过论证返回403错误

HTTP认证

                                              未通过     

                      通过

处理CGI请求

是否是CGI

                                               是     

                        否         

处理静态文件请求

实现CGI环境变量

返回等待新的连接

图2-2 Boa的基本运行流程图

2.2 Boa的移植

    Boa的开发与测试目前主要是基于GNU/Linux/i386。它的源代码跟其它的嵌入式Web服务器的代码相比更加简明,因此它很容易被移植到具有Unix风格的平台上。Boa源代码开放、性能优秀,特别适合应用在嵌入式系统中。

Boa的源程序是从boa.c中的main()主函数开始执行。在该源程序中,先是对该Web服务器进行配置:为了在用户访问Web时服务器能确定根目录的位置,首先需要指定服务器的根目录路径,fixup_server_root ()函数就是用来设置该服务器的根目录;接着read_config_files()函数对其他服务器所需的参数进行配置,比如服务器端server_port、服务器名server_name、文件根目录document_root等,其它大部分参数要专门从boa.conf文件中读取;接下来是为CGI脚本设置环境变量。

这些配置都完成并且正确后,就为Boa建立套接字(socket)、使用TCP/IP协议创建了一个特别适合嵌入式系统的Web服务器。

建立Boa Web服务器包括如下步骤:

(1)下载Boa源代码。Boa Web服务器的源代码可以从http://www.boa.org下载最新的版本,本实验下载文件为:boa-0.94.13.tar.gz。

(2)安装并编译Boa源代码。

tar -zxvf boa - 0.94.1 3.tar.gz

cd boa-0.94.1 3/src

//生成Makefile文件

./configure

vi Makefile   //修改Makefile文件

修改CC=gcc为CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc

修改CPP=gcc-E为CPP=CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc-E

//然后编译

make

/usr/local/arm/3.4.1/bin/arm-linux-strip boa

在boa/src目录下将生成boa文件,该文件即为boa Web服务器执行文件。

(3)配置Boa W曲服务器

对Boa的配置,主要是使其能够支持CGI程序的执行。Boa需要在/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf在Boa源码目录下已有一个示例boa.conf,可以在此基础上进行修改。

>Port:该参数为服务器监听的端口号,缺省都是80,一般无需修改;

> 将Group nogroup改为Group 0;

>ServerName:服务器的名字,初始没有启动,现将前面的#去掉;

>DocumentRoot:HTML文档根目录,改为/var/www;

> ScriptAlias:指定CGI程序所在目录,改为ScfiptAlias /cgi/var/www/vgi-bin/。

(4)在完成Web服务器的编写后,通过JTAG仿真器和烧写工具完成烧写任务,

将Linux映像文件和根文件等烧写到Flash中。设宿主机的地址为192.168.0.111,当打开一个浏览器并键入http://192.168.0.111时,目标板上的Web服务器收到浏览器的请求后,将目录下的文件传送给浏览器并在浏览器中显示出来,即可访问到做的网页index.html了,同时在目标板上的服务器会显示相应的打印信息,如图2-3。

接下来就要开发应用软件,通过编写CGI程序,实现动态Web交互。用C语言编写的CGI程序编译成二进制文件,放到/cgi.bin/目录下,CGI程序才能被正确地执行。

图2-3 Boa Web服务器的测试页

2.3 CGI的动态页面实现

在检索通常的Web页时,服务器只是根据主机想要的文档并从它的磁盘存储器上检索这个文档,然后将它发送给主机。服务器根本不对数据进行任何处理,它只是查看客户机提出的请求,并将请求的文档传送给客户机。

1993年以来,Web的内容已经变得越来越杂,Web用户希望每个Web页面不只是能够显示静态(不变的)Web内容。成功的Web站点必须显示动态Web页,也就是能够提供一种客户端和网页的交互。

目前有多种不同的实现动态Web页面的技术,如CGI、ASP、PHP和JSP等。在Linux下如果要实现动态网页,通常采用CGI。CGI程序可以用任何程序设计语言编写,如SheU脚本、Perl、C语言等。本论文选用C语言来编写CGI程序。

CGI提供Web服务器的一个执行外部程序的通道,这种服务端技术使得浏览器和服务器之间具有交互性。CGI程序属于一个外部程序,需要编译成可执行文件,以便在服务端运行。浏览器将用户输入的数据送到EWS,EWS使用STDIN将数据送给CGI应用程序,在执行CGI程序后,可能会访问存储数据的一些文档,最后使用STDOUT输出HTML格式的结构文件,经EWS送回浏览器,并显示给用户。如图2-4为基于CGI接口形式的信息流图。

EWS

CGI应用程序

Web浏览器

                 1.发送请求               2.调用程序             

                 4.响应请求               3.返同结果        

图2-4基于CGI接口形式的信息流

客户端浏览器向服务器发送数据采用URL编码的形式进行,编码的主要工作是表单域的名字和值的转义,经过编码处理之后,表单信息就整个成为一个连续的字符流,里面包含着将被送往服务器的全部信息。因为表单输入信息都是经过编码后传递给脚本程序的,所以CGI扩展程序在使用这些参数之前必须对它们进行解码。

CGI程序通常分为以下两部分:

>根据POST方法或GET方法从提交的表单中接收数据:

>用printf()函数来产生HTML源代码,并将经过解码后的数据正确地返回给浏览器。

图2-5为本论文的CGI动态测试页。

图2-5 CGI动态测试页

3总结

嵌入式Web服务器是实现嵌入式系统通过Web方式与Internet互联的关键组成部分,直接影响网络应用系统运行的质量与效率,对其进行研究对Internet技术的发展有重要意义。本作品提出一种基于嵌入式Linux操作系统的嵌入式Web服务器的设计方法,该嵌入式Web服务器具有成本低、开放性好、可移植性强等优点,便于后期维护和升级。

由于论文工作时间有限以及作者的水平,对嵌入式基础知识的学习时间不长,本文不可避免的存在一些漏洞和缺陷,有待于进一步的改进和完善。下面简要介绍一下本文的后续工作。

(1)本文在对Linux的实时性方面的研究较少,而嵌入式Web在工业现场应用中有很高的实时性要求。针对这个问题,今后进一步的工作将是对操作系统进行实时性改造,以满足了系统的应用要求。

(2)如何保证网络信息的安全值得我们进一步研究。

 (3)所设计的嵌入式Web服务器可以动态保存少量的数据。需进一步丰富和完善数据库的功能来对采集到的数据进一步的管理,而且由于嵌入式系统的存储空间有限,因此必须扩展数据容量,如何扩展和保存这些大量数据都需要做进一步的研究。

参考文献

[1]覃国蓉 著.基于B/S架构的软件项目实录[M].北京:电子工业出版社,2004.20~50.

[2]慕春棣 主编.嵌入式系统的构建[M[.北京:清华大学出版社,2004.36~112.

[3] SSV Software Systems. Web Server for Embedded Systems [D]. http:// www. Dilnetpc. Eom /.2002.

[4]Warren WGay.实战Linux Socket编程[M].西安:西安电子科技大学出版社,2002.

[5]符意德 著.嵌入式系统设计原理及应用[M].北京:清华大学出版社,2004.1~20.

[6]田 泽 著.嵌入式系统开发与应用教程]M].北京:北京航空航天大学出版社, 2005.105~210.

[7]吴娴. 嵌入式Linux 文件系统的设计和实现[J].计算机工程与应用,2005;39(2):111~115

文档

基于linux的Web服务器设计

基于嵌入式Linux的嵌入式Web服务器设计摘要:本文先对嵌入式Web服务器技术及发展状况进行了概述,接着对HTTP协议及Socket编程进行了简介,最后采用HTTP协议和CGI技术设计和实现了一个嵌入式Web服务器,并通过CGI动态页面实现了服务器与客户端浏览器的动态交互。关键词:嵌入式Linux;Web服务器;Boa;HTTP协议;0引言从Internet的迅猛发展,传统的Client/Server(客户机/服务器)体系结构[1]渐渐的在某些方面显示出它的局限性,Browser/Serve
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top