1、基于组账号认证
1、定义安全域
vim /etc/httpd/conf.d/test.conf
<directory /app/vebsite1/secret>
authtype basic
authname "secret directory"
authuserfile "/etc/httpd/conf.d/.httpusers"
authgroupfile "/etc/httpd/conf.d/.httpgroup"
require group website1
</directory>
2、创建用户账号和组账号文件;
htpasswd -s .httpusers heihei ---创建用户账号文件
[root@centos6 conf.d]#!cat ---查看用户账号文件
cat .httpusers
hehe:vb2LD0bz6/d5k
haha:{SHA}Jd07W9uPYMtdvlsDI7QXYPbbIcY=
xixi:{SHA}Jd07W9uPYMtdvlsDI7QXYPbbIcY=
heihei:{SHA}Jd07W9uPYMtdvlsDI7QXYPbbIcY=
vim /etc/httpd/conf.d/.httpgroup ---创建组账号文件
website1:hehe haha
website2:xixi heihei
3、service httpd reload
2、远程客户端和用户验证的控制
Satisfy ALL|Any
ALL 客户机IP和用户验证都需要通过才可以
Any客户机IP和用户验证,有一个满足即可
[root@centos6 ~]#vim /etc/httpd/conf.d/test.conf
<directory /app/vebsite1/secret>
authtype basic
authname "secret directory"
authuserfile "/etc/httpd/conf.d/.httpusers"
require valid-user
order allow,deny
allow from 172.18.21.107
satisfy all ---表示基于身份验证和ip地址都要满足才能访问这个这个目录
</directory>
3、虚拟主机配置
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址
基于port:为每个虚拟主机使用至少一个独立的port
基于FQDN:为每个虚拟主机使用至少一个FQDN
注意:一般虚拟机不要与main主机混用;因此,要使用虚拟主机,一般先禁用main主机
禁用方法:注释中心主机的DocumentRoot指令即可
[root@master ~]# vim /etc/httpd/conf/httpd.conf
#DocumentRoot "/var/www/html" #注释掉中心主机
实验步骤
一、基于ip地址
1、创建三个网页文件
mkdir /app/website{1,2,3}
echo /app/website1/index.html > /app/website1/index.html
echo /app/website2/index.html > /app/website2/index.html
echo /app/website3/index.html > /app/website3/index.html
2、增加三个ip地址
ip addr add 172.18.21.1/16 dev eth2
ip addr add 172.18.21.2/16 dev eth2
ip addr add 172.18.21.3/16 dev eth2
3、vim /etc/httpd/conf.d/test.conf
<virtualhost 172.18.21.1:80>
DocumentRoot "/app/website1"
</virtualhost>
<virtualhost 172.18.21.2:80>
DocumentRoot "/app/website2"
</virtualhost>
<virtualhost 172.18.21.3:80>
DocumentRoot "/app/website3"
</virtualhost>
二、基于端口号
vim /etc/httpd/conf.d/test.conf
listen 172.18.21.1:81
listen 172.18.21.1:82
listen 172.18.21.1:83
<virtualhost 172.18.21.1:81>
DocumentRoot "/app/website1"
</virtualhost>
<virtualhost 172.18.21.1:82>
DocumentRoot "/app/website2"
</virtualhost>
<virtualhost 172.18.21.1:83>
DocumentRoot "/app/website3"
</virtualhost>
三、基于FQDN
1、vim /etc/httpd/conf.d/test.conf
namevirtualhost *:80 ---要想基于FQDN,必须加上这一项,指定是以名称的方式搭建虚拟主机
<virtualhost *:80>
servername www.a.com --- 虚拟主机名字,也就是将来用户访问网站时用到的FQDN域名,这里创建了三个虚拟主机
DocumentRoot "/app/website1"
ErrorLog logs/www.a.com-error_log ---指定错误日志的路径
CustomLog logs/www.a.com-access_log common ---指定访问日志的路径,并定义类型,common类型在主配置文件里面已经定义了,在这里就不用加上LogFormat这一行了。
<directory "/app/website1"> ---访问www.a.com时需要基于身份验证
authtype basic
authname "access"
authuserfile "/etc/httpd/conf.d/.httpusers"
require user xixi haha
</directory>
</virtualhost>
<virtualhost *:80>
servername www.b.net
DocumentRoot "/app/website2"
ErrorLog logs/www.b.net-error_log
CustomLog logs/www.a.com-access_log common
</virtualhost>
<virtualhost *:80>
servername www.c.org
DocumentRoot "/app/website3"
ErrorLog logs/www.c.org-error_log
CustomLog logs/www.c.org-access_log common
</virtualhost>
2、搭建一个dns服务器,地址为172.18.21.107,使这个三个域名解析后都指向同一个ip地址,在这里都是172.18.21.106 这个主机,因为你要在这个主机上搭建三个虚拟主机即三个web网站。
3、在windows上将dns修改为172.18.,21.107,然后进行测试访问
http://www.a.com/
http://www.b.net/
http://www.c.org/
links http://www.c.org/ ---也可以用这个命令在linux主机的字符界面访问,但这个主机的dns要指向172.18.21.107
总结: 基于FQDN的虚拟主机是生产中最常用的,一般我们在搭建虚拟主机时,要将main主机禁用,但如果不禁用,基于ip和端口号创建虚拟主机时main主机不会失效,访问main主机的主站点文件时仍然可以访问到,但如果基于FQDN创建时,main主机就会失效,这个时候如果访问main主机的主站点时,就会跳到虚拟主机的主站点,并且谁是第一个虚拟主机时就会跳到谁那里。因此创建虚拟主机时最好将main主机禁用。当基于FQDN创建虚拟主机后,如果用http://172.18.21.106/,默认访问的是第一个虚拟主机的主网站文件。
4、status页面
1、 查看一下 status_module这个模块是否安装了
[root@centos6 conf.d]#httpd -M |grep status
Syntax OK
status_module (shared)
2、在配置文件中要定义这个模块
vim /etc/httpd/conf/httpd.conf
LoadModule status_module modules/mod_status.so
3、vim /etc/httpd/conf.d/status.conf ---创建一个配置文件
<location /server-status> --- /server-status是个URL,这个目录是自己随便定义的一个虚拟的目录
sethandler server-status
order allow,deny
allow from 172.18
</location>
ExtendedStatus On ---加上这一行会显示的更详细一些
访问这个网站就可以看到服务器的状态信息了
5、http协议
①http协议
http/0.9, http/1.0, http/1.1, http/2.0
http协议:stateless 无状态
服务器无法持续追踪访问者来源,也就是当你第二次访问这个服务器时,服务器又不知道你是谁了。
解决http协议无状态方法
cookie :客户端存放,分为两种,一种为重cookie,一种为轻cookie,比如你在淘宝上买东西放到购物车里的东西,服务器会将你的登录信息和一些购物车里的信息以cookie的形式发送给你,并存储在你的主机上,当你下次用同一个主机去访问淘宝时,你会携带这个cookie信息,这时服务器就知道你的身份了,这样购物车里的东西就不会丢失,这种称为重cookie,轻cookie只存放你的登录信息。cookie是服务器端生成后传给客户端的。在浏览器的选项/设置--->高级设置---->网页内容高级设置中可以看到cookie。
session :服务器端存放,cookie要配合session使用,因为cookie只是存放在特定的主机,换了主机之后你之前访问的信息,比如购物车里面的信息又丢失了,session的作用就是将你的cookie里面的登录信息和网站访问记录到一个session表里,并且存储到服务器上,下次你登录淘宝的时候,服务器就会和session里面记录的一些登录信息对比,发现是你的登录信息,就识别出了你,你的访问记录及购物车里面的东西不会丢失。
http事务:一次访问的过程
请求:request
响应:response
②HTTP请求报文和响应报文
③报文语法格式:
request报文
<method> <request-URL> <version>
<headers>
<entity-body>
response报文
<version> <status> <reason-phrase>
<headers>
<entity-body>
method: 请求方法,标明客户端希望对服务器资源执行的动作。
Method 方法:
GET:从服务器获取一个资源
HEAD:只从服务器获取文档的响应首部
POST:向服务器输入数据,比如字符串等,通常会再由网关程序继续处理
PUT:将请求的主体部分存储在服务器中,如上传文件
DELETE:请求删除服务器上指定的文档
TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持使用的请求方法
version:
HTTP/<major>.<minor>,比如HTTP/1.1---目前用的比较多的协议类型
status:
三位数字,如200,301, 302, 404, 502; 标记请求处理过程中发生的情况
reason-phrase:
状态码所标记的状态的简要描述
headers:
每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟一个可选空格,接着是一个值
entity-body:请求时附加的数据或响应时附加的数据
④http协议状态码分类
status(状态码):
1xx:100-101信息提示
2xx:200-206成功
3xx:300-305重定向
4xx:400-415错误类信息,客户端错误
5xx:500-505错误类信息,服务器端错误
常用的状态码
200:成功,请求数据通过响应报文的entity-body部分发送;OK
301:请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently,表示永久重定向,在配置文件里设置网站的别名时就是永久的重定向。
[root@centos6 conf.d]#curl -I www.360buy.com
HTTP/1.1 301 Moved Permanently ---表示永久重定向
Server: JDWS/2.0
Date: Thu, 28 Sep 2017 14:55:26 GMT
Content-Type: text/html
Content-Length: 272
Connection: keep-alive
Location: http://www.jd.com/ ---新的网站的位置
Via: BJ-H-NX-112(), http/1.1 ZZ-CM-1-JCS-145 ( [cRs f ])
Age: 1353
302:响应报文Location指明资源临时新位置Moved Temporarily,是临时重定向。
[root@centos6 conf.d]#curl -I www.jd.com
HTTP/1.1 302 Moved Temporarily ---表示临时重定向
Server: JDWS/2.0
Date: Thu, 28 Sep 2017 14:56:51 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive
Location: https://www.jd.com/ ---新的网站是https
Strict-Transport-Security: max-age=360
304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified,表示服务器端是利用缓存把资源发送给客户端,可以用ctrl+f5强制刷新。
401:需要输入账号和密码认证方能访问资源;Unauthorized,基于basic认证登录时会在日志里面发现这个状态码。
403:请求被禁止;Forbidden,一个原因是服务器的配置文件里面设定了允许哪些主机访问,另外一个原因可能是你访问的文件夹文件系统的权限不足。
404:服务器无法找到客户端请求的资源;Not Found
500:服务器内部错误;Internal Server Error
502:代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;Bad Gateway
503 :服务不可用,临时服务器维护或过载,服务器无法处理请求
504:网关超时
总结:method是客户端请求服务器端要做什么,而状态码是服务器端返回给客户端的状态信息。
更多信息可以参考火狐浏览器:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
⑤http协议首部
首部的分类:通用首部、请求首部、响应首部、实体首部、扩展首部
通用首部:
Date: 报文的创建时间
Connection:连接状态,如keep-alive, close
Via:显示报文经过的中间节点(代理,网关)
Cache-Control:控制缓存,如缓存时长
MIME-Version:发送端使用的MIME版本
请求首部:
Accept:通知服务器自己可接受的媒体类型
Accept-Charset:客户端可接受的字符集
Accept-Encoding:客户端可接受编码格式,如gzip
Accept-Language:客户端可接受的语言
Client-IP: 请求的客户端IP
Host: 请求的服务器名称和端口号
Referer:跳转至当前URI的前一个URL
User-Agent:客户端代理,浏览器版本
6、curl命令和elinks工具
curl [options] [URL...]
-A/--user-agent <string> 设置用户代理发送给服务器
-e/--referer<URL> 来源网址
--cacert<file> CA证书(SSL)
-k/--insecure 允许忽略证书进行SSL 连接
--compressed 要求返回是压缩的格式
-H/--header <line>自定义首部信息传递给服务器
-i显示页面内容,包括报文首部信息
-I/--head 只显示响应报文首部信息
-D/--dump-header <file>将url的header信息存放在指定文件中
--limit-rate <rate> 设置传输速度
--basic 使用HTTP基本认证
-u/--user <user[:password]>设置服务器的用户和密码
-L 如果有3xx响应码,重新发请求到新位置,进行强制重定向
-o<file> 将网络文件保存为指定的文件中
-O使用URL中默认的文件名保存文件到本地
-0/--http1.0 使用HTTP 1.0
-C -选项可对文件使用断点续传功能
-c/--cookie-jar <file name> 将url中cookie存放在指定文件中
-x/--proxy <proxyhost[:port]> 指定代理服务器地址
-X/--request <command> 向服务器发送指定请求方法
-U/--proxy-user <user:password> 代理服务器用户和密码
-T 选项可将指定的本地文件上传到FTP服务器上
--data/-d 方式指定使用POST方式传递数据
elinks工具:
elinks[OPTION]... [URL]...
-dump: 非交互式模式,将URL的内容输出至标准输出
-source:打印源码
用法和links相同。
示例
curl -A "IE8" www.a.com ---设置用户代理发送给服务器,也就是可以伪造浏览器的类型,在日志里面可以查到
curl -e www.baidu.com www.a.com ---可以伪造从哪跳转而来
curl -H "host: www.org" www.a.com ---构造一个首部信息发给服务器
curl -D /app/head www.a.com ---将响应报文的首部信息存放到指定文件中
curl --limit-rate 1024 -o /app/f1.log http://www.a.com/f1.html ---设置传输速度为1kB/s
curl --basic -u haha:123456 www.c.org ---访问网站的时候直接把用户名和密码都加上
curl -L www.360buy.com ---可以显现自动跳转至新页面,不加-L只会报错但不会跳转,浏览器会自动跳转
curl -O ftp://172.18.0.1/pub/ks/CentOS-6.9-x86_64.cfg
---使url中的CentOS-6.9-x86_64.cfg这个文件保存到当前目录下
curl -c /app/baiducookie www.baidu.com ---将url中的cookie存放到指定目录中
7、mod_deflate模块,使服务器端支持文件压缩
使用deflate_module模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持
(2) 压缩适于压缩的资源,例如文本文件
Level of compression (Highest 9 -Lowest 1)
DeflateCompressionLevel 9
示例
[root@centos6 conf.d]#httpd -M |grep "deflate_module"
Syntax OK
deflate_module (shared) ---发现这个模块已经加载了
vim /etc/httpd/conf.d/test2.conf
LoadModule deflate_module modules/mod_deflate.so ---这一行不需要写了,因为这个模块已经加载了,说明在主配置文件中已经写了,这里的modules/mod_deflate.so是相对路径,是相对于/etc/httpd的目录,因为主配置文件中已经规定了ServerRoot "/etc/httpd",所以在配置文件中一般都是用相对路径表示,就是相对于这个目录
SetOutputFilter DEFLATE
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain ---设置压缩的文件格式,这个是txt文本格式
AddOutputFilterByType DEFLATE text/html ---这个是html文本格式
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
测试
[root@centos6 app]#curl --compressed -I http://www.a.com/f1.html
HTTP/1.1 200 OK
Date: Fri, 29 Sep 2017 02:07:54 GMT
Server: Apache
Last-Modified: Fri, 29 Sep 2017 01:27:33 GMT
ETag: "c0004-706-55a49ede22dd1"
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip ---发现已经压缩了
Content-Length: 431 ---压缩后文件的大小为431个字节
Connection: close
Content-Type: text/html; charset=UTF-8
[root@centos6 website1]#ll f1.html
]-rw-r--r-- 1 root root 1798 Sep 29 09:27 f1.html ---原文件的大小为1798个字节,看来压缩比还是很大的
8、https的实现
https:http over ssl
SSL会话的简化过程
(1) 客户端发送可供选择的加密方式,并向服务器请求证书
(2) 服务器端发送证书以及选定的加密方式给客户端,这个证书是用CA的私钥加密的服务器的公钥以及证书的有效期等信息,也就是CA数字签名的证书。
(3) 客户端取得证书并进行证书验证
如果信任给服务器发证书的CA,客户端会实验得到CA的公钥
(a) 验证证书来源的合法性;用CA的公钥解密证书上数字签名
(b) 验证证书的内容的合法性:完整性验证
(c) 检查证书的有效期限
(d) 检查证书是否被吊销
(e) 证书中拥有者的名字,与访问的目标主机要一致
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
(5) 服务用此密钥加密用户请求的资源,响应给客户端
注意:SSL是基于IP地址实现,单IP的主机仅可以使用一个https虚拟主机
实现过程如下:
需要四台主机,a是客户端,b是web服务器,c是dns服务器,d是提供CA的主机
1、在b上创建一个虚拟主机www.a.com
2、在c上搭建dns服务器,用于解析www.a.com这个域名,如果不搭建dns也可以用本机的hosts文件,windows中的hosts文件在c:\Windows\System32\drivers\etc\hosts
3、在d上搭建CA
cd /etc/pki/CA ---进入CA的主目录
(umask 066;openssl genrsa -out private/cakey.pem 4096) ---生成私钥
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650 ---生成CA自签名证书
openssl x509 -in cacert.pem -nonot -text ---查看证书
touch index.txt ---创建数据库文件
echo 01 >serial ---创建证书编号文件
3、在b服务器端发起证书请求
mkdir /etc/httpd/conf.d/ca ---创建一个目录专门存放证书的相关文件
cd /etc/httpd/conf.d/ca
(umask 066;openssl genrsa -out httpd.key 1024) ---生成私钥
openssl req -new -key httpd.key -out httpd.csr ---生成证书签名请求文件,这个过程中要填入www.a.com这个主机名,也就是这个证书将来是给这个web网站使用的。
scp httpd.csr 172.18.21.107:/etc/pki/CA
3、在d上颁发证书
openssl ca -in httpd.csr -out httpd.crt -days 365
scp certs/httpd.crt 172.18.21.106:/etc/httpd/conf.d/ca ---将web网页的证书文件和CA自签名的证书文件都传给服务器端
scp cacert.pem 172.18.21.106:/etc/httpd/conf.d/ca
[root@centos6 ca]#ls ---在b上查看有这些证书文件
cacert.pem httpd.crt httpd.csr httpd.key
4、在b上安装mod_ssl软件包
yum install mod_ssl ---这个软件包是提供https服务用的
rpm -ql mod_ssl
5、在b上修改https的配置文件
vim /etc/httpd/conf.d/ssl.conf
DocumentRoot "/app/website1" ---指明https的主目录,这个目录和http服务的主目录可以不相同,但一般情况下应该是相同的,不能客户通过http和https访问同样的站点里面的内容不一样
SSLCertificateFile /etc/httpd/conf.d/ca/httpd.crt ---指明证书文件的路径
SSLCertificateKeyFile /etc/httpd/conf.d/ca/httpd.key ---指明私钥文件路径
SSLCACertificateFile /etc/httpd/conf.d/ca/cacert.pem ---指明CA自签名证书文件路径
service httpd restart
6、测试
将windows机器上的dns指向c的dns服务器地址,并将a上的dns也改成c的nds服务器地址
①网页上测试
打开网页https://www.a.com/会提示证书不受信任,只要将CA自签名的证书安装成受信任的证书机构即可,注意只需要安装根证书就可以。
②a上测试
[root@centos6 html]#curl -k https://www.a.com---linux中字符界面下也可以测试,-k表示忽略证书进行ssl连接
[root@centos6 app]#ls /app
cacert.pem CentOS-6.9-x86_64.cfg centos6_boot.iso f1.log head
[root@centos6 app]#curl --cacert cacert.pem https://www.a.com/ ---也可以用这个命令,但要将b上的CA证书文件传到a上才可以
/app/website1/index.html
[root@centos6 app]#openssl s_client -connect www.a.com:443
GET / http/1.1 ---指明方法和协议
host: www.a.com ---注意输完这个命令后要输入两次回车才能完成命令,可以显示响应报文的头部信息和要页面内容
9、http重定向https
将http请求转发至https的URL
重定向
Redirect [status] URL-path URL
status状态分为两种:
Permanent(永久重定向):Returnsa permanent redirect status (301) indicating that the resource has moved permanently
Temp(临时重定向):Returnsa temporary redirect status (302). This is the default
示例:
1、创建配置文件
vim /etc/httpd/conf.d/test2.conf
redirect temp / https://www.a.com/ ---表示访问http主目录就临时重定向跳转至https://www.a.com/
2、测试
①网页端测试
访问http://www.a.com/ 会跳转至https://www.a.com/
②linux端测试
[root@centos6 app]#curl -I http://www.a.com
HTTP/1.1 302 Found ---302表明是临时重定向
Date: Fri, 29 Sep 2017 06:36:33 GMT
Server: Apache
Location: https://www.a.com/ ---重定向到https
Connection: close
Content-Type: text/html; charset=iso-8859-1
10、HSTS
HSTS:HTTP Strict Transport Security
服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在内部做307跳转到HTTPS,而无需任何网络过程
支持HSTS后只需要两步就实现跳转,而且只有第一次跑到服务器端进行跳转,下一次访问就直接在浏览器端就进行跳转了,浏览器已经记住了这个网站的服务器支持HSTS,这样既提高了效率又比较安全
HSTS preload list
是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也会采用这个列表,也就是解决了上面的第一次跑到服务器端进行跳转的问题,直接在浏览器端就进行了跳转,更安全,不过这个是浏览器自己设置的功能。
实验
1、修改配置文件
vim test2.conf
redirect temp / https://www.a.com/
Header always set Strict-Transport-Security "max-age=15768000"
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302]
2、测试
在网页端进行测试的时候看不出来,只有在字符界面下会出现多一行内容,表示支持HSTS
[root@centos6 app]#curl -I http://www.a.com
HTTP/1.1 302 Found
Date: Fri, 29 Sep 2017 06:53:19 GMT
Server: Apache
Strict-Transport-Security: max-age=15768000 ---这一行就表示支持HSTS,一般的服务器都会增加HSTS功能,因为比较安全
Location: https://www.a.com/
Connection: close
Content-Type: text/html; charset=iso-8859-1
11、httpd自带的工具程序和压力测试工具
- httpd自带的工具程序
htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具
apachectl:httpd自带的服务控制脚本,支持start和stop
apxs:httpd-devel包提供,扩展httpd使用第三方模块工具
rotatelogs:日志滚动工具
access.log -->
access.log, access.1.log -->
access.log, acccess.1.log, access.2.log
suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行 - httpd的压力测试工具
ab [OPTIONS] URL
来自httpd-tools包
-n:总请求数
-c:模拟的并行数
-k:以持久连接模式测试
ulimit–n # 调整能打开的文件数
[root@centos6 app]#ab -c 100 -n 1000 http://www.a.com/ ---注意com后面要加/,不然识别不了,表示一次并行执行100个请求,一共执行1000个请求