文章目录
- 什么是服务
可以响应请求报文,对外提供服务
一、Apache服务
Apache http server简称Apache,是Apache软件基金会的一个高性能、功能强大、健壮可靠、又灵活的开放源代码的web服务软件,它可以运行在广泛的计算机平台上如Linux、Windows。因其平台性和很好的安全性而被广泛使用,是互联网最流行的web服务软件之一
- 特点
- 功能强大
- 高度模块化
- 采用MPM多路处理模块
- 配置简单
- 速度快
- 应用广泛
- 性能稳定可靠
- 可做代理服务器或负载均衡来使用
- 双向认证
- 支持第三方模块
- 应用场合
- 使用Apache运行静态HTML网页、图片
- 使用Apache结合PHP、Linux、Mysql可以组成LAMP经典架构
- 使用Apache作代理、负载均衡等
- MPM工作模式
- prefork:多进程I/O模型,一个主进程,管理多个子进程,一个子进程处理一个请求。
- worker:复用的多进程I/O模型,多进程多线程,一个主进程,管理多个子进程,一个子进程管理多个线程,每个线程处理一个请求。
- event:事件驱动模型,一个主进程,管理多个子进程,一个进程处理多个请求
二、Apache安装
- httpd命令
httpd 为apache http server服务提供的工具
-c:在读取配置⽂件前,先执⾏选项中的指令。
-C:在读取配置⽂件后,再执⾏选项中的指令。
-d<服务器根⽬录>:指定服务器的根⽬录。
-D<设定⽂件参数>:指定要传⼊配置⽂件的参数。
-f<设定⽂件>:指定配置⽂件。
-h:显示帮助。
-l:显示服务器编译时所包含的模块。
-L:显示httpd指令的说明。
-S:显示配置⽂件中的设定。
-t:测试配置⽂件的语法是否正确。
-v:显示版本信息。
-V:显示版本信息以及建⽴环境。
-X:以单⼀程序的⽅式来启动服务器。
安装httpd
yum install -y httpd
echo '<h1>It works!</h1>' > /var/www/html/index.html
systemctl start httpd
systemctl stop firewalld
setenforce 0
在本地进行测试
curl <IP地址> -I
wget <http://IP地址>
- 文件说明
/etc/httpd/:主配置文件目录
/etc/httpd/conf/httpd.conf:服务配置文件
/etc/httpd/conf.d/:服务配置目录(模块化)
/etc/httpd/conf.modules.d/:模块配置目录
/etc/sysconfig/httpd:守护进程配置文件
/usr/lib64/httpd/modules/:可用模块
/usr/sbin/:相关命令目录
/var/log/httpd/:日志目录
/var/www/:站点目录
- 主配置文件
##主配置说明##
[root@node3 ~]# grep "^[^ #]" /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd" # 服务器的根
Listen 80 # 监听的端口
Include conf.modules.d/*.conf # 包含模块
User apache # 用户
Group apache # 属组
ServerAdmin root@localhost # 服务器管理员
<Directory />
AllowOverride none
Require all denied
</Directory> # <Directory>和</Directory>用于封装一组指令,使之仅对某个 目录及其子目录生效。
DocumentRoot "/var/www/html"
ErrorLog "logs/error_log" # 错误日志
LogLevel warn # 日志等级
EnableSendfile on # 开启
IncludeOptional conf.d/*.conf # 虚拟服务器配置文件
说明:<></>此类称之为容器,针对某个容器做配置
apache功能模块
- httpd 有静态功能模块和动态功能模块组成,分别使用
httpd -l
和httpd -M
查看 - Dynamic Shared Object,加载动态模块配置,不需重启即生效
- 动态模块所在路径:
/usr/lib64/httpd/modules/
- 主配置
/etc/httpd/conf/httpd.conf
文件中指定加载模块配置文件 - apache模块功能介绍
- http://httpd.apache.org/docs/2.4/zh-cn/mod/
- 加载模块示例
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Include conf.modules.d/*.conf
- 配置指定实现模块加载格式
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd)
范例:查看模块加载的配置文件
[root@localhost ~]# ls /etc/httpd/conf.modules.d/
00-base.conf 00-dav.conf 00-lua.conf 00-mpm.conf 00-proxy.conf 00- systemd.conf 01-cgi.conf
[root@localhost ~]# cat /etc/httpd/conf.modules.d/00-base.conf
# 可以看到加载的模块
指定服务器名字
- 服务器名指定了之后,需要保障域名能够解析到这台服务器上,不然无法访问
vim /etc/httpd/conf/httpd.conf
#Servername www.example.com:80
Servername 192.168.64.129:80
httpd -t #检查语法
- 指定服务监听地址,默认是80端口
vim /etc/httpd/conf/httpd.conf
Listen 80
systemctl reload httpd
持久连接
非持久连接表示的是:客户端和服务端完成操作之后,立即断开
持久连接,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成
- 默认参数
vim /etc/httpd/conf/httpd.conf
KeepAlive On #默认是on,默认的超时时间是5秒。
KeepAliveTimeout 15 # 连接超时
MaxKeepAliveRequests 500# 最大保持连接请求数,默认值是100
- 测试持久连接
yum install telnet -y
echo 'this is test!' > /var/www/html/index.html
[root@server ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET / HTTP/1.1
Host:127.0.0.1
HTTP/1.1 200 OK
Date: Wed, 14 Jul 2021 14:17:29 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Wed, 14 Jul 2021 14:16:40 GMT
ETag: "e-5c71600ca9dad"
Accept-Ranges: bytes
Content-Length: 14
Content-Type: text/html; charset=UTF-8
this is test!
Connection closed by foreign host.
- 修改持久连接的参数,重启httpd,再次测试
[root@server ~]# cat /etc/httpd/conf.d/keeplive.conf
KeepAlive on
KeepAliveTimeout 30
MaxKeepAliveRequests 100
[root@server ~]# systemctl restart httpd.service
[root@server ~]# telnet 127.0.0.1 80
多路处理模块
MPM工作模式
- prefork:多进程I/O模型,一个主进程,管理多个子进程,一个子进程处理一个请求。
- worker:复用的多进程I/O模型,多进程多线程,一个主进程,管理多个子进程,一个子进程管理多个线程,每个 线程处理一个请求
- event:事件驱动模型,一个主进程,管理多个子进程,一个进程处理多个请求
prefork模式
多进程单线程
优点:适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的mpm,这样若一个请求出现问题就不会影响到其他请求。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。
- 查看默认选择处理模块为prefork
httpd -V
- 切换apache的mpm工作模式
[root@server ~]# cat /etc/httpd/conf.modules.d/00-mpm.conf | grep -Ev "^#|^$"
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
若要使用worker和event工作模型,只需要在/etc/httpd/conf.modules.d/00-mpm.conf中取消 对应注释即可
- 修改prefork参数
默认参数:
StartServers 5 # 服务启动时的进程数
MaxSpareServers 10 # 最大空闲服务进程数
MinSpareServers 5 # 最小空闲进程数
MaxRequestWorkers 256 # 单个进程最多接受的进程数
[root@server ~]# vim /etc/httpd/conf.d/mpm.conf
StartServers 10
MaxSpareServers 15
MinSpareServers 10
MaxRequestWorkers 256
MaxRequestsPerChild 4000
[root@localhost ~]# systemctl restart httpd
[root@server ~]# ps -ef | grep httpd
- 压测工具
[root@localhost ~]# ab -n 1000000 -c 1000 http://127.0.0.1/
# -n 即requests,用于指定压力测试总共的执行次数
# -c 即concurrency,用于指定的并发数
- 测试过程中,可以看到最大进程数
watch -n 0.5 "ps aux | grep httpd |wc -l"
ps aux |grep httpd |wc -l
- 结束ab的压力测试,等待一段时间,可以看到进程数慢慢减少
watch -n 0.5 'pstree -p|grep httpd|wc -l'
ps aux|grep httpd |wc -l
worker模式
work使用了多进程和多线程的混合模式,worker模式也同样会先派生一下子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务
优点:线程比进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发高流量的场景下会比prefork有更多可用的线程,表现会更优秀一些。
缺点:如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全。
- 相关参数
StartServers #服务器启动时建立的子进程数量,在workers模式下默认是3.
ServerLimit #系统配置的最大进程数量
MinSpareThreads #空闲子进程的最小数量,默认75
MaxSpareThreads #空闲子进程的最大数量,默认250
ThreadsPerChild #每个子进程产生的线程数量,默认是64
MaxRequestWorkers /MaxClients #限定服务器同一时间内客户端最大接入的请求数量.
MaxConnectionsPerChild #每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束, 如果设置为0,子进程将永远不会结束。在Apache2.3.9之前称之为MaxRequestsPerChild。
event模式
这个是apache中最新的模式,在现在的版本里已经是稳定可用的模式,它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,挂载哪里等待,中间几乎没有请求过来,一直等到超时)
event中会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样,一个线程就能处理几个请求了,实现了异步非阻塞
三、main server文档也面路径
vim /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html" #文档根路径
<Directory "/var/www">
Require all granted
</Directory>
- DocumentRoot指向的路径为URL路径的起始位置
- 路径必须显示授权后才可以访问
httpd -M |grep dir
dir_module (shared) #由本模块控制授权主页文件
vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
案例
- 默认情况下主页存放于
/var/www/html
目录下,下面修改默认资源存放路径,指定为/data/html
mkdir -p /data/html
echo "<h1>hello world</h1>" > /data/html/index.html
vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/html" #修改资源存放路径
<Directory "/data/html"> #给权限
AllowOverride None
Require all granted
</Directory>
httpd -t
systemctl restart httpd
setenforce 0
chcon -R -t hhtpd_sys_content_t /data/html #设置selinux权限,或者直接setenforce 0
- 在
dir_mod
中添加index.htm
echo "<h1>hello linux</h1>" > /data/html/index.htm
vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex index.html index.htm #修改两个文件的顺序,可以更改优先访问的页面顺序
</IfModule>
systemctl restart httpd
- 访问这个页面,发现index.html优先于index.htm
默认页面
- 如果在
DocumentRoot
目录下没有任何文件,会发现有一个默认的页面,也就是显示Testing 123...
的那个页面,这个是因为有一个welcome.conf
的配置文件导致的
cat /etc/httpd/conf.d/welcom.conf
<LocationMatch "^/+$">
Options -Indexes
ErrorDocument 403 /.noindex.html
</LocationMatch>
四、访问控制
URI匹配规则
- apache支持针对文件系统和URI资源进行访问匹配
#基于目录
<Directory "/path”>
...
</Directory>
#基于文件
<File "/path/file">
...
</File>
# 基于文件通配符
<Files "/path/*file*">
...
</Files>
#基于正则表达式
<FileMatch “regex”>
...
</FileMatch>
- 案例
修改配置文件
<FilesMatch ".+\.(gif|jpe?g|png)$"> # 匹配图片xxx.gif|jpg|jpeg|png
Require all denied
</FilesMatch>
重启服务然后测试
- apache对URL的匹配
<Location "URL">
...
</Location>
<LocationMatch "regex">
...
</LocationMatch>
URL匹配规则
#/private1, /private1/, /private1/file.txt 匹配
#/private1other 不匹配
<Location "/private1">
#... #注意斜线
</Location>
#/private2, /private2/, /private2/file.txt 匹配
#/private2other 不匹配
<Location "/private2">
#...
</Location>
Options指令
- 后跟1个或多个以空白字符分隔的选项列表, 在选项前的+,- 表示增加或删除指定选项
- 常见选项(默认是全部禁用):
- Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
- FollowSymLinks:允许访问符号链接文件所指向的源文件
- None:全部禁用
- All: 全部允许
- 在html目录下产生如下目录和文件,然后通过浏览器访问这个目录
[root@localhost ~]# cd /data/html/dir
[root@localhost dir]# touch f1 f2
访问ip/dir
这样是不安全的。因为如果没有index.html文件就会把其他的目录显示出来。所以要修改配置
- 创建一个软连接,把/etc的软连接放到 html/dir 中,同时关闭上述的options -Indexes
[root@localhost dir]# ln -s /etc/hosts hosts
访问ip/dir/hosts
AllowOverride指令
AllowOverride指令与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName 指令指定,AccessFileName .htaccess 为默认值)文件中,覆盖之前的配置指令,只对语句有效,直接在对应的文件目录中新建一个.htaccess的文件
- 常见用法
- AllowOverride All:.htaccess中所有指令都有效
- AllowOverride None:.htaccess 文件无效,此为httpd 2.3.9以后版的默认值
- AllowOverride AuthConfig:.htaccess 文件中,除了AuthConfig 其它指令都无法生效,指定精确指令
案例
- 在主配置文件中禁止
Indexes
和FollowSymLinks
,但是在.htaccess
中打开
vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
Options -Indexes -FollowSymLinks
AllowOverride options=FollowSymLinks,Indexes
</Directory>
systemctl reload httpd
- 在dir下创建
.htaccess
文件,
echo "Options Indexes FollowSymLinks" > /data/html/dir/.htaccess
systemctl reload httpd
- 因为有主配置文件中设置了
.htaccess
对应的文件拒绝全部访问,所以相对是安全的
<Files ".ht*">
Require all denied
</Files>
基于IP地址访问控制
- 针对各种资源,可以基于以下两种方式的访问控制
- 客户端来源地址
- 用户账号
- 基于客户端的IP地址的访问控制
- 无明确授权的目录,默认拒绝
- 允许所有主机访问:
Require all granted
- 拒绝所有主机访问:
Require all denied
- 授权指定来源的IP访问:
Require ip <IPADDR>
- 拒绝特定的IP访问:
Require not ip <IPADDR>
- 授权特定主机访问:
Require host <HOSTNAME>
- 拒绝特定主机访问:
Require not host <HOSTNAME>
- 黑名单
</Directory "/data/html"
<RequireAll>
Require all granted
Require not ip 172.16.1.1 #拒绝特定IP
</RequireAll>
#Require all granted这一行记得注释掉,要不然里面写的生效不了
</Directory>
- 白名单
<RequireAny>
Require all denied
require ip 172.16.1.1 #允许特定IP
</RequireAny>
- 只允许特定的网段访问
<Directory "/data/html">
<requireany>
Require all denied
Require ip 192.168.39.0/24
</requireany>
</Directory>
- 只允许特定的主机访问
<Directory "/data/html">
<Requireany>
Require all denied
Require ip 192.168.32.7 #只允许特定的主机访问
</Requireany>
</Directory>
基于用户的访问控制
- 认证质询:WWW-Authenticate,响应码为401,拒绝客户端请求,并说明要求客户端需要提供账号和密码
- 认证:Authorization,客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源
- 认证方式有两种
- basic:明文
- digest:消息摘要认证,兼容性差
- 安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因,用户的账号和密码
- 虚拟账号:仅用于访问某服务时用到的认证标识
配置方法
- 定义安全域
- 允许账号文件中的所有用户登录访问:
- Require valid-user #表示只要在这个文件里面的用户都是有效用户,都可以访问
- 允许账号文件中的所有用户登录访问:
<Directory "/path">
Options None
AllowOverride None
AuthType Basic
AuthName "String" #文字提示符
AuthUserFile "/path/..." #指定存放密码文件
Require user username1 username2 ... #限制特定的人才能访问
</Directory>
- 提供账号和密码存储(文本文件)使用专用命令完成此类文件的创建即用户管理
htpasswd [options] /path username
- 选项
- -c:自动创建文件,仅应该在文件不存在时使用,不然就会覆盖
- -p:明文密码
- -d:CRYPT格式加密,默认
- -m:md5格式加密
- -s:sha格式加密
- -D:删除指定用户
案例:修改主配置文件
-
先取消掉权限控制
-
创建用户文件,为用户认证做准备
[root@server1 ~]# htpasswd -c -m /etc/httpd/conf.d/.htpassword lisi
New password:
Re-type new password:
Adding password for user lisi
[root@server1 ~]# htpasswd -b -m /etc/httpd/conf.d/.htpassword zhangsan zhangsan
Adding password for user zhangsan
- 修改配置文件,启用用户认证
mkdir -p /data/www/html
cd /data/www/html
echo "hello linux" > index.html
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/www/html">
AuthType Basic
AuthName "Restricted Resource"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf.d/.htpassword
Require user lisi
</Directory>
[root@server1 ~]# systemctl restart httpd.service
案例:修改.htaccess文件
- 生成文件并且创建用户
[root@server1 ~]# htpasswd -c -m /etc/httpd/conf.d/.htpassword lisi
New password:
Re-type new password:
Adding password for user lisi
[root@server1 ~]# htpasswd -b -m /etc/httpd/conf.d/.htpassword zhangsan zhangsan
Adding password for user zhangsan
[root@server1 ~]# cat /etc/httpd/conf.d/.htpassword
- 设置
AllowOverride
选项为ALL
vim /etc/httpd/conf.d/test.conf
<Directory "/data/www/html">
AllowOverride Authconfig
Require all granted
</Directory>
- 写入
.htaccess
文件,针对admin目录下的文件进行访问控制
vim /data/www/html/admin/.htaccess
AuthType Basci
AuthName "FBI warning"
AuthUserFile "/etc/httpd/conf.d/.htpassword"
Require user lisi
systemctl restart httpd
基于组账号进行认证
- 可以对htpasswd产生的虚拟用户进行分组管理
<Directory "/data/www/html">
AuthType Basic
AuthName "Restricted Resource"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf.d/.htpassword
AuthGroupFile /etc/httpd/conf.d/.htgroup
Require group group1
</Directory>
案例
- 创建用户
- 创建组
vim /etc/httpd/conf.d/.httpgroup
webadmin:lisi zhangsan
- 修改httpd配置文件
vim /etc/httpd/conf.d/test.conf
<Directory "/data/www/html">
AuthType Basic
AuthName "Restricted Resource"
AuthUserFile /etc/httpd/conf.d/.htpassword
AuthGroupFile /etc/httpd/conf.d/.htgroup
Require group webadmin
</Directory>
五、日志配置
- httpd有两种日志类型
- 访问日志
- 错误日志
- 日志等级:debug,info,notice,warn,error,crit,alert,emerg
日志格式
- 日志格式可以自定义,查看主配置文件
vim /etc/httpd/conf/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>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined # 默认日志存放路径格式
</IFModule>
- 日志参数
%h Remote hostname
%l Remote logname
%u Remote user
%t Time the request was received, in the format [18/Sep/2011:19:18:28 -0400]
%r First line of request
%s Status
%b Size of response in bytes, excluding HTTP headers
Referer 有利于分析用户是通过哪个网站转发的如通过baidu转发的,也可以监控网站盗链的发生。
User-Agent 记录浏览器的类型。防止爬虫一定程度上,爬虫可以伪造浏览器类型。curl -A "evan"
http://I(伪造名字叫evan的浏览器)
- 日志存放位置
[root@localhost ~]# ls /var/log/httpd/
access_log error_log
六、别名模块alias_module
alias别名,可以隐藏真实文件系统路径。这里实现的目的是用news文件目录来代替newsdir/index.html访问文件路径,从而起到隐藏真实文件系统路径的目的
- 让
dir
目录隐藏,让其可以被news
路径访问
vim /etc/httpd/conf/httpd.conf
<IFModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin"
Alias /news/ /data/html/dir
</IFModule>
systemctl reload httpd
- 测试访问ip:/news
七、httpd服务状态信息显示
- 当我们需要获取httpd服务器在运行过程中的实时状态信息时可以使用该功能
vim /etc/httpd/conf.d/test.conf
<Location "/status">
<requireany>
require all denied
require ip 192.168.64.0/24
</requireany>
SetHandler server-status
</Location >
ExtendedStatus On
systemctl reload httpd
- 测试ip/status
八、虚拟主机
-
httpd 支持在一台物理主机上实现多个网站,即多虚拟主机
-
网站的唯一标识
- IP相同,但端口不同
- IP不同,但端口均为默认端口
- FQDN不同
-
多虚拟主机有三种实现方案
- 基于IP:为每个虚拟主机准备至少一个IP地址
- 基于port:为每个虚拟主机使用至少一个独立的port
- 基于FQDN:为每个虚拟主机使用至少一个FQDN,域名
-
虚拟主机的配置方法
<VirtualHost IP:PORT>
Servername FQDN
DocumentRoot "/path"
</VirtualHost>
# 建议,上述配置存放在独立的配置文件中
- 其他常用可用指令
ServerAlias:虚拟主机的别名;可多次使用
ErrorLog:错误日志
CustomLog:访问日志
<Directory "/path"> </Directory>
mkdir /data
mkdir /data/site{1..6}
cd /data/site1
vim index.html
this is site1
基于ip地址虚拟主机
- 先给网卡新增加一个IP
[root@node3 data]# cat /etc/httpd/conf.d/site1.conf
Listen 8080
<Directory "/data/">
Require all granted
</Directory>
<VirtualHost 192.168.239.10:8080>
Servername www.site1.com
DocumentRoot "/data/site1/"
</VirtualHost>
<VirtualHost 192.168.239.20:8080>
Servername www.site2.com
DocumentRoot "/data/site2/"
</VirtualHost>
基于端口虚拟主机
[root@node3 data]# cat /etc/httpd/conf.d/site2.conf
Listen 9080
Listen 9090
<Directory "/data/">
Require all granted
</Directory>
<VirtualHost *:9080>
DocumentRoot "/data/site3/"
</VirtualHost>
<VirtualHost *:9090>
DocumentRoot "/data/site4/"
</VirtualHost>
基于域名虚拟主机
[root@node3 data]# cat /etc/httpd/conf.d/site3.conf
Listen 10101
<Directory "/data/">
Require all granted
</Directory>
<VirtualHost 192.168.239.10:10101>
Servername www.site5.com
DocumentRoot "/data/site5/"
</VirtualHost>
<VirtualHost 192.168.239.10:10101>
Servername www.site6.com
DocumentRoot "/data/site6/"
</VirtualHost>
[root@server1 ~]# vim /etc/hosts
192.168.239.10 www.site5.com www.site6.com
[root@server1 ~]# curl www.site5.com:10101
this is site5
[root@server1 ~]# curl www.site6.com:10101
this is site6
九、HTTPS
- SSL是基于IP地址实现,单IP地址的httpd主机,仅可用使用一个https虚拟主机
- 实现多个虚拟主机站点,apache不支持,nginx支持
- SSL实现过程
- 客户端发送可供选择的加密方式,并向服务器请求证书
- 服务器端发送证书以及选定的加密方式给客户端
- 客户端取得证书并进行证书验证,如果信任给其发证书的CA
- 验证证书来源的合法性;用CA的公钥解密证书上的数字签名
- 验证证书的内容的合法性;完整性验证
- 检查证书的有效期限
- 检查证书是否被吊销
- 证书中拥有者的名字,与访问的目标主机要一致
- 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
- 服务用此密钥加密用户请求的资源,响应给客户端
https功能
Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是由两部分组成:HTTP+SSL/TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
https实现过程如下:
- 客户端发起HTTPS请求
- 客户端访问某个web端的https地址,一般都是443端口
- 服务端的配置
- 采用https协议的服务器必须要有一套证书,可以通过一些组织申请,也目前可以自己制作,目前国内很多网站都是自己做的,当你访问一个网站的时候提升证书不可信任就标识证书是自己做的,证书就是一个公钥和私钥,
- 传送证书
- 服务端给客户端传递证书,其实就是公钥,里面包含了很多信息,例如证书得到颁发机构、过期时间等等。
- 客户端解析证书
- 这部分工作是由客户端完成的,首先会验证公钥的有效性,比如颁发机构,过期时间等等,如果发现异常则会弹出一个警告框提示证书可能存在问题,如果证书没有问题就生成一个随机值,然后用证书对该随机值进行加密。
- 传递4步骤的加密数据
- 就是将用证书加密后的随机值传递给服务器,目的就是为了让服务器得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值进行加密解密了
- 服务端解密信息
- 服务端用私钥解密5步骤加密后的随机值之后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,对称加密就是将信息和私钥通过算法混合在一起,这样除非你知道私钥,不然是无法获取其内部的内容,而正好客户端和服务端都知道这个私钥,所以只要机密算法够复杂就可以保证数据的安全性。
- 传输加密后的信息
- 服务端将用私钥加密后的数据传递给客户端,在客户端可以被还原出元数据内容
- 客户端解密信息
- 客户端用之前生成的私钥获解密服务端传递过来的数据,由于数据一直是加密的,因此即时第三方获取到数据也无法知道其详细内容
十、URL重定向
- URL重定向,即将httpd请求的URL转发至另一个URL
- 重定向指令
Redirect [status] URL-path URL
- status状态
- permanent:返回永久重定向状态码301
- temp:返回临时重定向状态码302,此为默认值