Apache入门篇(三)之apache2.4.33的新特性解析与虚拟主机实战

Stella981
• 阅读 422

1、http 2.4新特性

新特性:
(1) 在编译时可以将多个MPM构建为可加载模块,可以在运行时通过LoadModule指令配置所选的MPM;

(2) 2.2版本的event MPM在实验阶段,到了2.4版本已经完全支持event MPM;

(3)更好地支持异步读写以支持MPM和各类平台;

(4) 支持每模块及每个目录分别使用各自的日志级别;

(5) 按请求配置;,部分可用于根据每个请求标准设置配置;

(6) 增强版的表达式分析器;

(7) 支持毫秒级的keepalive timeout;

(8) 基于FQDN的虚拟主机不再需要NameVirtualHost指令;

(9)新AllowOverrideList指令允许更细粒度的控制,允许在.htaccess文件中使用哪些指令。

(10) 支持用户自定义变量;

(11)减少了内存的使用量

新模块:
(1) mod_proxy_fcgi 实现httpd以fcgi和后端php服务器相结合
(2) mod_ratelimit 实现速率限制
(3) mod_remoteip 实现远端ip地址的控制

修改了一些配置机制:
不再支持使用Order, Deny, Allow来做基于IP的访问控制;

2、centos 7上apache 2.4和2.2版本配置差异解析

[root@localhost ~]# yum install -y httpd[root@localhost ~]# rpm -qc httpd  #查看yum安装的httpd的配置文件

/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf.modules.d/00-dav.conf
/etc/httpd/conf.modules.d/00-lua.conf
/etc/httpd/conf.modules.d/00-mpm.conf
/etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.modules.d/00-systemd.conf
/etc/httpd/conf.modules.d/01-cgi.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd

配置文件:

主配置文件:/etc/httpd/conf/httpd.conf
模块配置文件:/etc/httpd/conf.modules.d/*.conf
辅助配置文件:/etc/httpd/conf.d/*.conf

mpm:以DSO机制提供,配置文件00-mpm.conf,需要修改不同的模式加载,只需要修改这个文件,不再像2.2版本只能重新编译加载不同的模式。

服务控制:systemctl {start|stop|restart|status|reload} httpd.service

(1)切换使用MPM

修改配置文件加载MPM模式的格式:

LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
NAME: prefork, event, worker

[root@localhost ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf  #修改mpm模块加载配置文件,加载使用event模式
LoadModule mpm_event_module modules/mod_mpm_event.so
[root@localhost ~]# apachectl -t
Syntax OK
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# httpd -M |grep mpm  #重启后,可以看到httpd的mpm模式使用了动态共享模式进行加载
 mpm_event_module (shared)
[root@localhost ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf   #修改为work模式
LoadModule mpm_worker_module modules/mod_mpm_worker.so
[root@localhost ~]# apachectl -t
Syntax OK
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# httpd -M|grep mpm  #重启后可以看到使用了work模式
 mpm_worker_module (shared)

(2) 修改'Main' server的DocumentRoot

apache 2.4版本在设置虚拟主机时,已去除了NameVirtualHost的配置,直接在主配置文件中更改配置为

IncludeOptional conf.d/*.conf即可模块化修改虚拟主机的配置。

(3)基于IP的访问控制法则

允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny

[root@localhost ~]# curl 192.168.56.11    #在192.168.56.13上访问正常
<h1> welcome to use apache </h1>

[root@localhost html]# vim /etc/httpd/conf/httpd.conf    #修改主配置文件,拒绝所有主机访问

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>
[root@localhost html]# apachectl -t
Syntax OK
[root@localhost html]# systemctl restart httpd[root@localhost ~]# curl 192.168.56.11  #重新访问提示403<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>403 Forbidden</title></head><body><h1>Forbidden</h1><p>You don't have permission to access /on this server.</p></body></html>

在windows上访问测试页面,提示没有权限访问,如图:

Apache入门篇(三)之apache2.4.33的新特性解析与虚拟主机实战

控制特定IP访问:
Require ip IPADDR:授权指定来源地址的主机访问
Require not ip IPADDR:拒绝指定来源地址的主机访问

IPADDR:
IP: 172.16.100.2
Network/mask: 172.16.0.0/255.255.0.0
Network/Length: 172.16.0.0/16
Net: 172.16

控制特定主机(HOSTNAME)访问
Require host HOSTNAME
Require not host HOSTNAME

HOSTNAME:
FQDN: 特定主机
DOMAIN:指定域内的所有主机

[root@localhost html]# vim /etc/httpd/conf/httpd.conf  #修改主配置文件httpd.conf

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    <RequireAll>
    Require all granted
    Require not ip 192.168.56.13  #配置不允许192.168.56.13ip访问
    </RequireAll>
</Directory>
[root@localhost html]# apachectl -t
Syntax OK
[root@localhost html]# systemctl restart  httpd
[root@localhost ~]# curl 192.168.56.11  #访问测试
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /
on this server.</p>
</body></html> 

3、apache 2.4编译安装虚拟主机配置实战

(1)虚拟主机分类
虚拟主机是在同一 http 服务下部署多个站点,每个站点都使用不同的域名和站点目录,或不同 IP 和端口。也就是
一个 http 服务配置多个站点。
①基于域名的虚拟主机
②基于端口的虚拟主机
③基于 IP 的虚拟主机

(2)配置基于域名的虚拟主机

需求

域名

目录

www.abc.org

/var/html/www

blog.abc.org

/var/html/blog

bbs.abc.org

/var/html/bbs

[root@localhost ~]# mkdir /var/html/{www,blog,bbs} -p  #创建网站目录
[root@localhost ~]# for name in www blog bbs;do echo "http://$name.abc.org" > /var/html/$name/index.html;done  #创建主页文件index.html
[root@localhost ~]# for name in www blog bbs;do cat /var/html/$name/index.html;done
http://www.abc.org
http://blog.abc.org
http://bbs.abc.org
[root@localhost ~]# cp /usr/local/apache-2.4.33/conf/extra/httpd-vhosts.conf{,.bak_$(date +%F)}
[root@localhost ~]# > /usr/local/apache-2.4.33/conf/extra/httpd-vhosts.conf  #配置虚拟主机文件http-vhosts.conf
[root@localhost ~]# vim !$
<VirtualHost *:80>
   ServerAdmin aaa@abc.com
   DocumentRoot "/var/html/www"
   ServerName www.abc.org
   ServerAlias abc.org
   ErrorLog "logs/www-error-log"
   CustomLog "logs/www-access-log" common
</VirtualHost>


<VirtualHost *:80>
   ServerAdmin aaa@abc.com
   DocumentRoot "/var/html/blog"
   ServerName blog.abc.org
   ErrorLog "logs/blog-error-log"
   CustomLog "logs/blog-access-log" common
</VirtualHost>


<VirtualHost *:80>
   ServerAdmin aaa@abc.com
   DocumentRoot "/var/html/bbs"
   ServerName bbs.abc.org
   ErrorLog "logs/bbs-error-log"
   CustomLog "logs/bbs-access-log" common
</VirtualHost>[root@localhost ~]# vim /usr/local/apache-2.4.33/conf/httpd.conf  #修改主配置文件httpd.conf,加载相关扩展配置
# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
[root@localhost ~]# /usr/local/apache-2.4.33/bin/apachectl -t  #检查配置文件语法
Syntax OK
[root@localhost ~]# /usr/local/apache-2.4.33/bin/apachectl graceful  #平滑重启apache
[root@localhost ~]# vim /etc/host   #配置本地域名解析
192.168.56.11 www.abc.org bbs.abc.org blog.abc.org
[root@localhost ~]# ping www.abc.org   #检查域名解析
[root@localhost ~]# ping bbs.abc.org
[root@localhost ~]# ping blog.abc.org
[root@localhost ~]# curl www.abc.org   #curl访问提示报错403:禁止访问
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /
on this server.<br />
</p>
</body></html>

报 403 错原因:
Apache 的主配置文件 httpd.conf 中没有配置站点目录的访问权限,程序不能访问/var/html/下的目录和文件。

[root@localhost conf]# vim httpd.conf #配置站点目录访问权限
#在 httpd.conf 文件最后添加如下代码:
<Directory "/var/html">
   Options FollowSymLinks
   AllowOverride None
   Require all granted
</Directory>

如果是apache 2.2版本使用如下配置:

<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>

[root@localhost conf]# /usr/local/apache-2.4.33/bin/apachectl -t
Syntax OK
[root@localhost conf]# /usr/local/apache-2.4.33/bin/apachectl graceful
[root@localhost ~]# curl www.abc.org
http://www.abc.org
[root@localhost ~]# curl bbs.abc.org
http://bbs.abc.org
[root@localhost ~]# curl blog.abc.org
http://blog.abc.org

(3)配置基于端口的虚拟主机

(1)修改 httpd.conf 文件,配置监听端口
[root@localhost conf]# vim httpd.conf 
在 Listen 80 下面新增如下代码:
Listen 8001
Listen 8002

(2) 将 blog 和 bbs 站点监听端口改为如下:
[root@localhost conf]# vim extra/httpd-vhosts.conf
<VirtualHost *:80>
   ServerAdmin aaa@abc.com
   DocumentRoot "/var/html/www"
   ServerName www.abc.org
   ServerAlias abc.org
   ErrorLog "logs/www-error-log"
   CustomLog "logs/www-access-log" common
</VirtualHost>


<VirtualHost *:8001>  #监听8001端口
   ServerAdmin aaa@abc.com
   DocumentRoot "/var/html/blog"
   ServerName blog.abc.org
   ErrorLog "logs/blog-error-log"
   CustomLog "logs/blog-access-log" common
</VirtualHost>


<VirtualHost *:8002>  #监听8002端口
   ServerAdmin aaa@abc.com
   DocumentRoot "/var/html/bbs"
   ServerName bbs.abc.org
   ErrorLog "logs/bbs-error-log"
   CustomLog "logs/bbs-access-log" common
</VirtualHost>
[root@localhost conf]# /usr/local/apache-2.4.33/bin/apachectl -t  #检查语法
Syntax OK
[root@localhost conf]# /usr/local/apache-2.4.33/bin/apachectl graceful  #平滑启动apache
[root@localhost conf]# netstat -tulnp |grep httpd  #检查监听端口
tcp6       0      0 :::80                   :::*                    LISTEN      51199/httpd         
tcp6       0      0 :::8001                 :::*                    LISTEN      51199/httpd         
tcp6       0      0 :::8002                 :::*                    LISTEN      51199/httpd         
[root@localhost conf]# curl blog.abc.org:8001   #测试访问结果
http://blog.abc.org
[root@localhost conf]# curl blog.abc.org:8002
http://bbs.abc.org

(4)配置基于IP的虚拟主机

(1)为 eth0 临时配置一个新 IP
[root@localhost ~]# ifconfig eth0:0 192.168.56.110/24 up

(2)检查
[root@localhost ~]# ifconfig eth0:0
eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.110  netmask 255.255.255.0  broadcast 192.168.56.255
        ether 00:0c:29:ce:31:fd  txqueuelen 1000  (Ethernet)

[root@localhost ~]# ping 192.168.56.110
PING 192.168.56.110 (192.168.56.110) 56(84) bytes of data.
64 bytes from 192.168.56.110: icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from 192.168.56.110: icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from 192.168.56.110: icmp_seq=3 ttl=64 time=0.044 ms
64 bytes from 192.168.56.110: icmp_seq=4 ttl=64 time=0.059 ms
^C
--- 192.168.56.110 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 0.034/0.060/0.104/0.027 ms

(3)修改扩展配置文件 httpd-vhosts 文件,配置相关 IP
[root@localhost conf]# vim extra/httpd-vhosts.conf
#将blog.abc.org站点改为ip访问
<VirtualHost 192.168.56.110:80>
   ServerAdmin aaa@abc.com
   DocumentRoot "/var/html/blog"
   ServerName 192.168.56.110
   ErrorLog "logs/blog-error-log"
   CustomLog "logs/blog-access-log" common
</VirtualHost>

[root@localhost conf]# /usr/local/apache-2.4.33/bin/apachectl -t
Syntax OK
[root@localhost conf]# /usr/local/apache-2.4.33/bin/apachectl graceful
[root@localhost conf]# curl 192.168.56.110
http://blog.abc.org
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
8个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这