HTTP协议
- 前言
- HTTP简介
- HTTP诞生
- HTTP版本历史
- HTTP/0.9
- HTTP/1.0
- HTTP/1.1
- HTTP/2.0
- web资源
- HTTP工作流程
- HTTP报文
-
- 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)**
- 容器类指令
-
- 使用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 | 自动创建此处的文件,仅在不存在文件时使用 |
-m | md5加密格式 |
-s | SHA加密格式 |
-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(使用前将#替换为@)