本篇文章给大家谈谈部署httpd服务源代码,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、如何开发自己的httpserver-nanohttpd源码解读
- 2、linux下采用源代码安装apache,具体步骤怎么操作?
- 3、怎么配置apache啊,用的阿里云的服务器想做个自己的博客,用的是一键部署web环境安装的
- 4、如何在Linux下搭建apache服务器
如何开发自己的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服务源代码和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
2、本站永久网址:https://www.yuanmacun.com
3、本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
4、本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
6、本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
源码村资源网 » 包含部署httpd服务源代码的词条