1.使用CentOS7来安装httpd
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# mkdir -pv /data/web/www
[root@localhost ~]# vim /data/web/www/index.html
Main Server
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/web/www"
AllowOverride None
Allow from all
[root@localhost ~]# systemctl start httpd.service
成功访问网站
2.持久链接
什么是持久链接
http协议是无状态的,每一次事务是由一次请求和相应报文组成,http又是基于tcp协议的,每次建立链接都要三次握手,四次放开,每次请求后都断开非常消耗资源,所以链接以后持续获取资源不断开,一直响应到把需要获取的资源都获取了为止,叫持久链接。结束持久链接有两个条件,设置长链接的时间和最多链接多少个资源,达到了即断开。
配置持久链接
[root@localhost ~]# vim /etc/httpd/conf.d/keepalive.conf
KeepAlive On
KeepAliveTimeout 30
MaxKeepAliveRequests 100
[root@localhost ~]# httpd -t
Syntax OK
[root@localhost ~]# systemctl restart httpd.service
使用telnet命令测试持久链接
[root@localhost ~]# telnet 192.168.10.11 80
Trying 192.168.10.11...
Connected to 192.168.10.11.
Escape character is '^]'.
GET /index.html HTTP/1.1 #输入
Host:192.168.10.11 #输入
HTTP/1.1 200 OK
Date: Thu, 07 Jun 2018 07:14:37 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 07 Jun 2018 05:44:13 GMT
ETag: "15-56e06c5ed718a"
Accept-Ranges: bytes
Content-Length: 21
Content-Type: text/html; charset=UTF-8
Main Server
Connection closed by foreign host. #等待30秒出现这条信息
3.httpd虚拟主机
什么是httpd虚拟主机
httpd有两类主机,一个叫做中心主机,即主机上只配置一个网站。另一个叫虚拟主机,即在httpd服务器上配置多个虚拟主机,实现一个服务器配置多个网站的服务,其实就是访问同一个服务器上的不同目录。在httpd2.2版本中中心主机和虚拟主机不能同时配置,必须注释掉一个,才能使用另一个。在httpd2.4中启动虚拟主机时中心主机会自动失效。
虚拟主机有三种方式配置多个网站:
- 用ip来区分网站
- 用端口来区分网站
- 用主机名来区分网站
基于IP来配置网站
虚拟主机配置两个网站
www.test1.com 192.168.10.11:80
www.test2.com 192.168.10.110:80
创建首页和添加IP
[root@localhost ~]# mkdir -pv /data/web/{test1,test2}
[root@localhost ~]# vim /data/web/test1/index.html
www.test1.com
1111111111
[root@localhost ~]# vim /data/web/test2/index.html
www.test2.com
2222222222
#给两个网站添加首页
[root@localhost ~]# ip addr add 192.168.10.110/24 dev ens33
#网卡上增加一个ip
[root@localhost ~]# ip a l
。。。。。。
2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:9d:a6:14 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.11/24 brd 192.168.10.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.10.110/24 scope global secondary ens33
valid_lft forever preferred_lft forever
inet6 fe80::ab0:a9:3e59:622a/64 scope link
valid_lft forever preferred_lft forever
#查看网卡上已配置成功两个ip
以模块化的方式对两个网站进行环境配置
[root@localhost ~]# vim /etc/httpd/conf.d/test1.conf
ServerName www.test1.com #网站不是按照这里来区分,添加只是标准做法
DocumentRoot "/data/web/test1" #网站目录路径
#httpd2.4要对目录授权才能访问
Options None #不允许返回目录信息
AllowOverride None #不允许覆盖配置
Require all granted #允许所有人来访问
CustomLog "logs/test1_access_log" combined #日志文件路径
[root@localhost ~]# vim /etc/httpd/conf.d/test2.conf
ServerName www.test2.com
DocumentRoot "/data/web/test2"
Options None
AllowOverride None
Require all granted
CustomLog "logs/test2_access_log" combined
[root@localhost ~]# httpd -t #检测配置文件语法
Syntax OK
[root@localhost ~]# systemctl restart httpd.service
用浏览器访问两个网站IP
基于端口来配置网站
虚拟主机配置两个网站
www.test1.com 192.168.10.11:80
www.test2.com 192.168.10.11:10080
基于之前的配置修改第二个网站的配置
[root@localhost ~]# vim /etc/httpd/conf.d/test2.conf
Listen 10080
ServerName www.test2.com
DocumentRoot "/data/web/test2"
Options None
AllowOverride None
Require all granted
CustomLog "logs/test2_access_log" combined
[root@localhost ~]# ip addr delete 192.168.10.110/24 dev ens33
#删除网卡中的ip192.168.10.110
[root@localhost ~]# systemctl restart httpd.service
浏览器访问和第一个站ip相同,但端口不同的第二个站
基于主机名来配置网站
配置两个网站,域名不同,IP和端口相同
www.test1.com 192.168.10.11:80
www.test2.com 192.168.10.11:80
设置两个网站的配置
[root@localhost ~]# vim /etc/httpd/conf.d/test1.conf
#把ip替换成*号
ServerName www.test1.com
DocumentRoot "/data/web/test1"
Options None
AllowOverride None
Require all granted
CustomLog "logs/test1_access_log" combined
[root@localhost ~]# vim /etc/httpd/conf.d/test2.conf
#把ip替换成*号
ServerName www.test2.com
DocumentRoot "/data/web/test2"
Options None
AllowOverride None
Require all granted
CustomLog "logs/test2_access_log" combined
[root@localhost ~]# systemctl restart httpd.service
实际应用中由dns域名服务器来对这两个网站提供解析服务,这里我修改本机的hosts文件达到访问域名指向IP的功能。
4.站点访问控制
httpd会对站点资源映射的url页面或目录路径下的资源做访问控制
- 在文件系统之上来做控制
- 在url路径上来做控制
常用的访问控制方式:
- 客户机地址限制
- 用户授权限制
Order配置项,定义控制顺序
- 先允许后拒绝,默认拒绝所有:Order allow,deny
- 先拒绝后允许,默认允许所有:Order deny,allow
Allow、Deny配置项,设置允许或拒绝的地址
- Deny from address1 address2 …
- Allow from address1 address2 …
配置网站允许192.168段访问,禁止192.168.10.10访问
[root@localhost ~]# vim /etc/httpd/conf.d/test1.conf
ServerName www.test1.com
DocumentRoot "/data/web/test1"
Require not ip 192.168.10.10 #禁止此IP访问
Require ip 192.168 #除上面此网段的都可以访问
CustomLog "logs/test1_access_log" combined
在192.168.10.10上打开网页显示403错误,拒绝访问
[root@localhost ~]# curl http://192.168.10.11/index.html
403 Forbidden
Forbidden
You don't have permission to access /index.html
on this server.
配置网站下的图片文件目录
[root@localhost ~]# mkdir /data/web/test1/images
[root@localhost ~]# find /usr/share/ -iname "*.jpg" -exec cp {} /data/web/test1/images/ \;
[root@localhost ~]# ls /data/web/test1/images/
2560x1600.jpg background.jpg day.jpg default.jpg morning.jpg night.jpg
[root@localhost ~]# vim /etc/httpd/conf.d/test1.conf
ServerName www.test1.com
DocumentRoot "/data/web/test1"
Options Indexes FollowSymLinks #路径下没有index页面,就显示目录
Require all granted
CustomLog "logs/test1_access_log" combined
[root@localhost ~]# systemctl restart httpd
此时浏览网站图片路径出现
修改配置文件禁止图片路径以目录显示
[root@localhost ~]# systemctl restart httpd
ServerName www.test1.com
DocumentRoot "/data/web/test1"
Options FollowSymLinks
Require all granted
CustomLog "logs/test1_access_log" combined
[root@localhost ~]# systemctl restart httpd
此时图片目录不能显示,但是图片可以正常浏览
5.基于用户的访问控制
上面介绍的基于IP地址来做访问控制其实风险很大,也可以用一种更安全的http内置的功能认证来实现基于用户的访问控制,无论任何IP访问特定的资源都要提供账号的密码,登录后才能访问。
认证的方式有两种,一种是协议认证,一种是表单认证,大多数用的都是表单认证,下面叙述一个表单认证的实例。
创建用户认证数据文件并添加用户
[root@localhost ~]# htpasswd -c /tmp/test.users tom
New password: #输入密码
Re-type new password: #确认密码
Adding password for user tom
[root@localhost ~]# htpasswd /tmp/test.users jerry
New password:
Re-type new password:
Adding password for user jerry
[root@localhost ~]# htpasswd -b -m /tmp/test.users lsh 112233
#创建lsh用户,112233密码,密码用md5加密
[root@localhost ~]# cat /tmp/test.users
tom:$apr1$CN5Uyv5I$psYF4KyTFAEg0r6VnPlxc0
jerry:$apr1$OjXiFcgl$YsP2VnBEDr0ISVVNWwr14/
lsh:$apr1$FmpnCw7U$j44TAvc0kg1T1cYMUl3XA1
[root@localhost ~]# mv /tmp/test.users /etc/httpd/conf.d/.htpasswd
#拷贝密码文件到httpd配置目录中并设置成隐藏文件
[root@localhost ~]# mkdir /data/web/test1/admin
#创建一个需要登录才能访问的目录
[root@localhost ~]# vim /data/web/test1/admin/index.html
admin Area
#admin目录创建一个首页
[root@localhost ~]# vim /etc/httpd/conf.d/admin.conf
Options None #不允许目录显示
AllowOverride None #不允许覆盖配置
AuthType basic #明文类型
AuthName "Admin ......" #用户提示信息
AuthUserFile "/etc/httpd/conf.d/.htpasswd" #账户密码文件路径
Require user jerry lsh #只有jerry和lsh账号才能访问这个目录
#Require valid-user #允许所有用户都能登录,注释掉了此句
[root@localhost ~]# httpd -t
Syntax OK
[root@localhost ~]# systemctl restart httpd.service
访问网站的admin目录需要先验证,验证成功后才能访问
还可以把验证用户放在组中,然后对整个组授权验证,以方便管理
[root@localhost ~]# vim /etc/httpd/conf.d/.htgroup
animals:tom jerry
[root@localhost ~]# vim /etc/httpd/conf.d/admin.conf
Options None
AllowOverride None
AuthType basic
AuthName "Admin ......"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup" #增加组文件路径
Require group animals #添加只允许animals组中的成员才能登录
[root@localhost ~]# systemctl restart httpd.service
输入animals组中的用户,验证通过后成功访问