包含部署httpd服务源代码的词条

本篇文章给大家谈谈部署httpd服务源代码,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

如何开发自己的httpserver-nanohttpd源码解读

现在作为一个开发人员,http server相关的内容已经是无论如何都要了解的知识了。用curl发一个请求,配置一下apache,部署一个web server对我们来说都不是很难,但要想搞清楚这些背后都发生了什么技术细节还真不是很简单的。所以新的系列将是分享我学习Http Server的过程。

NanoHttpd是Github上的一个开源项目,号称只用一个java文件就能创建一个http server,我将通过分析NanoHttpd的源码解析如何开发自己的HttpServer。Github 地址:

在开始前首先简单说明HttpServer的基本要素:

1.能接受HttpRequest并返回HttpResponse

2.满足一个Server的基本特征,能够长时间运行

关于Http协议一般HttpServer都会声明支持Http协议的哪些特性,nanohttpd作为一个轻量级的httpserver只实现了最简单、最常用的功能,不过我们依然可以从中学习很多。

首先看下NanoHttpd类的start函数

[java] view plaincopy

public void start() throws IOException {

myServerSocket = new ServerSocket();

myServerSocket.bind((hostname != null) ? new InetSocketAddress(hostname, myPort) : new InetSocketAddress(myPort));

myThread = new Thread(new Runnable() {

@Override

public void run() {

do {

try {

final Socket finalAccept = myServerSocket.accept();

registerConnection(finalAccept);

finalAccept.setSoTimeout(SOCKET_READ_TIMEOUT);

final InputStream inputStream = finalAccept.getInputStream();

asyncRunner.exec(new Runnable() {

@Override

public void run() {

OutputStream outputStream = null;

try {

outputStream = finalAccept.getOutputStream();

TempFileManager tempFileManager = tempFileManagerFactory.create();

HTTPSession session = new HTTPSession(tempFileManager, inputStream, outputStream, finalAccept.getInetAddress());

while (!finalAccept.isClosed()) {

session.execute();

}

} catch (Exception e) {

// When the socket is closed by the client, we throw our own SocketException

// to break the "keep alive" loop above.

if (!(e instanceof SocketException "NanoHttpd Shutdown".equals(e.getMessage()))) {

e.printStackTrace();

}

} finally {

safeClose(outputStream);

safeClose(inputStream);

safeClose(finalAccept);

unRegisterConnection(finalAccept);

}

}

});

} catch (IOException e) {

}

} while (!myServerSocket.isClosed());

}

});

myThread.setDaemon(true);

myThread.setName("NanoHttpd Main Listener");

myThread.start();

}

1.创建ServerSocket,bind制定端口

2.创建主线程,主线程负责和client建立连接

3.建立连接后会生成一个runnable对象放入asyncRunner中,asyncRunner.exec会创建一个线程来处理新生成的连接。

4.新线程首先创建了一个HttpSession,然后while(true)的执行httpSession.exec。

这里介绍下HttpSession的概念,HttpSession是java里Session概念的实现,简单来说一个Session就是一次httpClient-httpServer的连接,当连接close后session就结束了,如果没结束则session会一直存在。这点从这里的代码也能看到:如果socket不close或者exec没有抛出异常(异常有可能是client段断开连接)session会一直执行exec方法。

一个HttpSession中存储了一次网络连接中server应该保存的信息,比如:URI,METHOD,PARAMS,HEADERS,COOKIES等。

5.这里accept一个client的socket就创建一个独立线程的server模型是ThreadServer模型,特点是一个connection就会创建一个thread,是比较简单、常见的socket server实现。缺点是在同时处理大量连接时线程切换需要消耗大量的资源,如果有兴趣可以了解更加高效的NIO实现方式。

当获得client的socket后自然要开始处理client发送的httprequest。

Http Request Header的parse:

[plain] view plaincopy

// Read the first 8192 bytes.

// The full header should fit in here.

// Apache's default header limit is 8KB.

// Do NOT assume that a single read will get the entire header at once!

byte[] buf = new byte[BUFSIZE];

splitbyte = 0;

rlen = 0;

{

int read = -1;

try {

read = inputStream.read(buf, 0, BUFSIZE);

} catch (Exception e) {

safeClose(inputStream);

safeClose(outputStream);

throw new SocketException("NanoHttpd Shutdown");

}

if (read == -1) {

// socket was been closed

safeClose(inputStream);

safeClose(outputStream);

throw new SocketException("NanoHttpd Shutdown");

}

while (read 0) {

rlen += read;

splitbyte = findHeaderEnd(buf, rlen);

if (splitbyte 0)

break;

read = inputStream.read(buf, rlen, BUFSIZE - rlen);

}

}

1.读取socket数据流的前8192个字节,因为http协议中头部最长为8192

2.通过findHeaderEnd函数找到header数据的截止位置,并把位置保存到splitbyte内。

[java] view plaincopy

if (splitbyte rlen) {

inputStream.unread(buf, splitbyte, rlen - splitbyte);

}

parms = new HashMapString, String();

if(null == headers) {

headers = new HashMapString, String();

}

1.http协议规定header和body之间使用两个回车换行分割

1.Http协议第一行是Method URI HTTP_VERSION

2.后面每行都是KEY:VALUE格式的header

3.uri需要经过URIDecode处理后才能使用

4.uri中如果包含?则表示有param,httprequest的param一般表现为:/index.jsp?username=xiaomingid=2

下面是处理cookie,不过这里cookie的实现较为简单,所以跳过。之后是serve方法,serve方法提供了用户自己实现httpserver具体逻辑的很好接口。在NanoHttpd中的serve方法实现了一个默认的简单处理功能。

[java] view plaincopy

发送response的步骤如下:

1.设置mimeType和Time等内容。

2.创建一个PrintWriter,按照HTTP协议依次开始写入内容

3.第一行是HTTP的返回码

4.然后是content-Type

5.然后是Date时间

6.之后是其他的HTTP Header

7.设置Keep-Alive的Header,Keep-Alive是Http1.1的新特性,作用是让客户端和服务器端之间保持一个长链接。

8.如果客户端指定了ChunkedEncoding则分块发送response,Chunked Encoding是Http1.1的又一新特性。一般在response的body比较大的时候使用,server端会首先发送response的HEADER,然后分块发送response的body,每个分块都由chunk length\r\n和chunk data\r\n组成,最后由一个0\r\n结束。

9.如果没指定ChunkedEncoding则需要指定Content-Length来让客户端指定response的body的size,然后再一直写body直到写完为止。

linux下采用源代码安装apache,具体步骤怎么操作?

解压:tar zxvf httpd-xxxx.tar.gz

cd httpd-xxxx

配置:./configure

编译:make

安装:make install

怎么配置apache啊,用的阿里云的服务器想做个自己的博客,用的是一键部署web环境安装的

天互数据 为您解答,满意请采纳

Apache是开放源代码的Web服务器软件,是最常用的Web服务器。Apache常用在unix系统,也有windows平台的版本。本文以windows平台为例,介绍使用动态域名安装配置Apache建设网站的方法。

(一)申请安装动态域名解析——每步

一、申请帐号

1、打开

2、点击上面的用户注册

3、按照提示输入注册信息

如图:

前面带*号的是必须要填的,提示注册成功即可。

二、下载客户端软件

可到下载相应版本。

外网IP地址就在服务器上的用户选择2008版本。

三、安装

下载完后,运行安装文件,按照提示安装完成即可。

四、使用(这里以2008版本为例,其它版本也一样设置)

1、运行桌面上的“ddns2008”图标

2、运行后将在系统托盘上看到动态域名解析2008版的图标。

3、双击图标,弹出设置对话框,输入你刚才申请的域名abc.meibu.com和密码。

客户端提示“登陆成功”后,则可在开始运行里输入“ping abc.meibu.com”,Ping命令反馈的IP地址应该与使用Winipcfg所查看到的系统主

机当前IP地址一致。如果确认两者相同,则表明每步的动态域名解析已经处在正常运行状态下。

(二) 安装 Apache

一. 下载

windows平台的Apache可以在这个网址下载:

二. 安装

运行下载的Apache文件,即可开始安装。Apache的安装过程很简单。只需要设置下面这个窗口:

在“Network Domain”里输入域。如果用本站的二级域名,例如“abc.meibu.com”,请输入“meibu.com”。如果用顶级域名,请输入

“xxx.com”。

在“Server Name”里输入服务器名。如果用本站的二级域名,请输入您的域名“abc.meibu.com”。如果用顶级域名,请输入“”

在“Administrator's Email Address”里输入网站管理员的Email地址。

除此之外,安装过程里所有的选项,全部用默认选项就可以了。

三、运行

Win 9x

Apache安装后,会在“开始”-“程序”里增加一个“Apache HTTP Server”的组。进入该组,选择“Control Apache Server”-“Start”

即可启动Apache。

Win NT/2000/XP/2003

在这些系统里,用默认选项安装的Apache,除了在“开始”-“程序”里增加一个“Apache HTTP Server”的组之外,还会在系统的服务里增加

一个Apache服务.该服务被设置为系统启动时自动运行。

四、配置 Apache

1、配置文件

Apache是一个后台运行的程序,没有界面。所有的配置,都包含在配置文件里。主配置文件是:

C:\Program Files\Apache Group\Apache\conf\httpd.conf

如果要修改Apache的配置,可以用任何一个文本编辑工具(例如记事本)编辑这个配置文件。在配置文件里,以“#”开头的行是注释行。

2、配置选项

在配置文件里的主要选项如下:

#Listen 3000

#Listen 12.34.56.78:80

Apache的IP地址和端口。一般来说不需要设置,Apache会绑定在本机所有IP地址的80端口上。

Port 80

Apache的端口。默认值是80。

ServerName abc.meibu.com

Web服务器的名字。安装时输入的“Server Name”就是保存在这里。

DocumentRoot "C:/Program Files/Apache Group/Apache/htdocs"

这是网站的根目录。如果您想把网站文件存放在“D:\myweb”目录下,可以把DocumentRoot后面的目录修改为“D:/myweb”。

Options Indexes FollowSymLinks MultiViews

为了安全起见,请把上面的“Indexes”删掉。否则别人可以浏览到您网站里的所有文件。

DirectoryIndex index.html

默认首页文件名。在浏览器里输入一个地址(例如http:// abc.meibu.com/)的时候,Apache会查找这个默认的首页文件打开。如果要配置多

个默认首页文件名,请用空格分开。

ScriptAlias /cgi-bin/ "C:/Program Files/Apache Group/Apache/cgi-bin/"

CGI文件存放路径。

五、高级配置

1、设置虚拟目录

在配置文件中找下面这行:

IfModule mod_alias.c

在这行下面添加如下内容:

Alias /vdir/ "c:/comexe/"

Directory "c:/comexe/"

Options MultiViews

AllowOverride None

Order allow,deny

Allow from all

/Directory

这样,通过访问 http:// abc.meibu.com/vdir/,就可以访问到c:\comexe\目录下的内容。

Apache默认开设了两个虚拟目录:“/icons/”和“/manual/”。这两个虚拟目录没有用,可以在配置文件中删除。

六、常见问题

1、如何解决中文网页显示乱码

在配置文件中找包含“Addlanguage”或“AddCharset”的行,在这些行最前面增加一行:

AddDefaultCharset GB2312

养成良好的习惯,在每个网页的head/head里加入这行:

meta http-equiv="Content-Type" content="text/html; charset=gb2312"

一般的中文版网页编辑工具(例如FrontPage、Dreamweaver等)都会自动加上这行。

2、如何解决中文文件名无法访问

在ie中选择 工具 - internet选项 - 高级 - 取消“总是以UTF-8发送URL”。

这个方法很麻烦,请尽量不要使用中文的网站文件名。

3. 在winxp sp2下安装的apache+php5+mysql5,其他电脑无法正常访问我们的网站!出现如下错误:

Forbidden

You don't have permission to access / on this server.

这个错误的原因是,用户没有权限访问你的网站目录。

解决办法:

打开的apache的配置文件:httpd.conf

在末尾添加如下代码:yourpath你的网站目录

Directory "d:/yourpath/"

Allow from all

/Directory

保存之后,记得重启apache服务,问题就解决了。

请注意:

1.Apache配置过程中最关键的两点是:网站根目录和默认首页文件名。必须要把网站文件放在所指定的网站根目录下,而且默认首页文件名必

须要设置正确,否则将看不到您的网页。

2.每次配置文件更改后,要重新启动Apache才会生效。

如何在Linux下搭建apache服务器

一:准备工作在安装httpd之前必须要配置好DNS服务二Httpd安装Apache的主要步骤如下:1. 解包tar zxvf httpd-2.2.9.tar.gz -C /usr/src/

2. 编译前的配置cd /usr/src/httpd-2.2.9./configure --prefix=/usr/local/apache2 --enable-so --enable-rewrite这一步是根据你的特定平台和个人需求配置源代码树。位于发行源代码根目录的configure脚本会完成这个步骤(对下载Apache CVS版源代码的开发者,需要装有autoconf和libtool ,并需要执行buildconf ,对于官方的发行版则没这个必要)。 要想用所有的默认值配置源代码树只要简单的执行 ./configure 命令就可以了,同时configure还可以接受命令行参数以改变默认值。 最重要的选项是Apache安装目录的前缀:--prefix ,因为Apache需要知道这个目录才能正常运作。更多的微调选项请参考配置选项详解。 这样,你就可以通过在配置选项中指定要启用或禁用哪些模块来定制Apache的特性。Base组的模块默认包含在Apache中。其他组的模块可以通过 --enable-module 指令启用。其中module是模块名去掉"mod_"并将下划线转换成连字符后的字符串。你也可以使用 --enable-module=shared 指令将模块编译为可在运行时加载和卸载的动态共享对象(DSO)。同样的,你也可以使用 --disable-module 指令禁用Base组的模块。注意,使用这些指令的时候configure不会对你拼写错误的模块发出警告说找不到某某模块,而只是简单的忽略这个选项。 另外,有时候还必须提供给configure脚本关于编译器、库、头文件位置的更多信息。这些可以通过环境变量或者命令行选项传递给configure脚本。要了解更多信息,请参考配置源代码树。 为了让你对能指定什么有一个简单的印象,此例演示编译Apache ,并将其安装在/sw/pkg/apache目录,指定了一个特定的编译器以及编译参数,而且允许今后将两个附加的模块mod_rewrite和mod_speling通过DSO机制在运行时动态加载: $ CC="pgcc" CFLAGS="-O2" \./configure --prefix=/sw/pkg/apache \--enable-rewrite=shared \--enable-speling=shared configure需要运行几分钟,以测试指定的功能在你的系统中是否有效,并建立稍后编译时所需的许多Makefile文件。 3. 编译并安装make make install

关于部署httpd服务源代码和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

1、本网站名称:源码村资源网
2、本站永久网址:https://www.yuanmacun.com
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
源码村资源网 » 包含部署httpd服务源代码的词条
您需要 登录账户 后才能发表评论

发表评论

欢迎 访客 发表评论