HTTP协议以及Apache的httpd配置

2023-05-16

HTTP协议

  • 前言
  • HTTP简介
    • HTTP诞生
    • HTTP版本历史
      • HTTP/0.9
      • HTTP/1.0
      • HTTP/1.1
      • HTTP/2.0
    • web资源
    • HTTP工作流程
    • HTTP报文
      • 报文语法格式
          • method(方法)
        • status(状态码)
        • HEADERS
          • 通用首部
          • 请求首部
            • 条件式请求首部
            • 安全请求首部
            • 代理请求首部
          • 响应首部
            • 信息
            • 协商首部
            • 安全响应首部
            • 实体首部
  • HTTPD
    • HTTPD简介
    • HTTPD特性
    • httpd安装
    • httpd配置文件
      • centos6(httpd-2.2)
      • centos7 (httpd-2.4)
      • 常用配置
        • 1、修改监听的IP和PORT
        • **2、保持连接,2.2和2.4是一样的配置**
        • **3、ServerRoot指令**
        • **4、DocumentRoot指令**
        • **5、SeverName和SeverAlias指令**
        • **6、VirtualHost指令**
        • **7、Options和Allowoverride指令**
        • **8、Require指令(2.4)**
        • 容器类指令
          • <\Directory\>指令
  • 使用httpd服务
    • 题目
    • 虚拟机的设置
    • httpd日志
      • 错误日志
      • 访问日志
      • 基于用户的访问控制
      • status页面以及控制访问来源
      • 配置httpd支持https

前言

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

HTTP简介

在这里插入图片描述

  • 1、由上图我们可以看出,HTTP协议属于应用层协议。也在TLS或者SSL之上。也就是我们所说的https。
  • 2、HTTP默认监听在80端口,HTTPS的端口为443.
  • 3、HTTP属于标准的C/S架构,是无状态的协议。无状态即是协议对于交互性场景没有记忆能力。也就是无法知道是客户端在浏览网页时,http无法知道它是否之前来过。
  • 4、HTTP基于TCP/IP协议进行通信。、
  • 5、浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如咱们常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。

HTTP诞生

1960年Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和Internet工作小组(Internet Engineering Task Force)共同合作研究,最终发布了一系列的RFC,其中最著名的就是RFC 2616。RFC 2616定义了HTTP协议的我们今天普遍使用的一个版本——HTTP 1.1。 由于Ted Nelson对HTTP技术的发展做出的突破性历史贡献,他被称为“HTTP之父”。

HTTP版本历史

HTTP/0.9

HTTP/0.9是第一个版本的HTTP协议,已过时。它的组成极其简单,只允许客户端发送GET这一种请求,且不支持请求头。由于没有协议头,造成了HTTP/0.9协议只支持一种内容,即纯文本。不过网页仍然支持用HTML语言格式化,同时无法插入图片。

HTTP/0.9具有典型的无状态性,每个事务独立进行处理,事务结束时就释放这个连接。由此可见,HTTP协议的无状态特点在其第一个版本0.9中已经成型。一次HTTP/0.9的传输首先要建立一个由客户端到Web服务器的TCP连接,由客户端发起一个请求,然后由Web服务器返回页面内容,然后连接会关闭。如果请求的页面不存在,也不会返回任何错误码。

HTTP/1.0

HTTP协议的第二个版本,第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用。相对于HTTP/0.9增加了如下主要特性:

  • 请求与响应支持头域
  • 响应对象以一个响应状态行开始
  • 响应对象不只限于超文本
  • 开始支持客户端通过POST方法向Web服务器提交数据,支持GET、HEAD、POST方法
  • 支持长连接(但默认还是使用短连接),缓存机制,以及身份认证

HTTP/1.1

HTTP协议的第三个版本是HTTP/1.1,是目前使用最广泛的协议版本。HTTP/1.1是目前主流的HTTP协议版本,相对于HTTP/1.0新增了以下内容:

  • (1) 默认为长连接HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection:keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

  • (2) 提供了范围请求功能(宽带优化)HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。这是支持文件断点续传的基础。

  • (3) 提供了虚拟主机的功能(HOST域)在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。

  • (4) 多了一些缓存处理字段HTTP/1.1在1.0的基础上加入了一些cache的新特性,引入了实体标签,一般被称为e-tags,新增更为强大的Cache-Control头。

  • (5) 错误通知的管理在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

HTTP/2.0

HTTP协议的第四个版本是HTTP/2.0,相对于HTTP/1.1新增了以下内容:

  • 二进制分帧HTTP 2.0 的所有帧都采用二进制编码

  • 帧:客户端与服务器通过交换帧来通信,帧是基于这个新协议通信的最小单位。

  • 消息:是指逻辑上的 HTTP 消息,比如请求、响应等,由一或多个帧组成。

  • 流:流是连接中的一个虚拟信道,可以承载双向的消息;每个流都有一个唯一的整数标识符(1、2 … N);

多路复用多路复用允许同时通过单一的HTTP/2.0 连接发起多重的请求-响应消息。有了新的分帧机制后,HTTP/2.0不再依赖多个TCP 连接去处理更多并发的请求。每个数据流都拆分成很多互不依赖的帧,而这些帧可以交错(乱序发送),还可以分优先级。最后再在另一端根据每个帧首部的流标识符把它们重新组合起来。HTTP 2.0 连接都是持久化的,而且客户端与服务器之间也只需要一个连接(每个域名一个连接)即可。

头部压缩HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 要求通讯双方各自缓存一份首部字段表,从而避免了重复传输。

请求优先级浏览器可以在发现资源时立即分派请求,指定每个流的优先级,让服务器决定最优的响应次序。这样请求就不必排队了,既节省了时间,也最大限度地利用了每个连接。

服务端推送服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。

web资源

在这里插入图片描述
在访问浏览页时,一个网页上有各种各样的资源。而资源分为两种:

  • 1、静态资源:无需服务器端做出处理,拿到什么样就出现什么样。
  • 2、动态资源:需要服务器端通过执行程序进行处理,将处理的结果发送给客户端。
    注意:一个页面在加载时会出现多个资源,每个资源都需要单独请求。 咱们看到是一整个页面,但是服务器端却需要将各个资源进行请求才行。它们之所以能组合到一块儿是因为排版的原因。
    URL(资源的标识机制,Uniform Resource Locator):用于描述服务器某特定资源的位置;

HTTP工作流程

在这里插入图片描述

根据上图来进行解释:

  • 1、客户端发起请求,向服务器端寻求访问清华大学站点
  • 2、DNS解析清华大学站点的IP地址
  • 3、客户端与服务器建立TCP连接(需要三次握手)
  • 4、客户端发送请求报文给服务端,如:寻求访问的URL, 请求的方法等等…
  • 5、服务器接收请求
  • 6、服务器对请求报文进行分析,获取客户端需要访问的资源以及协议版本等等的相关信息。
  • 7、获取客户端请求到的资源。
  • 8、构建响应报文,
  • 9、发送响应报文,将客户端访问的资源发送给客户端。
  • 10、服务器将访问情况记录在日志中
  • 11、访问完成之后,TCP断开连接

HTTP报文

报文语法格式

            request报文
					<method> <request-URL> <version>
					<HEADERS>

					<entity-body>

		    response报文
					<version> <status> <reason-phrase>
					<HEADERS>

					<entity-body>
method(方法)

method:请求方法,标明客户端希望服务器进行对资源的操作
在这里插入图片描述
method有以下几种常见方法:

  • GET:从服务器中获取一个资源
  • HEAD:只从服务器中获取文档的响应首部
  • POST:向服务器发送要处理的数据。一般类似表单的填写都需要此方法
  • PUT:将请求的主题部分存储在服务器上
  • DELETE:请求删除服务器上指定的资源。
  • TRACE:追踪请求到达服务器中间经过的代理商
  • OPTIONS:请求服务器返回对指定资源支持使用的请求方法

status(状态码)

在这里插入图片描述
status:状态码,用来标记请求处理过程中发生的情况

status解释
100-101信息提示,一般很少出现
200-206成功,表示请求的所有数据已经成功返回
300-305重定向
400-415错误,客户端错误
500-505错误,服务器端错误

常见的几种状态码:

200:表示服务器端成功处理了请求。返回客户端想访问的网页
301:请求的URL指向的资源已经被删除,但在响应报文中首部的location处指明了资源现在所在的新位置。
302:与301相似,但在响应报文中的首部location处指明了资源现在所在的临时位置。
304:如果客户端发送了带有条件式的方法进行访问,而文档内容并没有发生改变,服务器就会响应此状态码
401:需要输入账号和密码的认证方式才能访问资源
403:请求被禁止
404:服务器无法找到客户请求的资源
500:服务器内部错误
502:代理服务器从后端服务器接收到了一条伪响应

HEADERS

Headers:每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值

首部的分类:通用首部,请求首部,响应首部,实体首部,扩展首部

!

在这里插入图片描述

通用首部

Date:报文的创建时间
Connection:连接状态,如keepalive,close
Via:显示报文经过的中间节点(也就是代理服务器)
Cache-control:控制缓存

请求首部

Accept:通过服务器自己可接受的媒体类型(如:text/html, application/xml…)
Accept-encoding:接收编码格式,一般指压缩机制,如:gzip,deflate,sdch等
Accept-language:接受的语言
Host:请求的服务器名称和端口
Referer:指当前的资源是由哪个资源转过来的
User-agent:客户端代理

条件式请求首部

if-modified-since: 自从指定时间后,请求的资源是否发生过修改
if-none-match:本地缓存中存储的文档的ETag标签是否与服务器文档的Etag不匹配;

安全请求首部

Authorization:向服务器发送认证信息,如账号和密码
Cookie:客户端向服务器发送cookie

http是无状态的,无法追踪用户,那么服务器怎么来追踪用户?cookie就像独一无二的令牌,在用户访问浏览页时,将cookie发送给用户,并在服务器端建立一个文件专门存放用户的cookie。当用户重新访问时,服务器会根据匹配用户请求的cookie来追踪用户。

代理请求首部

Proxy-Authorization: 向代理服务器认证

响应首部
信息

age:响应持续时长
Server:服务器程序软件名称和版本; 一般在服务器端要移除此项

协商首部

accept-ranges:服务器可接受的请求范围类型
Vary:服务器查看其它首部列表

安全响应首部

set-cookie:向客户端设置cookie
WWW-Authenticate:来自服务器的对客户端的质询认证表单

实体首部

Allow:列出对此实体可使用的请求方法
Location:告诉客户端真正的实体位于何处
Content-Length: 主体的长度
Content-Location: 实体真正所处位置;
Content-Type:主体的对象类型

HTTPD

HTTPD简介

Apache HTTP Server(简称Apache),中文名:阿帕奇,是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。

HTTPD特性

Apache支持许多特性,大部分通过编译的模块实现。这些特性从服务器端的编程语言支持到身份认证方案。一些通用的语言接口支持Perl,Python, Tcl, 和 PHP。流行的认证模块包括 mod_access, mod_auth 和 mod_digest。其他的例子有 SSL 和 TLS 支持 (mod_ssl), 代理服务器 (proxy) 模块,很有用的URL重写(由 mod_rewrite 实现),定制日志文件 (mod_log_config),以及过滤支持(mod_include 和 mod_ext_filter)。Apache日志可以通过网页浏览器使用免费的脚本AWStats或Visitors来进行分析。
主要的特性如下:

  • 高度模块化: core + modules
  • DSO:dynamic shared object
  • MPM:Multipath processing Modules (多路处理模块)

MPM机制:
prefork:多进程模块,每个进程响应一个请求。

工作模式
一个主进程:负责生成和回收子进程;负责创建套接字,负责接收请求,并将请求派发给某子进程进行处理
n个子进程:每一个进程只能处理一个请求。

worker:多进程多线程模块,每个线程响应一个请求

工作模式
一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
n个子进程:负责生成多个线程
每个线程:负责响应用户请求

event:事件驱动模型,多线程模型,每个进程响应多个请求

工作模式
一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理
子进程:基于事件驱动机制直接响应多个请求;

httpd安装

httpd程序的主流版本:2.2和2.4
httpd直接在centos发行版中提供, 除非定制新功能等需要源码编译安装。否则尽量使用yum源来进行安装
centos6(http-2.2):

Name        : httpd
Arch        : x86_64
Version     : 2.2.15
Release     : 69.el6.centos
Size        : 3.0 M
Repo        : installed
From repo   : base
Summary     : Apache HTTP Server
URL         : http://httpd.apache.org/
License     : ASL 2.0
Description : The Apache HTTP Server is a powerful, efficient, and extensible
            : web server.

centos7(httpd-2.4):

名称    :httpd
架构    :x86_64
版本    :2.4.6
发布    :89.el7.centos
大小    :9.4 M
源      :installed
来自源  :updates
简介    : Apache HTTP Server
网址    :http://httpd.apache.org/
协议    : ASL 2.0
描述    : The Apache HTTP Server is a powerful, efficient, and extensible
       : web server.


httpd配置文件

centos6(httpd-2.2)

配置文件:
		/etc/httpd/conf/httpd.conf
		/etc/httpd/conf.d/*.conf 
服务脚本:
	    /etc/rc.d/init.d/httpd
脚本配置文件:
		/etc/sysconfig/httpd		
主程序文件:
		/usr/sbin/httpd	
		/usr/sbin/httpd.worker
		/usr/sbin/httpd.event
日志文件:
		/var/logs/httpd:
		access_log:	访问日志
		error_log: 错误日志
站点文档:
	 	/var/www/html
模块文件路径:
		/usr/lib64/httpd/modules
服务控制和启动:
		chkconfig  httpd  on|off
		service  {start|stop|restart|status|configtest|reload}  httpd	 					     		

centos7 (httpd-2.4)

配置文件:
    		/etc/httpd/conf/httpd.conf
    		/etc/httpd/conf.d/*.conf 
    systemd单元:
    	    /usr/lib/systemd/system/httpd.service	
    主程序文件:
    		/usr/sbin/httpd
    日志文件:
    		/var/logs/httpd:
    		access_log:	访问日志
    		error_log: 错误日志
    站点文档:
    	 	/var/www/html
    模块文件路径:
    		/usr/lib64/httpd/modules
    模块相关的配置文件:
    		/etc/httpd/conf.modules.d/*.conf
    服务控制和启动:
			systemctl  enable|disable  httpd.service
			systemctl  {start|stop|restart|status}  httpd.service				     		

常用配置

主配置文件:/etc/httpd/conf/httpd.conf

1、修改监听的IP和PORT

此处的配置2.2和2.4都适用
在这里插入图片描述
在这里插入图片描述

语法格式:Listen [IP-address:]portnumber [protocol]
	
	1、省略IP表示为0.0.0.0
	2、监听多个端口可以
    3、 修改监听socket,重启服务进程方可生效;
    4、 限制其必须通过ssl通信时,protocol需要定义为https
如果想要监听多个端口,直接在Listen的下一行添加一个即可
    Listen 80
    Listen 8080
检查语法使用:httpd -t
[root@localhost ~]# httpd -t
Syntax OK
[root@localhost ~]# ss -tnl
LISTEN     0      128                                         :::8080                                                    :::*                  
LISTEN     0      128                                         :::80 

2、保持连接,2.2和2.4是一样的配置

在这里插入图片描述
2.4版本在配置文件中并没有显式写出。但是两个版本写的方式是一样的。
保持连接:TCP在连接之后,每个资源在获取之后不全断开连接,而是继续等待其它资源请求的进行。
但长连接自身的缺陷是会一直占用着连接不释放,所以必须得给出一个长连接的超时时间。这个超时时间由KeepAliveTimeout指令控制,进入长连接后如果在此时间间隔内客户端还没有发送新请求,则TCP连接自动断开。如果在长连接状态下,客户端再次发送了请求,则服务端处理请求,并在处理完请求后又再次进入长连接状态并计算KeepAliveTimeout。

KeepAlive on|off    设置保持连接
KeepAliveTimeout  15    保持连接
MaxKeepAliveRequests  100    保持 连接的最大请求数量
对于并发访问量较大的服务器应该把保持连接给关掉。

3、ServerRoot指令

在这里插入图片描述
该指令设置httpd的安装位置,也就是常称之为的basedir,在此目录下应该具有module、logs等目录。此项为默认配置,bu不要去修改

4、DocumentRoot指令

在这里插入图片描述
DocumentRoot是文档的根目录,这个文档的意思是展现在网络上的文档。使用rpm包安装的httpd的DocumentRoot默认值为"/var/www"。设置DocumentRoot后,将需要在网络上访问的文件都放进此目录下即可。

DocumentRoot "/web/vhosts/"   如果改为这样,那么所有的网站文档全部放在此目录下,否则无法访问

5、SeverName和SeverAlias指令

在这里插入图片描述
SeverName用来标识web服务的主机名,只有在基于名称的虚拟机时该指令才是必须的。稍后配置基于名称的虚拟机时会用到此项。

例如: ServerName www.example.com

ServerAlias指令设置主机的备用名称,以便与基于名称的虚拟主机一起使用。该 ServerAlias可包含通配符,如果合适的话。

 例如:
<VirtualHost *:80>
  ServerName server.example.com
  ServerAlias server server2.example.com server2
  ServerAlias *.example.com
  UseCanonicalName Off
  # ...
</VirtualHost>
#该处ServerName和ServerAlias的作用是一样的。

6、VirtualHost指令

用于封装一组指令只作用于指定主机名或IP地址的虚拟主机上。
语法格式:

 <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>

Addr可以是以下任何一种,可选地后跟冒号和端口号(或*):

  • 虚拟主机的IP地址;
  • 虚拟主机IP地址的完全限定域名(不推荐);
  • 该字符*,充当通配符并匹配任何IP地址。
  • 字符串_default_,是别名*
<VirtualHost 10.1.2.3:80>
  DocumentRoot "/www/docs/host.example.com"
  ServerName host.example.com
</VirtualHost>

7、Options和Allowoverride指令

在这里插入图片描述
options用于开启网站索引选项,它的值有:All、None、ExecCGI、FollowSymLinks、Includes、IncludesNOEXEC、Indexes、MultiViews、SymLinksIfOwnerMatch。
一般options处于None值,如果需要开启下载选项时,一般会设置一个indexes选项。

AllowOverride 用于控制服务器是否读取".htaccess"配置文件。一般此处都设置为None值

8、Require指令(2.4)

在这里插入图片描述
Require用来控制谁有访问权限。
主要有以下几个值:

  • Require all granted
  • 无条件允许访问。
  • Require all denied
  • 无条件拒绝访问。
  • Require env env-var [env-var] …
  • 仅当设置了一个给定的环境变量时才允许访问。
  • Require method http-method [http-method] …
  • 仅允许对给定的HTTP方法进行访问。
  • Require expr expression
  • 如果expression的计算结果为true,则允许访问。

在这里插入图片描述
但是2.2版本不是使用require来控制访问权限,如上图

容器类指令

<\Directory>指令

在这里插入图片描述
Directory指令仅应用于指定目录,该目录的子目录以及相应目录中的文件。如上图,Directory下的所有指令只对/var/www有作用。
需要注意的是2.4版本中,每一个文件的需求都需要显式指定,如果不显式指定,将无法进行访问。而2.2版本不需要显式指定。

更多的指令可以去官网上查询 https://httpd.apache.org/docs/2.4/

使用httpd服务

题目

以当前的题目来进行说明:
1、建立httpd服务,要求:
(1) 提供两个基于名称的虚拟主机:
www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1/error_log,访问日志为/var/log/httpd/www1/access_log;
www2.stuX.com,页面文件目录为/web/vhosts/www2;错误日志为/var/log/httpd/www2/error_log,访问日志为/var/log/httpd/www2/access_log;
(2) 通过www1.stuX.com/server-status输出其状态信息,且要求只允许提供账号的用户访问;
(3) www1不允许192.168.1.0/24网络中的主机访问;

2、为上面的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
(1) 要求使用证书认证,证书中要求使用国家(CN),州(Beijing),城市(Beijing),组织为(MageEdu);
(2) 设置部门为Ops, 主机名为www2.stuX.com;

虚拟机的设置

启动httpd服务:

[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 一 2019-05-13 16:05:08 CST; 3h 7min ago
     Docs: man:httpd(8)
           man:apachectl(8)

修改主配置文件,让页面文件目录为/web/vhosts/。,2.4和2.2设置一样。按需创建制定的文件目录

DocumentRoot "/web/vhosts/"       #修改根文件目录
 # Further relax access to the default document root:
<Directory "/web/vhosts/">        #修改页面放置文件目录
[root@localhost ~]# mkdir -pv /web/vhosts
mkdir: 已创建目录 "/web"
mkdir: 已创建目录 "/web/vhosts"
[root@localhost ~]# cd /web/vhosts
[root@localhost vhosts]# mkdir www{1,2}

基于名称的虚拟主机创建
(1)在www1和www2目录下分别创建index.html,(2.2和2.4都是如此操作)

[root@localhost www1]# cat index.html
<h1>hello,www1</h1>     
[root@localhost www2]# cat index.html
<h1>hello www2</h1>

(2)为www1和www2进行httpd配置(2.4)

[root@localhost conf.d]# cat www1.conf 
<VirtualHost *:80>
	ServerName www1.stux.com
	DocumentRoot "/web/vhosts/www1"
	<Directory "/web/vhosts/www1/">
		Options None 
		Allowoverride None
		Require all granted
	</Directory>
</VirtualHost> 

[root@localhost conf.d]# cat www2.conf 
<VirtualHost *:80>
	ServerName www2.stux.com
	DocumentRoot "/web/vhosts/www2"
	<Directory "/web/vhosts/www2">
		Options None
		Allowoverride None
		Require all granted
	</Directory>
</VirtualHost>

(3)为两个虚拟主机配置DNS解析

[root@localhost ~]# cat /etc/named.rfc1912.zones
zone "stux.com" IN {
	type master;
	file "stux.com.zone";
};	
#在named.rfc1912.zones里添加zone区域


[root@localhost ~]# cat /var/named/stux.com.zone 
$TTL 3600
@	IN	SOA	stux.com.	admin.stux.com (
	01
	1H
	10M
	1D
	1D
)
	IN	NS	ns1.stux.com.
ns1	IN	A	192.168.199.190
www1	IN	A	192.168.199.190
www2	IN	A 	192.168.199.190
#添加区域数据文件

(4)测试按照名称进程主机访问
在这里插入图片描述
在这里插入图片描述
上述根据名称不同创建多个虚拟机。另外还有两种基于IP和基于PORT的不同来创建虚拟机。

(1)以IP不同来创建虚拟机,仍然以上边为例。


[root@localhost conf.d]# cat www1.conf
<VirtualHost 192.168.199.190:80>
	ServerName www1.stux.com
	DocumentRoot "/web/vhosts/www1"
	<Directory "/web/vhosts/www1">
		Options None	
		Allowoverride None	
		Require all granted
	</Directory>
</VirtualHost>
#上面为配置www1的虚拟机

[root@localhost conf.d]# cat www2.conf
<VirtualHost 192.168.199.100:80>
	ServerName www2.stux.com
	DocumentRoot "/web/vhosts/www2"
	<Directory "/web/vhosts/www2">
		Options None	
		Allowoverride None	
		Require all granted
	</Directory>
</VirtualHost>
#上面为配置www2的虚拟机

(2)以端口不同创建虚拟机

[root@localhost conf.d]# cat www1.conf
<VirtualHost 192.168.199.190:80>
	ServerName www1.stux.com
	DocumentRoot "/web/vhosts/www1"
	<Directory "/web/vhosts/www1">
		Options None	
		Allowoverride None	
		Require all granted
	</Directory>
</VirtualHost>
#上面为配置www1的虚拟主机

[root@localhost conf.d]# cat www2.conf
<VirtualHost 192.168.199.190:8080>
	ServerName www2.stux.com
	DocumentRoot "/web/vhosts/www2"
	<Directory "/web/vhosts/www2">
		Options None	
		Allowoverride None	
		Require all granted
	</Directory>
</VirtualHost>
#上面为配置www2的虚拟主机

上述所有操作都是基于2.4版本。以下为2.2版本。只演示基于名称的虚拟主机

[root@ydong ~]# uname -r
2.6.32-642.el6.x86_64
#查看系统版本

只说最后一步,因为前面的步骤都一样。
这里记录一下遇到的问题,在修改完httpd.conf中的访问目录后,发现网址没有权限。这是因为SElinux和防火墙开着。关掉之后,一切正常。

[root@ydong conf.d]# cat www1.conf
<VirtualHost *:80>
	ServerName www1.stux.com
	DocumentRoot "/web/vhosts/www1"
</VirtualHost>
#在/etc/httpd/conf.d/下创建www1的配置,此处跟2.4不一样,不用显式的给访问目录权限。2.4需要<Directory>给出显式的权限

[root@ydong conf.d]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.199.155 www1.stux.com
#在hosts文件中填上解析地址

访问www1.stux.com
在这里插入图片描述

httpd日志

httpd的日志分为错误日志error_log和访问日志customlog。错误日志一般采用默认即可,最多改下错误日志的存放路径,而CustomLog因为量比较多,很可能需要定制。事实上,ErrorLog由httpd的核心模块提供,而CustomLog却提供了专门的模块mod_log_config来处理,该模块还支持TransferLog指令,该指令和CustomLog作用和用法基本类似,如有需要可查官方手册,本文略过。(转载)

错误日志

在这里插入图片描述
错误日志error_log的级别logLevel:debug, info, notice, warn(默认), error, crit, alert, emerg。一般采用默认的即可,最多修改一下路径。

访问日志

访问日志
上图中Customlog决定了访问日志的存放位置,LogFormat是指定日志记录的事项。除非有特殊需求,一般使用默认即可。关于各个指令可以去官网查看http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats

为www1和www2添加日志,此处2.2和2.4一样。以下为2.4版本。

<VirtualHost *:80>
	ServerName www1.stux.com
	DocumentRoot "/web/vhosts/www1"
	<Directory "/web/vhosts/www1/">
		Options None 
		Allowoverride None
		Require all granted
	</Directory>
	LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
	Customlog "logs/www1/access_log" combined 
	Errorlog "logs/www1/error_log" 
	Loglevel warn
</VirtualHost> 
[root@localhost c

基于用户的访问控制

使用htpasswd生成用户的账号和密码、加密算法有MD5、SHA和系统上的crypt()函数。不指定算法时,默认使用MD5算法。
语法格式:htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username

常用选项解释
-c自动创建此处的文件,仅在不存在文件时使用
-mmd5加密格式
-sSHA加密格式
-b批量式添加用户

创建用户和用户密码:

[root@localhost conf.d]# htpasswd -c /tmp/htpasswd tom
New password: 
Re-type new password: 
Adding password for user tom

[root@localhost conf.d]# htpasswd -b /tmp/htpasswd tiger dongyifeeng
Updating password for user tiger

[root@localhost conf.d]# mv /tmp/htpasswd  ./.htpasswd

#需要将创建好的密码文件放置到某一个目录中,并将此重新定义为隐藏文件

定义安全区域:在原来www1.conf的基础上再次添加即可。2.2和2.4一样,以下为2.4版本

<VirtualHost *:80>
	ServerName www1.stux.com
	DocumentRoot "/web/vhosts/www1"
	<Directory "/web/vhosts/www1/">
		Options None 
		Allowoverride None
		AuthType Basic
		AuthName "plz enter your username and password"
		AuthUserFile "/etc/httpd/conf.d/.htpasswd"
		Require user tom jerry  #此处为设置哪个用户可以访问
	</Directory>
	LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
	Customlog "logs/www1/access_log" combined 
	Errorlog "logs/www1/error_log" 
	Loglevel warn
</VirtualHost> 

在这里插入图片描述

除了上述基于用户,也可以基于组的访问。就是将指定访问的用户放入一个组里。需要事先创建一个文件,里面按照GRP_NAME: username1 username2的方式写入。username必须是htpasswd创建的用户。

[root@localhost conf.d]# htpasswd -c -b /etc/httpd/conf.d/.person.grup.pass wang 123456 
Adding password for user wang

[root@localhost conf.d]# htpasswd  -b /etc/httpd/conf.d/.person.grup.pass li 123456 
Adding password for user li
#创建两个用户

[root@localhost conf.d]# cat person
person:wang li
#创建一个文本写入group名

<VirtualHost *:80>
	ServerName www1.stux.com
	DocumentRoot "/web/vhosts/www1"
	<Directory "/web/vhosts/www1/">
		Options None 
		Allowoverride None
		AuthType Basic
		AuthName "plz enter your username and password"
		AuthUserFile "/etc/httpd/conf.d/.htpasswd"
		Require user tom jerry
	    
	    #下面为基于组控制访问
		AuthUserFile "/etc/httpd/conf.d/.person.group.pass"
		AuthGroupFile "/etc/httpd/conf.d/person"
		Require group  person       
	</Directory>
	LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
	Customlog "logs/www1/access_log" combined 
	Errorlog "logs/www1/error_log" 
	Loglevel warn
</VirtualHost> 


status页面以及控制访问来源

status页面主要用来显示apache的运行状态,这个页面不是任何人都可以访问的。应该对其进行账号控制访问。(2.2和2.4一样,以下为2.4)

[root@localhost conf.d]# cat status.conf
<Location /server-status>
	SetHandler server-status   ##这个是Apache的内建命令,不能更改
	AuthType Basic
	AuthName "name and password"
	AuthUserFile "/etc/httpd/conf.d/.htpasswd"  
	Require valid-user
</Location>

控制来源访问
2.4版本 使用Require not ip 或者 not host。这里记录一下我遇到的问题,指名not ip时需要写上一个至少能成功的地址。这样指令才会生效

<VirtualHost *:80>
	ServerName www1.stux.com
	DocumentRoot "/web/vhosts/www1"
	<Directory "/web/vhosts/www1/">
		Options None 
		Allowoverride None
		<RequireAll>
		Require not ip 192.168.199.190
		Require ip 192.168
		</RequireAll>	
	</Directory>
	LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
	Customlog "logs/www1/access_log" combined 
	Errorlog "logs/www1/error_log" 
	Loglevel warn
</VirtualHost> 

2.2版本
允许所有访问时,order allow,deny allow from all 下面为拒绝192.168.199.190的例子

[root@ydong conf.d]# vim www1.conf
[root@ydong conf.d]# cat www1.conf
<VirtualHost *:80>
	ServerName www1.stux.com
	DocumentRoot "/web/vhosts/www1"
	<Directory "/web/vhosts/www1">
		Options None
		Allowoverride None
		order deny,allow      #此处是拒绝的话,要把deny写在前面
		deny from 192.168.199.190
	</Directory>
	Customlog "logs/www1/access_log" combiend
</VirtualHost>

配置httpd支持https

(1)创建私有CA

#生成密钥
[root@localhost CA]# (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
Generating RSA private key, 4096 bit long modulus
............................................................................++
....................................................................................................................................................................................++
e is 65537 (0x10001)

#生成自签证书
[root@localhost CA]# openssl req -new -x509 -key /etc/pki/CA/private/cdkey.pem -out /etc/pki/CA/cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BeiJing
Locality Name (eg, city) [Default City]:BeiJing
Organization Name (eg, company) [Default Company Ltd]:Magedu    
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:a           
Email Address []:admin@qq.com

#为CA提供文件和目录
[root@localhost CA]# touch serial index.txt
[root@localhost CA]# echo 01 > serial


#http请求签证,生成密钥
[root@localhost ssl]# (umask 077; openssl genrsa -out /etc/httpd/httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
......+++
.............................................+++
e is 65537 (0x10001)


#生成证书请求
[root@localhost ssl]# openssl req -new -key /etc/httpd/httpd.key -out /etc/httpd/httpd.csr -days 30
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BeiJing
Locality Name (eg, city) [Default City]:BeiJing
Organization Name (eg, company) [Default Company Ltd]:Magedu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:a
Email Address []:abc@qq.com     

#CA主机签署证书
[root@localhost CA]# openssl ca -in /tmp/httpd.csr  -out /etc/pki/CA/certs/httpd.crt -days 30
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: May 15 01:53:56 2019 GMT
            Not After : Jun 14 01:53:56 2019 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = BeiJing
            organizationName          = Magedu
            organizationalUnitName    = Ops
            commonName                = www1.stux.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                70:CD:AC:A4:37:A3:D1:77:E4:F3:78:21:28:B6:DC:67:E3:06:01:D9
            X509v3 Authority Key Identifier: 
                keyid:10:92:B3:F5:10:BB:56:54:FA:99:1C:17:01:85:7F:32:E8:78:75:B5

Certificate is to be certified until Jun 14 01:53:56 2019 GMT (30 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


安装mod_ssl,配置SSL使用的证书

[root@www1 conf.d]# yum install -y mod_ssl

[root@www1 conf.d]# ls | grep ssl.conf 
ssl.conf
#修改ssl.conf配置

在这里插入图片描述
在这里插入图片描述
将CA主机上的自签证书发送给需要https连接的服务器上。并导入到浏览器中。

[root@localhost CA]# ls | grep cacert.pem 
cacert.pem
#将上述文件复制到需要https连接的服务器上

在这里插入图片描述

PS:其实写的不是很全面,有好多东西还没写到,大家可以上网多多查看,如有错误,望多多包涵。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP协议以及Apache的httpd配置 的相关文章

随机推荐