Apache

发布时间:2024年01月23日

  • 什么是服务
    可以响应请求报文,对外提供服务

一、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 -lhttpd -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 其它指令都无法生效,指定精确指令

案例

  • 在主配置文件中禁止IndexesFollowSymLinks,但是在.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实现过程如下:

  1. 客户端发起HTTPS请求
    1. 客户端访问某个web端的https地址,一般都是443端口
  2. 服务端的配置
    1. 采用https协议的服务器必须要有一套证书,可以通过一些组织申请,也目前可以自己制作,目前国内很多网站都是自己做的,当你访问一个网站的时候提升证书不可信任就标识证书是自己做的,证书就是一个公钥和私钥,
  3. 传送证书
    1. 服务端给客户端传递证书,其实就是公钥,里面包含了很多信息,例如证书得到颁发机构、过期时间等等。
  4. 客户端解析证书
    1. 这部分工作是由客户端完成的,首先会验证公钥的有效性,比如颁发机构,过期时间等等,如果发现异常则会弹出一个警告框提示证书可能存在问题,如果证书没有问题就生成一个随机值,然后用证书对该随机值进行加密。
  5. 传递4步骤的加密数据
    1. 就是将用证书加密后的随机值传递给服务器,目的就是为了让服务器得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值进行加密解密了
  6. 服务端解密信息
    1. 服务端用私钥解密5步骤加密后的随机值之后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,对称加密就是将信息和私钥通过算法混合在一起,这样除非你知道私钥,不然是无法获取其内部的内容,而正好客户端和服务端都知道这个私钥,所以只要机密算法够复杂就可以保证数据的安全性。
  7. 传输加密后的信息
    1. 服务端将用私钥加密后的数据传递给客户端,在客户端可以被还原出元数据内容
  8. 客户端解密信息
    1. 客户端用之前生成的私钥获解密服务端传递过来的数据,由于数据一直是加密的,因此即时第三方获取到数据也无法知道其详细内容

十、URL重定向

  • URL重定向,即将httpd请求的URL转发至另一个URL
  • 重定向指令
Redirect [status] URL-path URL
  • status状态
    • permanent:返回永久重定向状态码301
    • temp:返回临时重定向状态码302,此为默认值
文章来源:https://blog.csdn.net/dreamnn/article/details/135753361
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。