怎么实现一个网站的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的全部解答。

网站一个网站

可以参考如下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

创建一个 WEB 服务器

NetBox 的一大功能就是内置支持了 HttpServer 和 asp。下面就按步骤建立一个以服务方式运行的 WEB 服务器。

第一步:创建 WEB 服务器

由于 NetBox 提供了 HttpServer 对象,所以建立一个新的 HttpServer 并且启动、停止、退出,自然便是由 HttpServer 对象来实现,mainbox 的代码也就比较简单了:

Set Console = ShellConsole

Set httpd = CreateObject("NetBoxHttpServer")

If httpdCreate("", 80) = 0 Then

httpdStart

ConsoleReadLine

httpdStop

httpdClose

End If

Set httpd = Nothing

在上面的代码中,先创建一个新的 HttpServer,然后在所有的本机地址的 80 端口创建一个服务器,如果创建成功,则启动服务器,等待用户在控制台上输入回车后停止并关闭服务器。

运行这个程序,如果当前系统中未安装其他 Web 服务器,则此程序会显示控制台并等待回车,否则将直接退出。呵,我们的第一个程序都是很拙劣的。没有关系,我们一步一步来。

如果成功运行了程序,便可以用浏览器访问了,由于服务器装在本机,所以打开浏览器,在地址栏输入“http://localhost/”,哈,结果出来了,不过很不好看:

418 Host Not Found

不管想访问什么,都只会是这个结果。这样的结果显然不能满足要求,所以我们需要改进我们的 Web 服务器。

第二步:添加虚拟主机

前面我们建立的服务器之所以总是返回禁止访问,原因是没有为服务器建立主机信息。所以我们修改代码,使用 AddHost 方法增加主机信息的部分:

Set Console = ShellConsole

Set httpd = CreateObject("NetBoxHttpServer")

If httpdCreate("", 80) = 0 Then

httpdAddHost "", "\wwwroot"

httpdStart

ConsoleReadLine

httpdStop

httpdClose

End If

Set httpd = Nothing

在 NetBox 执行目录建立一个子目录 wwwroot,然后复制一些网页进去。我们再来看看效果如何。执行程序并再次访问“http://localhost/”,结果居然还是“403 Forbidden”。再访问 wwwroot 目录中已有的文件,哈哈,出现正确内容了。所以,实际上主机已经建立出来,但是未给主机提供缺省文件名。

第三步:添加缺省文件

为了让主机知道当用户访问目录时向用户返回的文件,需要使用 AddDefault 方法为主机添加缺省文件名,修改代码如下:

Set Console = ShellConsole

Set httpd = CreateObject("NetBoxHttpServer")

If httpdCreate("", 80) = 0 Then

Set host = httpdAddHost("", "\wwwroot")

hostAddDefault "defaulthtm"

httpdStart

ConsoleReadLine

httpdStop

httpdClose

End If

Set httpd = Nothing

我们再访问“http://localhost/”的时候,会发现不再显示禁止访问,而是开始出现了缺省页面的内容。如果给定的缺省文件不存在,则返回“404 File Not Found”。

第四步:支持服务器脚本

上面的步骤建立出来的 Web 服务器,是一个纯静态文件的服务器,是无法执行服务器脚本程序的,为了让我们的 Web 服务器能够理解服务器端脚本程序,需要修改 EnableScript 属性,同时为了让服务器能够使用脚本程序做为缺省文件,还需要再添加一个缺省文件,下面是新修改的代码:

Set Console = ShellConsole

Set httpd = CreateObject("NetBoxHttpServer")

If httpdCreate("", 80) = 0 Then

Set host = httpdAddHost("", "\wwwroot")

hostEnableScript = true

hostAddDefault "defaultasp"

hostAddDefault "defaulthtm"

httpdStart

ConsoleReadLine

httpdStop

httpdClose

End If

Set httpd = Nothing

接下来,我们就可以在 wwwroot 目录里建立我们的 asp 脚本程序了,建立 testasp:

<%ResponseWrite "Hello"%>

NetBox 也支持服务器 box 程序,在 wwwroot 目录中建立 testbox:

ResponseWrite "Hello"

第五步:以服务方式运行

到目前为止,已经有一个相对完整的 Web 服务器程序了,下面我们需要将这个服务器改写为系统服务程序,可以将其安装成为一个系统服务,更加便于运行维护。改写成为服务程序需要使用 Service 对象。

下面便是一个完整的 Web 服务程序的代码,关于 Service 对象的更多信息请参阅手册相关内容。

Dim httpd

ShellServiceRunService "NBWeb", "NetBox Web Server", "NetBox Http Server Sample"

---- Service Event ---

Sub OnServiceStart()

Set httpd = CreateObject("NetBoxHttpServer")

If httpdCreate("", 80) = 0 Then

Set host = httpdAddHost("", "\wwwroot")

hostEnableScript = true

hostAddDefault "defaultasp"

hostAddDefault "defaulthtm"

httpdStart

else

ShellQuit 0

end if

End Sub

Sub OnServiceStop()

httpdClose

End Sub

Sub OnServicePause()

httpdStop

End Sub

Sub OnServiceResume()

httpdStart

End Sub

总结

实现一个完整的 Web 服务程序,需要 HttpServer,HttpServerHost,Service 三个对象的支持,HttpServer 负责建立服务器并控制服务器的运行状态,HttpServerHost 负责建立主机信息, Service 则负责完成与服务程序相关的操作。

这篇实用文章介绍如何将pfSense 20配置成你那些Web服务器的负载均衡器。这篇实用文章假设你已经安装了一个pfSense设备和至少两台Apache服务器,并且运行在你的网络上;还假设你具备了pfSense方面的一些知识。

要求

一台设备用于安装pfSense 20(如果这是你的边缘防火墙,我会建议物理机器)。

至少两台Apache2服务器(这些可以是虚拟服务器)。

对Apache服务器进行了配置,以便以某种方式同步Web文件(rsync/corosync或通过Web服务器维持文件版本最新的另一个选项)。

配置pfSense

pfSense使用负载均衡器,将某些类型的流量带来的负载分摊到多台服务器上;如果你有多台服务器用于托管运行应用程序,这很好;你可以将负载分摊到所有服务器上,而不是把负载全扔给一台服务器、导致不堪重负。

可以入手了,先点击“Services”(服务),然后点击“Load Balancers”(负载均衡器),然后点击“Monitor”(监视器)选项卡。

要添加一个新条目,点击“Plus”(添加)按钮,指定“Name”(名称)和“Description”(描述,在这个示例中,我会使用ApacheClusterMon作为名称和描述),将类型设成“HTTP”,然后为“Host”(主机)设置一个未使用的IP地址(我们随后会创建虚拟服务器的IP,以便分配给故障切换服务器组),任由“HTTP Code”(HTTP代码)设成“200 OK”。需要的话,然后点击“Save”(保存),使更改生效。

现在我们要创建服务器池。点击“Pools”(服务器池)选项卡,点击“Plus”(添加)按钮,即可添加新的服务器池。

指定一个名称(ApacheSrvPool将用在我的示例中)。将“Mode”(模式)设成“Load Balance”(负载均衡),然后将“Port”(端口)设成“80”(你可以让pfSense对其他端口上的其他应用程序实现负载均衡),将“Monitor”(监视器)设成你之前创建的监视器配置,并且指定你希望在服务器池中的所有Web服务器的IP地址,需要的话,点击“Save”(保存),使更改生效。

接下来点击“Virtual Servers”(虚拟服务器)选项卡,点击“Plus”(添加)按钮,添加一个新条目。指定“Name”(名称)和“Description”(描述),然后用你之前选择的未使用IP地址来设置“IP Address”(IP地址),将“Port”(端口)设成“80”,然后将“Virtual Server Pool”(虚拟服务器池)设成你之前创建的服务器池,点击“Submit”(提交),使更改生效。

就这样,你刚配置好了pfSense,对你的Web服务器之间的网络流量实现负载均衡。

顺便提一下,如果任何一台服务器没有给出200 OK状态这样的回应(pfSense定期向你的Web服务器发送请求,以确定它们是否正常运行),服务器池就会处于离线停运状态。要避免出现停运,最好的办法就是配置故障切换系统(下一篇文章会有介绍)。

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

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情