怎么实现一个网站的WebServer(下)

怎么实现一个网站的WebServer(下),第1张

怎么实现一个网站的WebServeWeb服务器可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应(response),例如送回一个HTML页面。

定时器Timer

如果一个请求在建立连接后迟迟没有发送数据,或者对方突然断电,应该如何处理我们需要实现定时器来处理超时的请求。Vino定时器的实现参考了Nginx的设计,Nginx使用一颗红黑树来存储各个定时事件,每次事件循环时从红黑树中不断找出最小(早)的事件,如果超时则触发超时处理。为了简化实现,在Vino中,我实现了一个小顶堆来存储定时事件,如果被处理的定时事件同时支持长连接,那么在该请求处理完毕后会更新该请求对应的定时器,也就是重新计时。定时器相关代码见vn_event_timerh和vn_event_timerc。

HTTPParser

由于网络的不确定性,我们并不能保证一次就能读取所有的请求数据。因此,对于每一个请求,我们都会开辟一段缓冲区用于保存已经读取到的数据。同时,我们需要同时对读取到的数据进行解析,以保证读取到的数据都是合理的数据,例如,假设目前缓冲区内的数据为GET/indexhtmlHTT,那么下一次读取到的字符必须为P,否则,应立即检测出当前请求是一个异常的请求,并主动关闭当前的连接。

基于以上分析,我们需要实现一个HTTP状态机(Parser)来维持当前的解析状态,Vino状态机的实现参考了Nginx的设计,并对Nginx的实现做了简化。HTTPParser相关代码见vn_http_parseh和vn_http_parsec。

MemoryPool

我们一般使用malloc/calloc/free来分配/释放内存,但是这些函数对于一些需要长时间运行的程序来说会有一些弊端。频繁使用这些函数分配和释放内存,会导致内存碎片,不容易让系统直接回收内存。典型的例子就是大并发频繁分配和回收内存,会导致进程的内存产生碎片,并且不会立马被系统回收。

使用内存池分配内存,可以在一定程度上提升内存分配的效率,不需要每次都调用malloc/calloc函数。同时,使用内存池使得内存管理更加简单。在Vino中,针对每一个请求,Vino都会为其分配一或多个内存池(各个内存池形成一个单链表),在请求处理完毕后,一并释放所有的内存。

Vino内存池的实现依旧参考了Nginx的实现,并做了简化,MemoryPool相关代码见vn_palloch和vn_pallocc。

其他

在开发Vino的过程中,还有许多需要考虑和权衡的地方。响应请求时,如果用户请求的是一个很大的文件,导致写缓冲区满,我们如何更好的设计响应缓冲区如何更高效的设计底层数据结构(如字符串、链表、小顶堆等)如何更优雅的解析命令行参数如何对特定信号进行处理如何更健壮的处理错误信息当代码的数量达到一定程度后,如何更快的定位异常代码

Vino的开发&重构暂时告一段落,源码放在了GitHub上。当然,Vino还有许多不足之处,以及未实现的特性。

仅支持HTTPGET方法,暂不支持其他HTTPmethod。

暂不支持动态请求的处理。

支持的HTTP/11特性有限。

以上就是小编对于怎么实现一个网站的WebServe的全部解答。

网站一个网站

win7搭建web服务器步骤:

1、首先打开开始菜单中的控制面板选择,在控制面板中选择并打开“程序”,找到并双击“打开或关闭Windows功能”,在弹出的窗口中选择“Internet信息服务”下面所有选项,点击确定,然后就会开始更新服务,等待一会;

2、等待更新完成之后,打开浏览器,在浏览器地址栏上输入“http://localhost/”,然后回车,如果此时出现IIS7欢迎界面,说明Web服务器已经搭建成功。 

3、当web服务器搭建成功后,下一步要做的就是把网站安装到Web服务器的目录中,一般情况下,当Web服务器安装完成之后就会创建路径“、%系统根目录%inetpub/wwwroot”,只要将网站复制到该路径下,就可实现本地访问该网站;

4、接着设置防火墙,让局域网中的其它计算机也能访问本地网站资源,操作方法:依次打开“控制面板--系统和安全”,然后点击“允许程序通过Windows防火墙”,在弹出的对话框,选择勾选“万维网服务HTTP”右侧的两个复选框,点击确定退出。 最后在局域网中其它计算机上,打开浏览器输入“http://Web服务器的IP地址/”,然后回车即可访问服务器上的资源。

可以参考如下Web服务器的建立过程。示例环境及web服务器软件:

Ubuntu 1204

LAMP(Linux,Apache,Mysql,PHP)

1、安装Apache

(1)在安装HTTP Server之前需安装APR(Apache Portable Runtime)和APR-util安装APR

$ tar zxvf apr-146targz

$ cd apr-146/

$ /configure

$ make

$ sudo make install

(2)安装APR-util

$ tar zxvf apr-util-141targz

$ cd apr-util-141

$ /configure –with-apr=/usr/local/apr (whereis apr)

$ make

$ sudo make install

(3)安装httpd-242tarbz2默认安装位置/usr/local/apache2网页放在/usr/local/apache2/htdocs配置文件/usr/local/apache2/conf/httpdconf

$ tar jxvf httpd-242tarbz2

$ cd httpd-242/

$ /configure

$ make

$ sudo make install

(4)启动HTTP Server$ sudo /usr/local/apache2/bin/apachectl startAH00558: httpd: Could not reliably determine the server’s fully qualified domain name, using 127011 Set the ‘ServerName’ directive globally to suppress this message

(5)查看http是否正常运行$ netstat -a | grep httptcp 0 0 :http : LISTEN

(6)在浏览器输入127001如果正常应该显示“It works!”

2、安装MySQL

(1)、下载安装mysql-5525targz,默认安装位置/usr/local/mysql/

$ tar zxvf mysql-5525targz

$ cd mysql-5525/

$ sudo groupadd mysql

$ sudo useradd -r -g mysql mysql

$ cmake

$ make

$ sudo make install

$ cd /usr/local/mysql/

$ sudo chown -R mysql

$ sudo chgrp -R mysql

$ sudo scripts/mysql_install_db –user=mysql

$ sudo chown -R root

$ sudo chown -R mysql data/

$ sudo cp support-files/my-mediumcnf /etc/mycnf

$ sudo cp support-files/mysqlserver /etc/initd/mysqlserver

(2)、启动MySQL:

方法1:$ sudo service mysqlserver start

方法2:$ sudo /usr/local/mysql/bin/mysqld_safe --user=mysql &

3、安装PHP

(1)安装下载php-544targz

$ tar zxvf php-544targz

$ cd php-544

$ /configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql --with-mysqli --enable-mbstring --with-mcrypt(可能需要安装libmcrypt-dev )

$ sudo make install

$ sudo cp phpini-development /usr/local/lib/phpini

(2)配置HTTP Server使之支持PHPapache配置文件/usr/local/apache2/conf/httpdconf修改或添加如下配置

<;IfModule dir_module>

DirectoryIndex indexphp

<;/IfModule>

<;FilesMatch \php$>

SetHandler application/x-httpd-php

<;/FilesMatch>

(3)重启HTTP Server

$ sudo /usr/local/apache2/bin/apachectl restart

Windows下的WWW服务器以其架设方便、操作简单赢得了很多人的青睐,下面笔者将以Windows Server 2003为例来介绍如何配置一个Web服务器,望能对刚入门的网管员有所帮助。

  一、架设Web服务器

  默认安装的Windows Server 2003没有配置IIS服务,需要我们手工安装。进入控制面板,执行“添加或删除程序→添加/删除 Windows 组件”进入Windows组件向导窗口,勾选“应用程序服务器→Internet 信息服务”,“确定”后返回Windows组件向导窗口点击“下一步”即可添加好IIS服务。在控制面板的管理工具中执行“Internet 信息服务(IIS)管理器”进入IIS管理器主界面(如图),在图上可以看出Windows Server 2003下的IIS默认支持静态网站,若要执行动态页面还需设置Web服务扩展属性,比如要执行ASP网站则要在“Web服务扩展”列表中选中“Active Server Pages”然后单击“允许”按钮来启用该功能。接下来就可以具体配置Web站点了。

  1 网站基本配置。在“默认网站”的右键菜单中选择“属性”进入“默认网站属性”窗口,在“网站”选项卡上的“描述”里可以为网站取一个标示名称,如果本机分配了多个 IP 地址,则要在IP 地址框中选择一个赋予此Web站点的IP地址;然后进入“主目录”选项卡中指定网站Web内容的来源并在“文档”中设置好IIS默认启动的文档。单击“应用”按钮后就可以使用http://127001来验证网站了。

  2 网站性能配置。进入“性能”选项卡,在这里可以对网站访问的带宽和连接数进行限定,以更好地控制站点的通信量,如果是多站点服务器,通过对一个站点的带宽和连接数限制可以放宽对其他站点访问量的限制和为其他站点释放更多的系统资源。(提示:在实际的限定操作中我们要根据网络通信量和使用变化情况进行调整。)

  3 网站的安全性配置。为了保证Web网站和服务器的运行安全,可以在“目录安全性”选项卡上为网站进行“身份验证和访问控制”、“IP地址和域名限制”的设置,不过如果没有别的要求一般采用默认设置就可以了。

  二、IIS的备份和移植

  为了防止系统损坏对IIS配置的影响,我们可以采用选择本地计算机右键菜单中的“所有任务→备份/还原配置”来备份IIS,但这种操作如果遇到重装Web服务器或将一台Web服务器移植到另一台Web服务器时就无能为α耍 我们可以使用IIS备份精灵来实现IIS的备份和移植了。

  启动软件,在IIS备份精灵的站点列表上就会列出IIS服务器上配置的各种站点了,勾选你要备份的站点然后单击“导出站点”按钮,在弹出的“导出IIS站点”窗口上选择好文件保存路径,“确定”后,站点配置信息就会以一个TXT文本文件保存下来了。

  在重装IIS服务器需要导入站点信息时,运行IIS备份精灵,单击“导入站点”按钮在弹出的“IIS导入站点”窗口上选择要导入的事先备份好的IIS站点信息文件,“确定”后即可导入。若需要移植IIS站点信息应先把备份的站点信息文件复制到目的机器上,然后在这个机器上再下载安装IIS备份精灵,执行“导入站点”操作就可以了。

51各种形状和尺寸的Web服务器

Web服务器会对HTTP请求进行处理并提供响应。术语“Web服务器”可以用来表示Web服务器的软件,也可以用来表示提供Web页面的特定设备或计算机。

Web服务器有着不同的风格、形状和尺寸。有普通的10行Perl脚本的Web服务器、50MB的安全商用引擎以及极小的卡上服务器。但不管功能有何差异,所有的 Web服务器都能够接收请求资源的 HTTP请求,将内容回送给客户端(参见图1-5)。

511Web服务器的实现

Web服务器实现了HTTP和相关的TCP连接处理。负责管理Web服务器提供的资源,以及对Web服务器的配置、控制及扩展方面的管理。

Web服务器逻辑实现了HTTP 协议、管理着Web资源,并负责提供Web服务器的管理功能。Web服务器逻辑和操作系统共同负责管理TCP连接。底层操作系统负责管理底层计算机系统的硬件细节,并提供了TCP/IP网络支持、负责装载Web资源的文件系统以及控制当前计算活动的进程管理功能。

53实际的Web服务器会做些什么

例5-1显示的 Perl服务器是一个Web服务器的小例子。最先进的商用Web服务器要比它复杂得多,但它们确实执行了几项同样的任务,如图5-3所示。

(1)建立连接一—接受一个客户端连接,或者如果不希望与这个客户端建立连接,就

将其关闭。

(2)接收请求——从网络中读取一条HTTP请求报文。(3)处理请求——对请求报文进行解释,并采取行动。(4)访问资源-———访问报文中指定的资源。

(5)构建响应——创建带有正确首部的 HTTP响应报文。(6)发送响应——将响应回送给客户端。

(7)记录事务处理过程—-将与已完成事务有关的内容记录在一个日志文件中。

54第一步——接受客户端连接

如果客户端已经打开了一条到服务器的持久连接,可以使用那条连接来发送它的请求。否则,客户端需要打开一条新的到服务器的连接(回顾第4章,复习一下HTTP的连接管理技术)。

541处理新连接

客户端请求一条到Web服务器的TCP连接时,Web服务器会建立连接,判断连接的另一端是哪个客户端,从TCP连接中将IP地址解析出来。'一旦新连接建立起来

并被接受,服务器就会将新连接添加到其现存Web服务器连接列表中,做好监视连接上数据传输的准备。

Web服务器可以随意拒绝或立即关闭任意一条连接。有些Web服务器会因为客户端IP地址或主机名是未认证的,或者因为它是已知的恶意客户端而关闭连接。Web服务器也可以使用其他识别技术。

542客户端主机名识别

可以用“反向 DNS”对大部分Web服务器进行配置,以便将客户端IP地址转换成客户端主机名。Web服务器可以将客户端主机名用于详细的访问控制和日志记录。但要注意的是,主机名查找可能会花费很长时间,这样会降低Web事务处理的速度。很多大容量Web服务器要么会禁止主机名解析,要么只允许对特定内容进行解析。

可以用配置指令HostnameLookups启用Apache的主机查找功能。比如,例5-2中的Apache配置指令就只打开了HTML和CGI资源的主机名解析功能。

例5-2配置Apache,为 HTML和CGI资源查找主机名

HostnameLookups off

<Files ~" - 《html |htmlcgi)$">

HostnameLookups on

</Files>

55第二步—接收请求报文

连接上有数据到达时,Web服务器会从网络连接中读取数据,并将请求报文中的内容解析出来(参见图5-5)。

解析请求报文时,Web服务器会:

·解析请求行,查找请求方法、指定的资源标识符(URI)以及版本号,3各项之

间由一个空格分隔,并以一个回车换行(CRLF)序列作为行的结束,“

·读取以CRLF结尾的报文首部;

检测到以CRLF结尾的、标识首部结束的空行(如果有的话)﹔

·如果有的话(长度由content-Length首部指定),读取请求主体。

解析请求报文时,Web服务器会不定期地从网络上接收输入数据。网络连接可能随时都会出现延迟。Web服务器需要从网络中读取数据,将部分报文数据临时存储在内存中,直到收到足以进行解析的数据并理解其意义为止。

551 报文的内部表示法

有些Web服务器还会用便于进行报文操作的内部数据结构来存储请求报文。比如,数据结构中可能包含有指向请求报文中各个片段的指针及其长度,这样就可以将这些首部存放在一个快速查询表中,以便快速访问特定首部的具体值了(参见图5-6)。

552连接的输入/输出处理结构

高性能的 Web服务器能够同时支持数千条连接。这些连接使得服务器可以与世界各地的客户端进行通信,每个客户端都向服务器打开了一条或多条连接。某些连接可能在快速地向Web服务器发送请求,而其他一些连接则可能在慢慢发送,或者不经常发送请求,还有一些可能是空闲的,安静地等待着将来可能出现的动作。

因为请求可能会在任意时刻到达,所以Web服务器会不停地观察有无新的Web请求。不同的Web服务器结构会以不同的方式为请求服务,如图5-7所示。

·单线程Web服务器(参见图5-7a)

单线程的Web服务器一次只处理一个请求,直到其完成为止。一个事务处理结束之后,才去处理下一条连接。这种结构易于实现,但在处理过程中,所有其他连接都会被忽略。这样会造成严重的性能问题,只适用于低负荷的服务器,以及type-o-serve这样的诊断工具。

·多进程及多线程Web服务器(参见图5-7b)

多进程和多线程Web服务器用多个进程,或更高效的线程同时对请求进行处理。3可以根据需要创建,或者预先创建一些线程/进程。°有些服务器会为每条连接分配一个线程/进程,但当服务器同时要处理成百、上千,甚至数以万计的连接时,需要的进程或线程数量可能会消耗太多的内存或系统资源。因此,很多多线程Web服务器都会对线程/进程的最大数量进行限制。

·复用I/O的服务器(参见图5-7c)

为了支持大量的连接,很多Web服务器都采用了复用结构。在复用结构中,要同时监视所有连接上的活动。当连接的状态发生变化时(比如,有数据可用,或出现错误时),就对那条连接进行少量的处理,处理结束之后,将连接返回到开放连接列表中,等待下一次状态变化。只有在有事情可做时才会对连接进行处理,在空闲连接上等待的时候并不会绑定线程和进程。

·复用的多线程Web服务器(参见图5-7d)

有些系统会将多线程和复用功能结合在一起,以利用计算机平台上的多个CPU多个线程(通常是一个物理处理器)中的每一个都在观察打开的连接(或打开的连接中的一个子集),并对每条连接执行少量的任务。

56第三步———处理请求

一旦Web服务器收到了请求,就可以根据方法、资源、首部和可选的主体部分来对请求进行处理了。

有些方法(比如POST)要求请求报文中必须带有实体主体部分的数据。其他一些方法(比如OPTIONS)允许有请求的主体部分,也允许没有。少数方法(比如GET)禁止在请求报文中包含实体的主体数据。

这里我们并不对请求的具体处理方式进行讨论,因为本书其余大多数章节都在讨论这个问题。

57第四步——-对资源的映射及访问

Web 服务器是资源服务器。它们负责发送预先创建好的内容,比如HTML页面或JPEG ,以及运行在服务器上的资源生成程序所产生的动态内容。

571 docroot

Web服务器支持各种不同类型的资源映射,但最简单的资源映射形式就是用请求URI作为名字来访问Web服务器文件系统中的文件。通常,Web服务器的文件系统中会有一个特殊的文件夹专门用于存放Web内容。这个文件夹被称为文档的根目录(document root,或docroot)。Web服务器从请求报文中获取URI,并将其附加在文档根目录的后面。

在图5-8中,有一条对/specials/saw-bladegif 的请求到达。这个例子中Web服务器的文档根目录为/us/local/httpd/files。Web服务器会返回文件/usr/local/httpd/files/specials/saw-bladegif。

在配置文件httpdconf中添加一个 DocumentRoot行就可以为Apache Web服务器设置文档的根目录了:

DocumentRoot /usr/ local/httpd/files

服务器要注意,不能让相对URL退到docroot之外,将文件系统的其余部分暴露出来。比如,大多数成熟的Web服务器都不允许这样的URI看到Joe的五金商店文档根目录上一级的文件:

http://wwwjoes-hardwarecom/

583重定向

Web服务器有时会返回重定向响应而不是成功的报文。Web服务器可以将浏览器重定向到其他地方来执行请求。重定向响应由返回码3XX说明。Location响应首部包含了内容的新地址或优选地址的URI。重定向可用于下列情况。

·永久删除的资源

资源可能已经被移动到了新的位置,或者被重新命名,有了一个新的URL。Web服务器可以告诉客户端资源已经被重命名了,这样客户端就可以在从新地址获取资源之前,更新书签之类的信息了。状态码301 Moved Permanently就用于此类重定向。·临时删除的资源

如果资源被临时移走或重命名了,服务器可能希望将客户端重定向到新的位置上去。但由于重命名是临时的,所以服务器希望客户端将来还可以回头去使用老的URL,不要对书签进行更新。状态码303 See Other以及状态码307 TemporaryRedirect就用于此类重定向。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 怎么实现一个网站的WebServer(下)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情