一、httpd服务的配置文件
httpd服务的主配置文件通常为httpd根目录下的conf/httpd.conf文件,通过yum安装的httpd服务的主配置路径通常如下:
httpd-2.2:/etc/httpd/conf/httpd.conf
httpd-2.4:/etc/httpd/conf/httpd.conf
主配置文件的格式大体分为三部分:
Section 1: Global Environment
Section 2: 'Main' server configuration
Section 3: Virtual Hosts
但httpd-2.4版本中删除了相应的描述,不过大体与httpd-2.2相同。
另外除了主配置文件之外,也存在着其他的配置目录路径,通常在主配置文件中会使用Include conf.d/*.conf
、Include conf.modules.d/*.conf
(httpd-2.4)类似的语句去调用对应的目录下的配置文件,其路径格式为相对路径,根目录由主配置文件中的Serverroot决定。
本文案例基于 Centos 7.4 httpd-2.4。
二、httpd服务的基础配置
1、修改监听的IP地址和接口
在主配置文件中,httpd服务监听IP地址和接口的语句格式为:
Listen [IP-address:]portnumber [protocol]
此语句的使用有以下几点注意事项:
- IP-address可省略,表示0.0.0.0匹配全部IP;
- 此指令Listen可重复出现多次监听多个IP地址和端口;
- 修改监听的socket后,需重启服务进程方可生效;
- 若限制其必须通过ssl通信时,protocol需定义为https;
使用案例:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Listen 80
Listen 192.168.0.109:8080 #新增监听端口8080
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 192.168.0.109:8080 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
2、使用长连接
长连接指的是tcp链接建立之后,每个资源获取完成后不全断开连接,而是继续等待其他资源请求;但是对于并发访问量较大的服务器,长连接的使用会使得后续某些请求无法得到正常的响应。对于这种情况, 可通过使用较短的长连接超时时长和设置较少的长连接请求数来缓解。
其配置命令为:
keepalive On|off #是否启动长连接
keepAliveTimeout 15 #长连接超时时间
MaxKeepAliveRequests 100 #最多保持多少个长连接请求
使用案例:
[root@localhost ~]# vim /etc/httpd/conf.d/keepalive.conf
KeepAlive on
KeepAliveTimeout 30
MaxKeepAliveRequests 100
[root@localhost ~]# systemctl restart httpd #重启服务
[c:~]$ telnet 192.168.0.109 80 #在电脑终端用telnet测试连接性
Connecting to 192.168.0.109:80...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
GET /index.html HTTP/1.1
Host:192.168.0.109
HTTP/1.1 200 OK
Date: Tue, 01 May 2018 10:06:06 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Tue, 01 May 2018 10:03:41 GMT
ETag: "d-56b2215c57e7e"
Accept-Ranges: bytes
Content-Length: 13
Content-Type: text/html; charset=UTF-8
hello,world/
GET /index2.html HTTP/1.1 #启动了长连接后,可以再次发起请求,直到到达超时时间;不启动的话,完成一次请求报文后即会退出telnet。
Host:192.168.0.109
HTTP/1.1 200 OK
Date: Tue, 01 May 2018 10:06:39 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Tue, 01 May 2018 10:05:43 GMT
ETag: "15-56b221cfe406e"
Accept-Ranges: bytes
Content-Length: 21
Content-Type: text/html; charset=UTF-8
welcome to my office
3、定义web目录
在httpd服务的主配置文件中,默认情况下DocumentRoot "/var/www/html"
定义了默认web站点目录的路径。
如需自定义默认的目录,需要找如下格式进行添加:
httpd-2.2:
<Directory "/PATH/TO/FILE">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
httpd-2.4:
<Directory "/PATH/TO/FILE">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
- options 包括以下可选参数:
参数 | 说明 |
---|---|
Indexes | 允许目录浏览,当客户仅指定要访问的目录,但没有指定要访问的文件,且目录下不存在默认文档时,显示该目录中的文件及子目录列表索引 |
MultiViews | 允许内容协商的多重视图,允许返回指定的访问目录下的相关联的文件 |
All | All包含了除MultiViews之外的所有特性,如没有指定options,默认为All |
ExecCGI | 允许在该目录下执行CGI脚本 |
FollowSymLinks | 允许跟踪符号链接到源文件 |
Includes | 允许服务器端包含功能 |
IncludesNoExec | 允许服务器端包含功能,但禁止执行CGI脚本 |
None | 不调用options参数 |
-
AllowOverride
AllowOverride选项用于定义每个目录下.htaccess文件中的指令类型,但通常设置None。 -
Order
Order选项用于定义缺省的访问权限与Allow和Deny语句的处理顺序。 -
Allow/Deny
Allow和Deny语句可以针对客户机的域名或IP地址进行设置,以决定哪些客户机能够访问服务器。如:Allow from all或者Deny from 172.16.0.0/24等等。 -
Require all granted
此为http-2.4中的允许所有人访问的格式。除此还可以禁止某个IP或域名的访问,如:Require not ip 1.1.1.1
、Require not host host.example.com
或者禁止所有人访问Require all denied
。
使用案例:
新建/data/html目录,编辑修改httpd服务,使其能够web访问/data/html目录下的test.html目录文件:
[root@localhost ~]# mkdir -pv /data/html #创建对应的web目录
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/html’
[root@localhost ~]# vim /data/html/test.html #创建指定html文件
this is a test page.
[root@localhost ~]# chcon -R --reference /var/www/html/ /data/html/ #复制/var/www/html的selinux安全上下文到/data/html
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf #编辑主配置文件
#DocumentRoot "/var/www/html" #注释原先默认的web根目录
DocumentRoot "/data/html" #指定新建的目录为web根目录
<Directory "/data/html"> #定义目录
AllowOverride none
Options none
Require all granted
</Directory>
[root@localhost ~]# systemctl restart httpd #重启httpd服务
三、httpd的访问控制
1、在Directory中基于IP地址实现访问控制
在http-2.2中基于IP地址的访问控制是利用allow和Deny参数来实现的,如下例子:
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from [IP|NetAddr]
Deny from [IP|NetAddr]
</Directory>
其中NetAddr的格式可类似:172.16、172.16.0.0、172.16.0.0/16、172.16.0.0/255.255.0.0。
而httpd-2.4中基于Ip地址访问的控制是利用Require参数来实现的,其中Require参数可混合使用,如下例子:
<Directory "/data/html">
AllowOverride none
Options none
<RequireAll>
Require ip [IP|NetAddr] #允许访问的IP或网段
Require not ip [IP|NetAddr] #拒绝访问的Ip或网段
</RequireAll>
</Directory>
此外httpd-2.4版本中还可以利用host名来进行访问控制,如:
<Directory "/data/html">
AllowOverride none
Options none
<RequireAll>
Require host google.com #只允许来自域名为google.com的主机访问;
Require not host www.magedu.com #不允许来自域名为www.magedu.com的主机访问;
</RequireAll>
</Directory>
使用案例:
禁止主机IP192.168.0.100和109访问相应的主机页面:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<VirtualHost 192.168.0.108:80>
DocumentRoot "/data/html"
<Directory "/data/html">
AllowOverride none
Options none
<RequireAll>
Require all granted #允许所有主机访问
Require not ip 192.168.0.110 192.168.0.100 #禁止匹配的Ip访问
</RequireAll>
</Directory>
</VirtualHost>
[root@localhost ~]# systemctl restart httpd
2、在Directory中基于用户的访问控制
在Directory中支持的认证方式有两种Basic明文认证和digest消息摘要认证,由于并不是所有浏览器都支持摘要认证,因此一般来说用的较多的是明文认证
首先利用htpasswd命令生成认证的配置文件:
[root@localhost ~]# htpasswd -cb /data/userpasswd charlie 123456
Adding password for user charlie
[root@localhost ~]# htpasswd -b /data/userpasswd wch magedu
Adding password for user wch
[root@localhost ~]# cat /data/userpasswd
charlie:$apr1$1.t1GT7Z$HFMLZT7SR5eF6i51efMo90
wch:$apr1$nzfsSQ4g$qvo8tPvRV5uwnAehOCmr9.
[root@localhost ~]# chcon -R --reference /var/www/ /data/userpasswd #修改userpasswd文件的安全上下文
随后编辑httpd的主配置文件,设置用户认证:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/html" #修改默认的web目录
<Directory "/data/html">
AllowOverride none
Options none
AuthType Basic #设置认证类型为Basic
AuthName "welcome to my server." #设置认证提示
AuthUserFile "/data/userpasswd" #指定认证文件的路径
Require user charlie wch #指定允许访问的认证用户
</Directory>
3、基于域的用户访问控制
httpd服务除了根据用户做访问控制之外,还能将用户划分为相应的域组,并根据域组来做相应的访问控制。下面为以刚才演示的用户控制为背景做的域组访问控制示列:
首先创建域组文件:
[root@localhost ~]# vim /data/Usergroup
group1:charlie
group2:wch
编辑httpd的主配置文件:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/html"
<Directory "/data/html">
AllowOverride none
Options none
AuthType Basic
AuthName "welcome to my server"
AuthUserFile "/data/userpasswd"
AuthGroupFile "/data/Usergroup" #添加域组文件
Require group group1 #选择允许认证访问的域组
</Directory>
四、httpd的虚拟主机VirtualHost
学习了如何在定义httpd的web目录后,大家肯定都会跃跃欲试。但是经历实操之后,大家可能就会去想着创建第二个web目录,然后就发现创建的第二个web目录无法被正常读取访问。此时就需要利用到httpd服务的VirtualHost功能来帮助大家完成这个需求。
Apache虚拟主机就是在一个Apache服务器上配置多个虚拟主机,实现一个服务器提供多站点服务,其实就是访问同一个服务器上的不同目录。
虚拟主机支持三种访问方式:
- 基于IP的方式,需为每个虚拟主机准备至少一个Ip地址,其配置方式如下:
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs" #虚拟主机的web目录
</VirtualHost>
使用案例:
利用virtualhost基于IP的方式实现/var/www/html目录和/data/html目录下的网页文件的同时访问:
[root@localhost ~]# ifconfig ens33:1 192.168.0.108/24 #添加第二个Ip地址
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.109 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::b2a9:6dff:b894:5e61 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:74:5b:1f txqueuelen 1000 (Ethernet)
RX packets 28472 bytes 38273549 (36.5 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4913 bytes 588675 (574.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.108 netmask 255.255.255.0 broadcast 192.168.0.255
ether 00:0c:29:74:5b:1f txqueuelen 1000 (Ethernet)
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<VirtualHost 192.168.0.108:80>
DocumentRoot "/data/html" #设置此虚拟主机的web根目录
<Directory "/data/html">
AllowOverride none
Options none
Require all granted
</Directory>
</VirtualHost>
[root@localhost ~]# systemctl restart httpd
- 基于port的方式,需要为每个虚拟主机使用至少一个独立的port,其配置方式如下:
Listen 8080 #在指定其他端口时,需添加监听语句
<VirtualHost 172.16.100.6:8080> #指定不同的port
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
使用案例:
利用不同的端口,分别访问/var/www/html和/data/html目录下的网页文件:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Documentroot /var/www/html
Listen 8080 #监听8080端口
<virtualhost *:8080> 定义8080端口的虚拟主机
Documentroot /data/html #设置虚拟主机的web根目录
<Directory "/data/html"> #设置目录
AllowOverride none
Options none
Require all granted #允许所有人访问
</Directory>
</virtualhost>
[root@localhost ~]# systemctl restart httpd
- 基于FQDN的方式,为每个虚拟主机使用至少一个FQDN,其配置方式如下:
NameVirtualHost 172.16.100.6:80 #如果是httpd-2.2,需要在配置文件中添加此句
<VirtualHost 172.16.100.6:80>
ServerName www.a.com #指定FQDN
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName www.b.net #指定FQDN
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
使用案例:
根据不同的FQDN显示不同的web页面:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<virtualhost *:80>
Servername www.a.com #设置域名为www.a.com
Documentroot /data/html #此虚拟主机对应/data/html目录
<Directory "/data/html">
AllowOverride none
Options none
Require all granted
</Directory>
</virtualhost>
<virtualhost *:80>
Servername www.b.com #设置域名为www.b.com
Documentroot /data/html2 #此虚拟主机对应/data/html2目录
<Directory "/data/html2">
AllowOverride none
Options none
Require all granted
</Directory>
</virtualhost>
[root@localhost ~]# systemctl restart httpd
在测试的linux主机上编辑/etc/hosts文件:
[root@localhost ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.109 www.a.com #添加www.a.com的域名指向192.168.0.109
192.168.0.109 www.b.com #添加www.b.com的域名指向192.168.0.109
telnet 192.168.0.109 的80端口测试结果得:
[root@localhost ~]# telnet 192.168.0.109 80
Trying 192.168.0.109...
Connected to 192.168.0.109.
Escape character is '^]'.
GET /index.html HTTP/1.1
Host:www.a.com #访问的URL为www.a.com
HTTP/1.1 200 OK
Date: Tue, 01 May 2018 09:33:20 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Tue, 01 May 2018 09:08:34 GMT
ETag: "28-56b21509f361c"
Accept-Ranges: bytes
Content-Length: 40
Content-Type: text/html; charset=UTF-8
This is the index.html from /data/html. #显示www.a.com对应的web内容
[root@localhost ~]# telnet 192.168.0.109 80
Trying 192.168.0.109...
Connected to 192.168.0.109.
Escape character is '^]'.
GET /index.html HTTP/1.1
Host:www.b.com #访问的URL为www.b.com
HTTP/1.1 200 OK
Date: Tue, 01 May 2018 09:27:24 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Tue, 01 May 2018 09:21:38 GMT
ETag: "29-56b217f57a00c"
Accept-Ranges: bytes
Content-Length: 41
Content-Type: text/html; charset=UTF-8
This is the index.html from /data/html2. #显示了www.b.com对应的web内容
参考链接:
https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require
http://httpd.apache.org/docs/2.4/mod/mod_authz_core.html