Linux运维学习笔记之十二:http协议和www服务

来源:互联网 发布:js display none 显示 编辑:程序博客网 时间:2024/06/05 19:17

第二十一章 http协议和www服务

一、http协议和www服务基础

1、HTTP协议简介

HTTP协议,全称为HyperText Transfer Protocol,中文名为超文本传输协议,是互联网中最常用的一种网络协议。 HTTP的重要应用之一是WWW服务。设计HTTP协议最初的目的就是提供一种发布和接收HTML(一种页面标记语言)页面的方法。HTTP协议是互联网上常用的通信协议之一。它有很多的应用,但最流行的就是用于Web浏览器和Web服务器之间的通信,即WWW应用或称Web应用。

2、WWW服务简介

www服务全称为World Wide Web,常称为Web,中文译为“万维网”。它是目前互联网上最受用户欢迎的信息服务形式。HTTP协议的WWW服务应用的默认端口为80,另外一个加密的WWW服务应用https的默认端口为443,主要用于网银、支付等和钱相关的业务。当今,HTTP服务、WWW服务、Web服务三者的概念已经混淆了,在本文中也视为相同,都是指当下最常见的网站服务应用。

3、用户访问网站流程
(1)第一步:

客户端用户在浏览器中输入www.baidu.com网站地址回车后,系统首先会查找系统本地的DNS缓存及hosts文件信息,确认是否存在www.baidu.com对应的域名ip解析记录如果有就直接获取IP地址,然后去访问这个IP地址对应域名www.baidu.com的服务器。一般第一次请求时,DNS缓存是没有解析记录的,而hosts文件多在内部临时测试使用。

(2)第二步:

如果客户端本地DNS缓存及hosts文件没有www.baidu.com域名对应的解析记录,那么,系统会把浏览器的解析请求发送给客户端本地设置的DNS服务器地址(通常称此DNS为LDNS,即local DNS)解析,如果LDNS服务器的本地缓存有对应的解析记录就会直接返回IP地址给客户端,如果没有,则LDNS会负责继续请求其他的DNS服务器。

(3)第三步:

LDNS从DNS系统的(.)根开始请求对www.baidu.com域名的解析,并针对各个层级的DNS服务器系统进行一系列的查找,最终会查找到baidu.com域名对应的授权DNS服务器,而这个授权DNS服务器正是企业购买域名时用于管理域名解析的服务器,这个授权服务器会有www.baidu.com对应的IP解析记录。如果此时没有,就表示企业的域名管理人员没有为www.baidu.com域名做解析设置,即网站还没有架设好。

(4)第四步:

baidu.com域名的授权DNS服务器会把www.baidu.com最终IP解析记录(例如1.1.1.1)发给LDNS

(5)第五步:

LDNS把来之授权DNS服务器www.baidu.com对应的IP解析记录发给客户端浏览器,并且他会把该域名和IP对应的解析缓存起来,以便下一次更快的返回相同的解析请求的记录。这些缓存在指定的时间(DNS TTL 值控制)内不会过期。

(6)第六步:

客户端浏览器获取了www.baidu.com的对应IP地址,接下来,浏览器会请求IP地址对应的网站服务器,网站服务器收到客户的请求并响应处理(此处的处理可能是数百台集群的服务器系统,也可能是一台云主机)将客户请求的内容返回给客户端浏览器。至此,一次访问浏览器的完整过程就完成了。

(7)提示:

上述仅仅是客户端用户第一次访问网站的基本过程,连续访问后,系统本地和LDNS层级都会有缓存记录,再访问时流程就会有些变化,会直接取本地缓存记录,这样访问过程就很快了。

4、HTTP协议请求的工作流程

(1)终端客户在Web浏览器地址栏输入访问地址http://www.etiantian.org/index.html。

(2)Web浏览器请求DNS服务器把域名www.etiantian.org转换成Web服务器的IP地址,此处的解析过程就是DNS解析的原理流程,前面已经讲过了,此处不再赘述。

(3)Web浏览器将端口号(默认是80)从访问地址(URL)中解析出来。

(4)Web浏览器通过解析后的IP地址及端口号与Web服务器之间建立一条TCP连接。

(5)建立TCP连接后,Web浏览器向Web服务器发送一条HTTP请求报文。请求报文

(6)Web服务器读取并响应浏览器的请求信息,然后返回一条HTTP响应报文。响应报文除了有html页面外,还包括对象、对象类型、对象长度等header信息

(7)Web服务器关闭HTTP连接,关闭TCP连接,Web浏览器显示访问的网站内容到屏幕上。

5、HTTP客户端

最常见的是Web浏览器:IE、Firefox、Chrome等

6、HTTP报文格式
(1)HTTP 请求报文

HTTP 请求报文由请求行、请求头部、空行 和 请求包体 4 个部分组成,如下图所示:

a、请求行

请求行由方法字段、URL 字段 和HTTP 协议版本字段 3 个部分组成,他们之间使用空格隔开。常用的 HTTP 请求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;

(i)GET

当客户端要从服务器中读取某个资源时,使用GET 方法。GET 方法要求服务器将URL 定位的资源放在响应报文的数据部分,回送给客户端,即向服务器请求某个资源。使用GET方法时,请求参数和对应的值附加在URL 后面,利用一个问号(“?”)代表URL 的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100&op=bind。

(ii)POST

当客户端给服务器提供信息较多时可以使用POST 方法,POST 方法向服务器提交数据,比如完成表单数据的提交,将数据提交给服务器处理。GET 一般用于获取/查询资源信息,POST 会附带用户数据,一般用于更新资源信息。POST 方法

b、请求头部Header(HTTP request header )

将请求参数封装在HTTP 请求数据中,以名称/值的形式出现,可以传输大量数据;

请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头Header(HTTP request header ) 有:

  User-Agent:产生请求的浏览器类型;

  Accept:客户端可接受的响应内容类型列表;星号 “ * ” 用于按范围将类型分组,用“ */* ”指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型;

  Accept-Language:客户端可接受的自然语言;如gzip,deflate 

  Accept-Encoding:客户端可接受的编码压缩格式;

  Accept-Charset:可接受的应答的字符集;

  Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机;

  connection:连接方式(close 或 keepalive);

   Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie;

c、空行

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头;

d、请求包体

请求包体不在 GET 方法中使用,而是在POST 方法中使用。POST 方法适用于需要客户填写表单的场合。与请求包体相关的最常使用的是包体类型Content-Type 和包体长度Content-Length;

(2)HTTP 响应报文

HTTP 响应报文由状态行、响应头部、空行 和 响应包体 4 个部分组成,如下图所示:

 

a、状态行:

状态行由 HTTP 协议版本字段、状态码和状态码的描述文本 3 个部分组成,他们之间使用空格隔开;

(i)状态码

 状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码有五大类如下所示:

  1xx:表示服务器已接收了客户端请求,客户端可继续发送请求;

  2xx:表示服务器已成功接收到请求并进行处理;

  3xx:表示服务器要求客户端重定向;

  4xx:表示客户端的请求有非法内容;

  5xx:表示服务器未能正常处理客户端的请求而出现意外错误;

(ii)状态码描述文本取值

  200 OK:表示客户端请求成功;

  301 MovedPermanently:表示请求的网页永久跳转的新位置

  400 Bad Request:表示客户端请求有语法错误,不能被服务器所理解;

  401 Unauthonzed:表示请求未经授权,该状态代码必须与 WWW-Authenticate 报头域一起使用;

  403 Forbidden:表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因;

  404 Not Found:请求的资源不存在,例如,输入了错误的URL;

  500 InternalServer Error:表示服务器发生不可预期的错误,导致无法完成客户端的请求;

  502 Bad Gateway:一般是网关服务器请求服务器时,后端服务器没有按http协议正确返回结果;

  503 ServiceUnavailable:表示服务器当前不能够处理客户端请求,一段时间之后,服务器可能会恢复正常;

  504 GatewayTimeout:网关操时;

b、响应头部Header(response header) 

  Location:Location响应报头域用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回Location响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源;

  Server:Server 响应报头域包含了服务器用来处理请求的软件信息及其版本。它和 User-Agent 请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户端软件(浏览器)和操作系统的信息。如Apache/2.2.6 

  Vary:指示不可缓存的请求头列表;

  Connection:连接方式;

  对于请求来说:close(告诉 WEB 服务器或者代理服务器,在完成本次请求的响应后,断开连接,不等待本次连接的后续请求了)。keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求);

  对于响应来说:close(连接已经关闭); keepalive(连接保持着,在等待本次连接的后续请求); Keep-Alive:如果浏览器请求保持连接,则该头部表明希望WEB 服务器保持连接多长时间(秒);例如:Keep-Alive:300;

WWW-Authenticate:WWW-Authenticate响应报头域必须被包含在401 (未授权的)响应消息中,这个报头域和前面讲到的Authorization 请求报头域是相关的,当客户端收到 401 响应消息,就要决定是否请求服务器对其进行验证。如果要求服务器对其进行验证,就可以发送一个包含了Authorization 报头域的请求;
  Date 服务器端时间 
  Etag 文件标识符 
  Content-Encoding传送启用了GZIP压缩 gzip 
  Content-Length 内容长度 
  Content-Type 内容类型

c、空行

最后一个响应头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有响应头部。

d、响应包体

服务器返回给客户端的文本信息;

(3)示例

a、下载网页

wget www.baidu.com

b、查看网页代码

curl www.baidu.com

c、获取网页响应报文头

curl -I www.baidu.com

HTTP/1.1 200 OK

Server: bfe/1.0.8.18

Date: Mon, 27 Feb 2017 14:41:56 GMT

Content-Type: text/html

Content-Length: 277

Last-Modified: Mon, 13 Jun 2016 02:50:33 GMT

Connection: Keep-Alive

ETag: "575e1f79-115"

Cache-Control: private, no-cache, no-store, proxy-revalidate,no-transform

Pragma: no-cache

Accept-Ranges: bytes

7、网页分类及特点
(1)静态网页

a、每个静态网页都有一个因定的URL,且URL一般以html、htm、shtml等常见后缀,而且地址中不含"?"或"&"。

b、静态网页一经发布,是实实在在保存在服务器上的文件,每个静态网页对应一个独立的文件。

c、静态网页的内容相对稳定,容易补充搜索引擎收录。

d、静态网页没有数据库支持,在制作和维护方面工作量较大,当网站信息量很大时,完全依靠静态网页制作方式比较困难。

e、静态网页的交互性较差,在功能方面有很大限制。

f、静态网页是在客户端解析,效率高。并且服务器不进行解析,直接返回数据,所以可以接受更多的并发访问。

(2)动态网页

a、程序在服务端解析,一般以数据库为基础,可以大量的和用户交互

b、URL地址后缀一般为jsp、asp、aspx、do、cgi、php、perl等,并常伴随"?"或"&"。

c、架构设计要优化好(系统架构师和程序架构师的职责)。动态网页的效率很差,并发也很低,静态:动态比一般在10:1,所以尽可能的转换成静态网页提供服务。

(3)伪静态网页

a、将动态网页伪装成静态网页

b、目的是便于搜索引擎招录,提升用户访问量及用户体验

c、由于仅仅是伪装,实际上还是动态,性能没有提升,但因转换而消耗资源,因此性能反而下降

d、尽可能转换成真正的静态页面,除非并发量不是很大。可以用rewrite实现伪静态,rewrite是一个模块,一般web服务器都支持

8、WEB架构优化方案

由于静态程序在客户端解析,大大降低了服务器端的压力,因此解析效率更高。在实际高并发网站架构中,可以考虑把用户请求的数据解析后存成静态文件放于磁盘中或放于内存中。来降低动态服务器的压力,从而提升用户体验。

高并发网站架构从动态转静态不用业务产品实现的例子:

(1)门户新闻业务(一旦发布完成,几乎不会改动)

对于新闻业务静态化相对比较简单,在发布新闻时就可以生成静态文件,然后把静态内容同步到所有服务器节点上,提供访问。

(2)视频网站业务(一旦发布完成,几乎不会改动)

用户上传视频后,需经历审核、转码的过程,大概1-2小时,审核-转码-推送(同步到全国所有CDN节点)。

(3)blog/bbs/sns/微博社区业务/电商(淘宝、京东等)(用户发布后,可能会随时更新)

一般使异步、消息中间件、消息队列

见参考博文11:浅谈千万级PV/IP规模高性能高并发网站架构。

9、PV、IP和UV
(1)IP(独立IP数)

IP可以理解为独立IP的访问用户,指1天内使用不同IP地址的用户访问网站的数量,同一IP无论访问了几个页面,独立IP数均为1。但是假如说两台机器访问而使用的是同一个IP,那么只能算是一个IP的访问。

使用独立IP数来度量网站访问量,不是很精确。因为国内的上网多数都时NAT上网的,一个独立IP背后可能为数十上百个客户端访问。

(2)PV(page view,页面浏览量或点击量)

PV通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。用户每1次对网站中的每个网页访问均被记录1次。网页浏览数是评价网站流量最常用的指标之一,简称为PV。监测网站PV的变化趋势和分析其变化原因是很多站长定期要做的工作。 Page Views中的Page一般是指普通的html网页,也包含php、jsp等动态产生的html内容。来自浏览器的一次html内容请求会被看作一个PV,逐渐累计成为PV总数。

PV是网站被访问的页面数据量的一个指标,但没法估算有多少人访问。

(3)UV(unique visitor,独立访客数)

UV指访问某个站点或点击某个网页的不同IP地址的人数。但统计的是客户端(PC或移动端)的数量。在同一天内,UV只记录第一次进入网站的具有独立IP的访问者,在同一天内再次访问该网站则不计数。UV提供了一定时间内不同观众数量的统计指标,而没有反应出网站的全面活动。通过IP和cookie是判断UV值的两种方式。

  用Cookie分析UV值:

当客户端第一次访问某个网站服务器的时候,网站服务器会给这个客户端的电脑发出一个Cookie,通常放在这个客户端电脑的C盘当中。在这个Cookie中会分配一个独一无二的编号,这其中会记录一些访问服务器的信息,如访问时间,访问了哪些页面等等。当你下次再访问这个服务器的时候,服务器就可以直接从你的电脑中找到上一次放进去的Cookie文件,并且对其进行一些更新,但那个独一无二的编号是不会变的。

(4)PV、IP和UV的关系

统计的IP数量要比网站实际访问的IP数量小得多

PV高不一定代表来访者多,PV与来访者数量成正比。但PV并不直接决定页面的真实来访者数量。PV多,则用户访问网站页面的总数量多,服务器压力大。

IP和UV之间的数据不会有太大的差异,通常UV量和比IP量高出一点,每个UV相对于每个IP更准确地对应一个实际的浏览者。

a、UV大于IP

这种情况就是在网吧、学校、公司等,公用相同IP的场所中不同的用户,或者多种不同浏览器访问您网站,那么UV数会大于IP数。

b、UV小于IP

在家庭中大多数电脑使用ADSL拨号上网,所以同一个用户在家里不同时间访问您网站时,IP可能会不同,因为它会根据时间变动IP,即动态的IP地址,但是实际访客数唯一,便会出现UV数小于IP数。

(5)并发的理解

老男孩:单位时间内,服务器能够同时处理的最大连接数(有的请求1秒结束,有的请求可能10秒才结束)

网上:Concurrent User =Request Per Second +Simultaneous Browser connections + Thinking Time

Concurrent User:网站并发用户数

Request Per Second:每秒请求数(吞吐量)

Simultaneous Browser connections:并发连接数

Thinking Time:用户平均思考时间

(6)查看常见网站排名与IP-PV量

a、查询网站

http://alexa.chinaz.com

b、相关网站的IP和PV

网站

IP(万)

PV(万)

服务器台数(大概、猜测)

www.51cto.com

60

147

30

www.chinaunix.net

25

40

10

www.ganji.com

9

62

200

www.58.com

48

576

300-400

www.weibo.com

1830

8308

1000多

www.jd.com

1935

11706

500-1000?

www.taobao.com

3577

15919

10000

二、http服务软件分类及企业实战用途介绍

1、http服务软件排名

查看网站:https://w3techs.com/technologies/overview/web_server/all

 

W3Techs.com,2 March 2017

Apache

50.4%

Nginx

32.7%

Microsoft-IIS

11.5%

LiteSpeed

2.5%

Google Servers

1.3%

Tomcat

0.6%

IdeaWebServer

0.3%

Node.js

0.3%

Apache Traffic Server

0.3%

Tengine

0.2%

Cowboy

0.1%

Lighttpd

0.1%

IBM Servers

0.1%

Oracle Servers

0.1%

2、当前主流web服务说明

(1)静态服务:

a、apach:中小型静态WEB服务的主流,WEB服务器中的老大哥

b、nginx:大型新兴网站静态WEBe服务主流

d、lighttpd:不温不火,有逐渐被淘汰的意味,社区不活跃,但静态效率高

 (2)动态服务:

a、IIS:微软WEB服务器,支持asp、aspx

b、tomcat:中小企业动态WEB服务的主流,互联网java容器主流

c、resin:大型动态WEB服务的主流,互联网java容器主流(百度使用)

d、php(fcgi):php程序的解析容器。php在配合apache时,不是守护进程,而是以模块的形式(mod_php5.so),配合nginx和lighttpd时,php是以守护进程模式(FCGI)

三、Linux系统软件包的安装方式

1、源码编译

(1)特点是比较灵活,只编译想要的参数

(2)中小企业常用

2、yum或rpm方式安装

(1)特点是简单、方便,便不够灵活。

(2)功能和使用情况考虑:访问量小或内部使用时,多用yum installhttpd -y

(3)方便性考虑:追求方便时,可以用yum

(4)维护成本考虑:服务器数量很大时,用yuma或rpm

3、高级安装:结合编译和yum/rpm的双重优点

通过源码来制作成符合自已的rpm包,放到自已的yum仓库里,再在全网通过yum实现批量部署、管理、升级。但此方法有难度,比较复杂。

参考博文注13:rpm包制作介绍实战操作讲解http://oldboy.blog.51cto.com/blog/2561410/1121745

参考博文14:yum源及yum仓库搭建http://oldboy.blog.51cto.com/blog/2561410/1126453

四、Apache安装实战

1、下载

http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.27.tar.gz

http://mirrors.cnnic.cn/apache/httpd/httpd-2.2.27.tar.gz

2、卸载系统自带Apache

rpm -e --nodeps httpd-2.2.15-53.el6.x86_64

3、配置参数说明
(1)参数说明

--prefix=/application/apache2.2.27 \     #指定安装路径

--enable-deflate \                           #压缩

--enable-expires \                           #指定过期时间

--enable-headers \                           #激活header

--enable-moules=most \                       #激活大多数模块

--enable-so \                                #支持DSO模式

--with-mpm=worker \                          #指定工作模式为worker

--enable-rewrite                             #伪静态

(2)worker和prefork说明:

with-mpm是指定服务器的工作模式,一般分为worker和prefork(默认)两种模式。worker模式是生成一个主进程和多个线程,由线程对外提供服务,缺点是如果一个线程崩溃,整个进程就会连同其它线程一起死掉,服务的稳定性不如prefork模式。prefork是生成多个进程,由进程对外提供服务。进程方式安全,但费资源。

4、安装
(1)解压并进入目录

tar zxf httpd-2.2.27.tar.gz

cd /wddt/tools/ httpd-2.2.27

(2)配置参数

./configure \

--prefix=/application/apache2.2.27 \

--enable-deflate \

--enable-expires \

--enable-headers \

--enable-moules=most \

--enable-so \

--with-mpm=worker \

--enable-rewrite

(3)检查是否有错

echo $?

(4)编译

make

(5)安装

make install

(6)创建软连接

ln -s /application/apache2.2.27/ /application/apache

(7)启动Apache服务

a、检查语法

/application/apache/bin/apachectl -t

httpd: Could not reliably determine the server's fully qualifieddomain name, using 127.0.0.1 for ServerName

Syntax OK

b、启动服务

方法一:

/application/apache/bin/apachectl start

httpd: Could not reliably determine the server's fully qualifieddomain name, using 127.0.0.1 for ServerName  #这个提示不用管。不影响使用,解决方法见下面的http协议和www服务实战进阶之五FQDN(fully qualified domain name)问题的解决

方法二:

/application/apache/bin/httpd -k start

c、检查服务端口

lsof -i :80

COMMAND   PID   USER  FD   TYPE  DEVICE SIZE/OFF NODE NAME

httpd   11026   root   4u  IPv6 1834512      0t0 TCP *:http (LISTEN)

httpd   11028 daemon    4u IPv6 1834512      0t0  TCP *:http (LISTEN)

httpd   11029 daemon    4u IPv6 1834512      0t0  TCP *:http (LISTEN)

httpd   11030 daemon    4u IPv6 1834512      0t0  TCP *:http (LISTEN)

d、检查服务进程

ps -ef | grep httpd

root     11026     1  016:31 ?  00:00:00/application/apache2.2.27/bin/httpd -k start

daemon   11027 11026  0 16:31 ? 00:00:00 /application/apache2.2.27/bin/httpd -k start

daemon   11028 11026  0 16:31 ? 00:00:00 /application/apache2.2.27/bin/httpd -k start

daemon   11029 11026  0 16:31 ? 00:00:00 /application/apache2.2.27/bin/httpd -k start

daemon   11030 11026  0 16:31  00:00:00 /application/apache2.2.27/bin/httpd -k start

e、其它检查

wget 192.168.58.238

curl 192.168.58.238

curl -I 192.168.58.238

5、查看帮助
(1)查看帮助

/application/apache/bin/apachectl

Usage: /application/apache2.2.27/bin/httpd [-D name] [-d directory][-f file]

                                           [-C"directive"] [-c "directive"]

                                           [-kstart|restart|graceful|graceful-stop|stop]

                                           [-v][-V] [-h] [-l] [-L] [-t] [-T] [-S]

graceful:表示优雅的重新启动

Options:

  -D name            : define a name for use in<IfDefine name> directives

  -d directory       : specify an alternate initialServerRoot

  -f file            : specify an alternateServerConfigFile

  -C"directive"     : processdirective before reading config files

  -c"directive"     : processdirective after reading config files

  -e level           : show startup errors of level (seeLogLevel)

  -E file            : log startup errors to file

  -v                 : show version number

  -V                 : show compile settings

  -h                 : list available command lineoptions (this page)

  -l                 : list compiled in modules

  -L                 : list available configurationdirectives

  -t -D DUMP_VHOSTS  : show parsed settings (currently only vhostsettings)

  -S                 : a synonym for -t -DDUMP_VHOSTS

  -t -D DUMP_MODULES : showall loaded modules

  -M                 : a synonym for -t -DDUMP_MODULES

  -t                 : run syntax check for configfiles

  -T                 : start withoutDocumentRoot(s) check

(2)-l参数,查看安装的模块

/application/apache/bin/apachectl -l | egrep"_so|_rewrite|header|expire|deflate"

  mod_deflate.c

  mod_expires.c

  mod_headers.c

  mod_rewrite.c

  mod_so.c

(3)-M参数,查看安装的模块类型(静态、动态)

/application/apache/bin/apachectl -M

(4)查看Apache默认的网站根目录

grep -i documentroot httpd.conf

DocumentRoot "/application/apache2.2.27/htdocs"

(5)查看Apache默认的网站主页

grep  DirectoryIndexhttpd.conf

DirectoryIndex index.html

五、Apache配置说明

1、Apache主要目录结构
(1)bin目录

a、ab:Apache Http服务器性能测试工具,简单、易用

b、apachectl:Apache的启动命令,脚本。

c、apxs:是一个为Apache Http服务器编译和安装扩展模块的工具,在进行DSO方式编译模块时会用到。

d、htcacheclean:清理磁盘缓冲区的命令,需要在编译时指定相关参数才能用,一般很少用

e、htpasswd:建立和更新基本认证文件。如配置nagios等监控服务时会用到

f、httpd:为Apache 的控制命令程序,apachectl执行时会调用httpd

g、rotatelogs:Apache自带的日志轮询命令。一般可用cronolog替代。

(2)conf目录

a、extra:扩展的Apache配置文件目录,做为httpd.conf 的子配置文件所在的目录。

b、httpd.conf:Apache的主配置文件。

c、magic

d、mime.types

e、original

(3)htdocs目录:是Apache默认站点目录。
(4)logs目录:是Apache默认日志目录,包括错误日志及访问日志。

a、access_log:默认访问日志文件

b、error_log:默认错误日志文件

c、http.pid:httpd的pid文件,http进程启动后,会把所有进程的ID号写到此文件

(5)modules目录:是Apache的模块目录。如php、memcache等模块编译后都放在该目录下
2、主配置文件httpd.conf说明
(1)导出有效主配置

grep -Ev "^#|^   #|^$" httpd.conf > httpd.conf.ori

(2)查看有效主配置

cat httpd.conf.ori

ServerRoot "/application/apache2.2.27"

Listen 80

<IfModule !mpm_netware_module>

<IfModule !mpm_winnt_module>

User daemon

Group daemon

</IfModule>

</IfModule>

ServerAdmin you@example.com

DocumentRoot "/application/apache2.2.27/htdocs"

<Directory />

    Options FollowSymLinks

    AllowOverride None

    Order deny,allow

    Deny from all

</Directory>

<Directory "/application/apache2.2.27/htdocs">

    Options Indexes FollowSymLinks

    AllowOverride None

    Order allow,deny

    Allow from all

</Directory>

<IfModule dir_module>

    DirectoryIndex index.html

</IfModule>

<FilesMatch "^\.ht">

    Order allow,deny

    Deny from all

    Satisfy All

</FilesMatch>

ErrorLog "logs/error_log"

LogLevel warn

<IfModule log_config_module>

    LogFormat "%h %l %u%t \"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\"" combined

    LogFormat "%h %l %u%t \"%r\" %>s %b" common

    <IfModulelogio_module>

      # You need to enablemod_logio.c to use %I and %O

      LogFormat "%h %l %u%t \"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\" %I %O" combinedio

    </IfModule>

    CustomLog"logs/access_log" common

</IfModule>

<IfModule alias_module>

(3)有效主配置说明

a、ServerRoot"/application/apache2.2.27":服务的根目录

b、Listen 80:监听的端口,不写IP,表示默认监听本机所有配置的IP地址

c、<IfModule 。。。>:模块的开头

d、User daemon和Group daemon:表示默认编译和安装的用户为daemon

e、ServerAdminyou@example.com:表示管理员的Email,当网站出问题时,该Email会在页面显示

f、DocumentRoot"/application/apache2.2.27/htdocs":默认站点目录

g、<Directory 。。。>:表示权限配置

(i)对网站根目录进行权限配置

<Directory />:对网站根目录进行权限配置

    Options FollowSymLinks:允许带符号连接

    AllowOverride None:禁止相关功能,如重载等功能

    Order deny,allow:表示先检查禁止,没有禁止的全部允许。deny和allow之间只能有一个逗号

    Deny from all:表示禁止全部访问

</Directory>

(ii)对站点目录进行权限配置.每个新增站点都必须要配置

<Directory "/application/apache2.2.27/htdocs">:对指定站点目录进行权限配置

    Options IndexesFollowSymLinks:Indexes表示允许展示目录结构,有安全风险,要禁止,去掉或在前面加上减号“-”:-Indexes。下载目录可以展示,但一般服务不允许。

    AllowOverride None

    Order allow,deny:表示先检查允许,没有允许的全部禁止

    Allow from all:表示允许全部访问

</Directory>

h、<IfModule dir_module>

     DirectoryIndex index.html:指定主页

   </IfModule>

i、<FilesMatch "^\.ht">:表示对以“.ht”开头的文件进行指定的处理

    Order allow,deny

    Deny from all

    Satisfy All

</FilesMatch>

j、ErrorLog "logs/error_log":错误日志配置

k、LogLevel warn:日志的级别

l、<IfModule log_config_module>:访问日志的类型,记录到日志文件中的内容和格式

   LogFormat "%h %l %u %t \"%r\" %>s %b\"%{Referer}i\" \"%{User-Agent}i\"" combined

   LogFormat "%h %l %u %t \"%r\" %>s %b" common

   <IfModule logio_module>

     # You need to enable mod_logio.c to use %I and %O

     LogFormat "%h %l %u %t\"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\" %I %O" combinedio

   </IfModule>

    CustomLog"logs/access_log" common

</IfModule>

<IfModule alias_module>

3、扩展配置文件说明
(1)重点配置文件:httpd-vhosts.conf和httpd-mpm.conf
(2)需了解的配置文件:httpd-default.conf
(3)httpd-vhosts.conf配置说明

a、NameVirtualHost*:80 :基于域名的虚拟主机。*表示监听本机所有域名或IP,80表示要监听80端口

b、<VirtualHost*:80>:表示虚拟主机的配置,如果配置多个虚拟主机,就有多个该配置

<VirtualHost *:80>

    ServerAdmin :管理员邮箱

    DocumentRoot :网站根目录

    ServerName :域名

    ServerAlias :域名的别名

    ErrorLog  :错误日志

    CustomLog  :访问日志 common

</VirtualHost>

c、示例

<VirtualHost *:80>

    ServerAdminwebmaster@dummy-host.example.com

    DocumentRoot"/application/apache2.2.27/docs/dummy-host.example.com"

    ServerNamedummy-host.example.com

    ServerAliaswww.dummy-host.example.com

    ErrorLog"logs/dummy-host.example.com-error_log"

    CustomLog"logs/dummy-host.example.com-access_log" common

</VirtualHost>

(4)httpd-mpm.conf配置说明

a、PidFile"logs/httpd.pid:指定pid文件

<IfModule !mpm_netware_module>

    PidFile"logs/httpd.pid"

</IfModule>

b、LockFile"logs/accept.lock":指定lock文件

<IfModule !mpm_netware_module>

     LockFile"logs/accept.lock"

</IfModule>

c、prefork模式配置:<IfModule mpm_prefork_module>(默认模式)

由于安装时指定了work模式,所以该配置可以不配

<IfModule mpm_prefork_module>

    StartServers          5

    MinSpareServers       5

    MaxSpareServers      10

    MaxClients          150

    MaxRequestsPerChild   0

</IfModule>

d、work模式配置:<IfModule mpm_worker_module>

<IfModule mpm_worker_module>

    StartServers          2

    MaxClients          150

    MinSpareThreads      25

    MaxSpareThreads      75

    ThreadsPerChild      25

    MaxRequestsPerChild   0

</IfModule>

(5)httpd-default.conf配置说明

a、超时设置:Timeout 300

b、保持连接状态设置:KeepAlive On

c、保持最大连接请求设置:MaxKeepAliveRequests 100

d、同一连接上等待下一个请求的时间设置:KeepAliveTimeout 5

e、设置伪静态的语法:AccessFileName .htaccess

f、隐藏Apache版信息:

ServerTokens Full

ServerSignature On

六、http协议和www服务实战进阶

1、虚拟主机分类

虚拟主机是在同一http服务下部署多个站点,每个站点都使用不同的域名和站点目录,或不同IP和端口。也就是一个http服务配置多个站点。

(1)基于域名的虚拟主机

(2)基于端口的虚拟主机

(3)基于IP的虚拟主机

2、配置基于域名的虚拟主机
(1)需求

域名

目录

www.abc.org

/var/html/www

blog.abc.org

/var/html/blog

bbs.abc.org

/var/html/bbs

(2)创建目录

mkdir /var/html/{www,blog,bbs} -p

(3)创建主页文件index.html

for name in www blog bbs;do echo"http://$name.abc.org">/var/html/$name/index.html;done

for name in www blog bbs;do cat /var/html/$name/index.html;done                       

http://www.abc.org

http://blog.abc.org

http://bbs.abc.org

(4)配置httpd-vhosts.conf 文件

vi /application/apache/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>

    ServerAdmin aaa@abc.com

    DocumentRoot"/var/html/www"

    ServerName www.abc.org

    ServerAlias abc.org

    ErrorLog"logs/www-error-log"

    CustomLog"logs/www-access-log" common

</VirtualHost>

 

<VirtualHost *:80>

    ServerAdmin aaa@abc.com

    DocumentRoot"/var/html/blog"

    ServerName blog.abc.org

    ErrorLog"logs/blog-error-log"

    CustomLog "logs/blog-access-log"common

</VirtualHost>

 

<VirtualHost *:80>

    ServerAdmin aaa@abc.com

    DocumentRoot"/var/html/bbs"

    ServerName bbs.abc.org

    ErrorLog"logs/bbs-error-log"

    CustomLog"logs/bbs-access-log" common

</VirtualHost>

(5)配置主配置文件httpd.conf

加载相关扩展配置文件httpd-vhosts.conf、httpd-mpm.conf,将主配置文件中前面的“#”号去掉。

vi /application/apache/conf/httpd.conf  

# Server-pool management (MPM specific)

Include conf/extra/httpd-mpm.conf

# Virtual hosts

Include conf/extra/httpd-vhosts.conf

(6)检查语法

/application/apache/bin/apachectl –t

(7)平滑重启Apache

/application/apache/bin/apachectl graceful

(8)本地配置域名解析:修改客户端hosts文件

192.168.1.5 www.abc.org blog.abc.org bbs.abc.org

(9)检查本地配置域名解析是否配好

ping www.abc.org

ping blog.abc.org

ping bbs.abc.org

(10)浏览器访问相关页面,报403错:禁止访问

Forbidden

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

(11)报403错原因

Apache的主配置文件httpd.conf 中没有配置站点目录的访问权限,程序不能访问/var/html/下的目录和文件。

(12)修改httpd.conf文件,配置站点目录访问权限

vi httpd.conf

#在httpd.conf文件最后添加如下代码

<Directory "/var/html">

    Options FollowSymLinks

    AllowOverride None

    Order allow,deny

    Allow from all

</Directory>

(13)重启Apache

/application/apache/bin/apachectl graceful

(14)浏览器访问相关页面,成功

http://www.abc.org

http://blog.abc.org

http://bbs.abc.org

3、配置基于端口的虚拟主机
(1)修改httpd.conf文件,配置监听端口

在Listen 80下面新增如下代码:

Listen 8000

Listen 9000

(2)修改扩展配置文件httpd-vhosts文件,配置相关监听端口

(i)在NameVirtualHost *:80下面新增如下代码:

NameVirtualHost *:8000

NameVirtualHost *:9000

(ii)将blog和bbs站点监听端口改为如下:

<VirtualHost *:8000>

    ServerAdmin aaa@abc.com

    DocumentRoot"/var/html/blog"

    ServerName blog.abc.org

    ErrorLog"logs/blog-error-log"

    CustomLog"logs/blog-access-log" common

</VirtualHost>

 

<VirtualHost *:9000>

    ServerAdmin aaa@abc.com

    DocumentRoot "/var/html/bbs"

    ServerName bbs.abc.org

    ErrorLog"logs/bbs-error-log"

    CustomLog"logs/bbs-access-log" common

</VirtualHost>

(3)重启Apache

/application/apache/bin/apachectl graceful

(4)浏览器访问相关页面,成功

http://www.abc.org

http://blog.abc.org:8000

http://bbs.abc.org:9000

4、配置基于IP的虚拟主机
(1)为eth0临时配置一个新IP

ifconfig eth0:0 192.168.158.99/24 up

(2)检查

ifconfig

ping 192.168.158.99

(3)修改扩展配置文件httpd-vhosts文件,配置相关IP

vi /application/apache/conf/extra/httpd-vhosts.conf

#注销下面代码

#NameVirtualHost *:80

#NameVirtualHost *:8000

#NameVirtualHost *:9000

#修改下面代码

<VirtualHost 192.168.1.5:80>

    ServerAdmin aaa@abc.com

    DocumentRoot"/var/html/www"

    ServerName 192.168.1.5

    ServerAlias abc.org

    ErrorLog"logs/www-error-log"

    CustomLog"logs/www-access-log" common

</VirtualHost>

 

<VirtualHost 192.168.158.99:80>

    ServerAdmin aaa@abc.com

    DocumentRoot"/var/html/blog"

    ServerName 192.168.158.99

    ErrorLog"logs/blog-error-log"

    CustomLog"logs/blog-access-log" common

</VirtualHost>

(4)检查语法

/application/apache/bin/apachectl –t

(5)平滑重启Apache

/application/apache/bin/apachectl graceful

(6)浏览器访问相关页面,成功

http://192.168.1.5

http:// 192.168.158.199

5、关于FQDN(fully qualified domain name)问题的解决

Apache每次在启动或重启时,总是报一外FQDN的错误,虽不影响使用,但总是碍眼。具体错误如下:httpd: Could notreliably determine the server's fully qualified domain name, using 127.0.0.1for ServerName。意思是Apache找不到完成的QDN,所以用12.0.0.1代替。

解决方法:在Apache的主配置文件httpd.conf中添加一行ServerName 127.0.0.1:80

七、Apache日志

1、Apache日志格式说明
(1)通用日志格式(Common Log Format)

扩展配置文件httpd-vhosts中,配置如下

<VirtualHost 192.168.158.99:80>

    ServerAdmin aaa@abc.com

    DocumentRoot"/var/html/blog"

    ServerName 192.168.158.99

    ErrorLog"logs/blog-error-log"

    CustomLog"logs/blog-access-log" common

</VirtualHost>

(2)组合日志格式(Combined Log Format)

扩展配置文件httpd-vhosts中,配置如下

<VirtualHost 192.168.158.99:80>

    ServerAdmin aaa@abc.com

    DocumentRoot"/var/html/blog"

    ServerName 192.168.158.99

    ErrorLog"logs/blog-error-log"

    CustomLog"logs/blog-access-log" combined

</VirtualHost>

(3)日志格式在主配置文件httpd.conf中可以修改

<IfModule log_config_module>

    LogFormat "%h %l %u %t \"%r\"%>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

    LogFormat "%h %l %u %t\"%r\" %>s %b" common

    <IfModule logio_module>

      # You need to enablemod_logio.c to use %I and %O

      LogFormat "%h %l %u%t \"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\" %I %O" combinedio

    </IfModule>

    CustomLog"logs/access_log" common

</IfModule>

(4)Apache日志轮询工具

a、系统自带的日志轮询命令rotatelogs。是 Apache 2.2 中自带的管道日志程序

b、生产环境常用的日志轮询工具cronolog

2、配置日志轮询工具cronolog
(1)下载(打不开,后从Chinaunix下载)

wget http://cronolog.org/download/cronolog-1.6.2.tar.gz(打不开)

wget http://down1.chinaunix.net/distfiles/cronolog-1.6.2.tar.gzChinaunix

(2)解压并安装

cd /wddg/tools

tar zxf cronolog-1.6.2.tar.gz

cd cronolog-1.6.2

./configure

make

make install

(3)查看安装目录

ll /usr/local/sbin/cronolog

-rwxr-xr-x 1 root root 33388 Feb 23 09:57 /usr/local/sbin/cronolog

(4)配置cronolog

a、一定要使用全路径,否则有时会出错,命令路径前还有一个竖线“|”

b、cronolog轮询格式

(i)按小时(生产环境常见用法)

CustomLog "|/usr/local/sbin/cronolog /app/logs/access_blog_%Y%m%d%H.log"combined

(ii)按天(生产环境常见用法)

CustomLog "|/usr/local/sbin/cronolog/app/logs/access_blog_%Y%m%d.log" combined

(iii)按周(生产环境常见用法)

CustomLog "|/usr/local/sbin/cronolog/app/logs/access_blog_%w.log" combined

CustomLog "|/usr/local/sbin/cronolog/app/logs/%w/access_blog.log" combined

(iv)按月(生产环境不常见用法)

CustomLog "|/usr/local/sbin/cronolog/app/logs/access_blog_%Y%m.log" combined

c、修改扩展配置文件httpd-vhosts,配置如下

<VirtualHost 192.168.158.99:80>

    ServerAdmin aaa@abc.com

    DocumentRoot"/var/html/blog"

    ServerName 192.168.158.99

    ErrorLog"logs/blog-error-log"

CustomLog"|/usr/local/sbin/cronolog /application/apache/

logs/access_blog_%Y%m%d.log"combined

</VirtualHost>

(5)访问blog,并查看日志生成情况

http://192.168.158.99

ll /application/apache/logs

-rw-r--r-- 1 root   root  392 Feb 23 10:18 access_blog_20170223.log

cat access_blog_20170223.log

192.168.158.111 - - [23/Feb/2017:10:18:42 +0800] "GET /HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2824.2 Safari/537.36"

192.168.158.111 - - [23/Feb/2017:10:18:42 +0800] "GET/favicon.ico HTTP/1.1" 404 209 "http://192.168.158.99/""Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/54.0.2824.2 Safari/537.36"

3、系统自带的日志轮询命令rotatelogs(不常用)
(1)语法格式

rotatelogs [-l] logfile [rotationtime [offset]] | [filesizeM]

(2)选项

-l:使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。

logfile:它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。

rotationtime:日志文件滚动的以秒为单位的间隔时间。

offset:相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。

filesizeM:指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。

(3)使用方式:扩展配置文件httpd-vhosts.conf中修改指定站点的日志

ErrorLog "|/application/apache/bin/rotatelogs -llogs/error_%Y%m%d.log 86400"

CustomLog "|/application/apache/bin/rotatelogs–l logs/access_%Y%m%d.log 86400" combined

(4)测试(Apache允许同一类型日志配置多个日志文件)

vi /application/apache/conf/extra/httpd-vhosts.conf

<VirtualHost 192.168.158.99:80>

   ServerAdmin aaa@abc.com

   DocumentRoot "/var/html/blog"

   ServerName 192.168.158.99

   ErrorLog "logs/blog-error-log"

CustomLog"|/usr/local/sbin/cronolog /application/apache/logs/

access_blog_%Y%m%d.log"combined

CustomLog "|/application/apache/bin/rotatelogs/application/apache/logs/

access_blogrotatelogs_%Y%m%d%H%M.log 86400"combined

</VirtualHost>

(5)访问blog,并查看日志生成情况

http://192.168.158.99

ll /application/apache/logs

-rw-r--r-- 1 root   root 1321 Feb 23 12:45access_blog_20170223.log

-rw-r--r-- 1 root   root 929 Feb 23 12:45 access_blogrotatelogs_201702230000.log

4、通过定时任务,来实现日志轮询
(1)通过定时任务在每天0点将Apache的日志重命名

cd /application/apache/logs

mv www-access_log www-access_$(date+%F)_log

(2)平滑重启Apache,重新生成一个新日志文件

/application/apache/bin/apachectlgraceful

5、Apache日志中不记录指定元素日志

当计算日志PV时,一般不希望统计图片元素、css、js等元素周期律的日志。因为打开一个页面才是一个PV,同时服务器也不希望记录来自前端负载均衡健康检查的无用日志。这时,整个配置就需要mod_setenvif模块的支持,不记录指定的元素日志。

(1)示例1:不记录图片的日志

vi/application/apache/conf/extra/httpd-vhosts.conf

<VirtualHost *:9000>

   ServerAdmin aaa@abc.com

   DocumentRoot "/var/html/bbs"

ServerNamebbs.abc.org

<FilesMatch "\.(css|js|gif|jpg|ico|swf)">

SetEnv IMAG 1

</FilesMatch >

   ErrorLog "logs/bbs-error-log"

   CustomLog "logs/bbs-access-log" common env=!IMAG

</VirtualHost>

(2)示例2:不记录负载均衡健康检查的日志

vi/application/apache/conf/extra/httpd-vhosts.conf

<VirtualHost *:9000>

   ServerAdmin aaa@abc.com

   DocumentRoot "/var/html/bbs"

ServerNamebbs.abc.org

SetEnvIf Request_URI "^/check/.html$" dontlog

   ErrorLog "logs/bbs-error-log"

   CustomLog "logs/bbs-access-log" common env=!dontlog

</VirtualHost>

6、统计Apache日志各IP访问量
(1)日志样表

cat/application/apache/logs/access_blog_20170223.log  

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.102 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.103 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.104 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.105 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.102 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.103 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.102 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.102 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.103 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.104 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.105 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.101 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.102 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

10.0.0.103 - - C:C/Feb/2017:10:18:42 +0800] "GET /favicon.icoHTTP/1.1" 200 25

(2)查找并排序:方法一

awk '{print $1}'access_blog_20170223.log| sort | uniq -c|sort -rn -k1|head -10     

7 10.0.0.101

5 10.0.0.102

4 10.0.0.103

2 10.0.0.104

2 10.0.0.105

(3)查找并排序:方法二(awk数组)

awk '{++S[$1]} END {for (key in S)print S[key],key}' access_blog_20170223.log |sort -rn -k1|head -10

7 10.0.0.101

5 10.0.0.102

4 10.0.0.103

2 10.0.0.104

2 10.0.0.105

八、隐藏Apache版本信息

1、在编译安装前修改相关源文件
(1)修改httpd-2.2.27/include/ap_release.h文件,将相关内容修改如下:

修改前:#defineAP_SERVER_BASEVENDOR "Apache Software Foundation"

修改后:#defineAP_SERVER_BASEVENDOR "IIS"

修改前:#defineAP_SERVER_BASEPROJECT "Apache HTTP Server"

修改后:#defineAP_SERVER_BASEPROJECT "IIS"

修改前:#defineAP_SERVER_BASEPRODUCT "Apache"

修改后:#defineAP_SERVER_BASEPRODUCT "IIS"

修改前:#define AP_SERVER_MAJORVERSION_NUMBER2

修改后:#defineAP_SERVER_MAJORVERSION_NUMBER 7

修改前:#defineAP_SERVER_MINORVERSION_NUMBER 2

修改后:#defineAP_SERVER_MINORVERSION_NUMBER 0

修改前:#defineAP_SERVER_PATCHLEVEL_NUMBER   27

修改后:#defineAP_SERVER_PATCHLEVEL_NUMBER   0

修改前:#defineAP_SERVER_DEVBUILD_BOOLEAN    0

修改后:#defineAP_SERVER_DEVBUILD_BOOLEAN    0

(2)修改httpd-2.2.27/os/unix/os.h文件,将相关内容修改如下:

修改前:#definePLATFORM "Unix"

修改后:#definePLATFORM "Win32"

(3)编译安装

./configure

make

make install

(4)通过curl命令检查

curl –I http://10.0.0.99

2、在编译安装后修改相关配置文件
(1)修改httpd-default.conf文件,将相关内容修改如下:

vi/application/apache/conf/extra/httpd-default.conf

修改前:ServerTokensFull

修改后:ServerTokensProd

修改前:ServerSignatureOn

修改后:ServerSignatureOff

(2)修改主配置文件httpd.conf,将http-default.conf引用打开

修改前:

# Various default settings

#Include conf/extra/httpd-default.conf

修改后:

# Various default settings

Include conf/extra/httpd-default.conf

(3)平滑重启Apache

/application/apache/bin/apachectlgraceful

(4)检查修改是否成功

curl -I http://192.168.158.99

HTTP/1.1 200 OK

Date: Thu, 23 Feb 2017 06:15:22 GMT

Server: Apache  #已无版本号

Last-Modified: Wed, 22 Feb 201713:40:55 GMT

ETag:"1bf366-14-5491ea5590f07"

Accept-Ranges: bytes

Content-Length: 20

Content-Type: text/html

原创粉丝点击