一、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/*.confInclude 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.1Require 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
 
192.168.0.100被拒绝访问
 
192.168.0.110被拒绝访问
 
本机Ip192.168.0.38访问成功
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>
 
使用wch账号认证访问的报错日志
 
账号cahrlie依旧能正常访问

四、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
 
同时访问/var/www/html/index.html和/data/html/test.html页面
  • 基于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
 
在同一个Ip的不同端口访问不同的web目录
  • 基于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

httpd服务的配置及应用的更多相关文章

  1. Httpd服务入门知识-Httpd服务常见配置案例之虚拟主机

    Httpd服务入门知识-Httpd服务常见配置案例之虚拟主机 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.虚拟主机实现方案 1>.Apache httpd 有三种实现虚 ...

  2. Httpd服务入门知识-Httpd服务常见配置案例之Apache的工作做状态status页面

    Httpd服务入门知识-Httpd服务常见配置案例之Apache的工作做状态status页面 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.status功能概述 status页 ...

  3. Httpd服务入门知识-Httpd服务常见配置案例之ServerSignature指令选项

    Httpd服务入门知识-Httpd服务常见配置案例之ServerSignature指令选项 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.ServerSignature指令概述 ...

  4. Httpd服务入门知识-Httpd服务常见配置案例之实现用户家目录的http共享

    Httpd服务入门知识-Httpd服务常见配置案例之实现用户家目录的http共享 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.实现用户家目录的http共享前提 在配置家目录共 ...

  5. Httpd服务入门知识-Httpd服务常见配置案例之定义路径别名

    Httpd服务入门知识-Httpd服务常见配置案例之定义路径别名 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.创建测试数据 [root@node101.yinzhengj ...

  6. Httpd服务入门知识-Httpd服务常见配置案例之设定默认字符集

    Httpd服务入门知识-Httpd服务常见配置案例之设定默认字符集 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看生产环境中使用的字符集案例 1>.查看腾讯设置的默认 ...

  7. Httpd服务入门知识-Httpd服务常见配置案例之日志设定

    Httpd服务入门知识-Httpd服务常见配置案例之日志设定 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.日志类型 [root@node101.yinzhengjie.org ...

  8. Httpd服务入门知识-Httpd服务常见配置案例之基于客户端来源地址实现访问控制

    Httpd服务入门知识-Httpd服务常见配置案例之基于客户端来源地址实现访问控制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Options  1>.OPTIONS指 ...

  9. Httpd服务入门知识-Httpd服务常见配置案例之基于用户账号实现访问控制

    Httpd服务入门知识-Httpd服务常见配置案例之基于用户账号实现访问控制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.基于用户的访问控制概述 认证质询: WWW-Auth ...

  10. Httpd服务入门知识-Httpd服务常见配置案例之定义站点主页面及错误页面配置

    Httpd服务入门知识-Httpd服务常见配置案例之定义站点主页面及错误页面配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.定义站点主页面 [root@node101.yi ...

随机推荐

  1. MySQL性能优化 分区

    简述 分区是指根据一定的规则,数据库将表分解为多个更小的,更容易管理的部分,就访问数据库而言,逻辑上只有一张表或一个索引,但实际上这张表可能又多个物理分区共同构成,每一个分区都是一个独立的对象,可以独 ...

  2. 【CSP膜你赛】ATM

    题目描述 小沈阳在小品里说过:“人生最痛苦的事情是人死了,钱还没花掉”. 于是小宋(80 岁)决定要将所有的储蓄从 ATM 机中取出花光. 小宋忘记 了她有多少存款(银行卡密码她是记得的 2333), ...

  3. Nginx服务器作反向代理实现内部局域网的url转发配置

    情景 由于公司内网有多台服务器的http服务要映射到公司外网静态IP,如果用路由的端口映射来做,就只能一台内网服务器的80端口映射到外网80端口,其他服务器的80端口只能映射到外网的非80端口.非80 ...

  4. 状压dp专题复习

    状压dp专题复习 (有些题过于水,我直接跳了) 技巧总结 : 1.矩阵状压上一行的选择情况 \(n * 2^n\) D [BZOJ2734][HNOI2012]集合选数 蒻得不行的我觉得这是一道比较难 ...

  5. 简单find命令的实现

    贴代码: /*实现一个简单的find命令:*//*程序思路:首先,用一个单链表将所需要的信息存储起来:其次根据所传入的参数信息,改变节点的状态(若有这个状态,证明该节点就是我们所需要的)最后将所需要的 ...

  6. 二叉树 B-树B+树

    聚集索引和非聚集索引结构参考:http://blog.csdn.net/cangchen/article/details/44818623 前两天有位朋友邀请我回答个问题,为什么 MongoDB (索 ...

  7. 为什么需要cookie和session

     为什么需要cookie和session  在Web发展史中,我们知道浏览器与服务器间采用的是 http协议,而这种协议是无状态的,所以这就导致了服务器无法知道是谁在浏览网页,但很明显,一些网页需要知 ...

  8. spring容器干掉if-else

    场景说明 最近新做一个项目,需要对不同店铺的商品做不同处理.例如storeA需要进行handleA操作,storeB需要进行handleB操作,如此类推 大家很容易会想到下面的实现方法 public ...

  9. TCP 粘包问题

    TCP 粘包,主要是因为发送端发送的两个包,TCP按照流进行发送,缓冲器满了才发送. 假如两个包都比较小的话,就会把两个包合并到一起进行发送,造成接收端接到的流无法知道这是一个包还是两个包 假如发送两 ...

  10. git 本地删除修改文件后从远程拉取

    单个文件 git checkout a.php 当前目录 git checkout .