第1章   apache2.4

1.1      基础

1.1.1    2.4版本的新特性

新特性

l  MPM支持运行DSO机制,在编译时可将三个模块都编译进去,可按需加载

l  支持event MPM

l  支持异步读写

l  支持每个模块及每个目录分别使用各自的日志级别

l  基于FQDN的虚拟主机不再需要NameVirtuaHost指令

l  支持用户自定义变量

新模块

mod_proxy_fcgi   #fast cgi快速cgi机制,cgi的全称是“通用网关接口”,apache与php交互有三种方式,其中一种方式就是通过cgi进行交互,如果php与apache分离成两台主机,那么它们之间的交互不得不依赖于tcp/ip或者“套接字”进行交互,这种分离的方式又被称之为fast cgi。

mod_ratelimit,作用是可以进行限速

mod_remoteip ,做远端IP地址的控制

修改了一些配置机制:

不再支持使用Order,Deny,Allow来做基于IP的访问控制。

注意:

目前centos6上的apache都是2.2版本的,想要升级为2.4版本有些麻烦,建议不要在centos6上面使用2.4版本,原因如下:

apache程序的运行需要依赖一种叫做apr的东西,那么这个apr是什么东西呢?apr是apache  portable  runtime的缩写,其实就是apache运行时所依赖的环境,在centos6当中这个环境的版本是1.3.9,如下:

[root@www ~]# rpm -qa | grep apr

apr-1.3.9-5.el6_2.x86_64   

apr-util-ldap-1.3.9-3.el6_0.1.x86_64   #除了上面apr的主要程序,下面这两个程序也是非常重要的哦!

apr-util-1.3.9-3.el6_0.1.x86_64       #这三个加起来就是apache在安装时的基本环境

而2.4版本的apache所依赖的环境并不是1.3.9了,而是1.4以上,你可能会说了,把apr升级成1.4之后再安装2.4版本的apache不就行了吗?这样做太冒险,因为apr这个环境不仅仅是apache所依赖,可能别的软件也会依赖,所以还是尽量不要升级,所以在centos6上安装apache2.4只有一种办法了就是编译安装,下面就演示一下在centos6上进行apache2.4的编译安装。

1.1.2    在6上编译安装apache2.4

安装前的准备:

yum  groupinstall “Development  tools” “Server Platform Development” –y 

yum –y  install  pcre  pcre-devel   

groupadd –r apache

useradd –r –g apache apache

apr安装:

apr-1.5.2

./configure  --prefix=/usr/local/apr

make && make install

apr-util安装

arp-utils-1.5.3

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr  #with的意思是针对于apr来安装apr-utill

make && make install

httpd2.4的安装:

wget http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.33.tar.gz    #下载

yum -y install pcre pcre-devel    #这两个包是开发包,必须要安装

yum –y install openssl-devel

./configure  --prefix=/usr/local/apache  --sysconf=/etc/httpd24  --enable-so  --enable-ssl  --enable-cgi --enable-rewrite  --with-zlib  --with-pcre  --with-apr=/usr/local/apr  --with-apr-util=/usr/local/apr-util/  --enable-modules=most  --enable-mpms-shared=all  --with-mpm-prefork

make

make install

 

--prefix是指明路径,不必多说

--sysconfig=/etc/httpd24这里是指明存放配置文件的目录为/etc/httpd24,因为使用rpm包安装的httpd的配置文件在/etc/httpd,这里的24主要用来区别。

--enabled-so 支持动态模块加载机制

--enable-cgi  激活CGI后面会讲cgi

 --enable-rewrite作用是URL重写

--with-zlib   作用是压缩

--with-pcre  #pcre兼容正则表达式库(Perl Compatible Regular Expressions),在URL重写时会用到,在安装它之前要先安装pcre-devel包

--with-apr-/usr/local/apr   #指明2.4的依赖的apr

--with-apr-util=/usr/local/apr-util/   #指明2.4所依赖的util

--enable-modules=most  #要编译进去哪些模块呢?most代表大多数模块,而all代表全部模块,后面跟上—help可以查看

--enable-mpms-shared=all  #把所支持mpm模块都编译进来

--with-mpm-prefork   #把所有的mpm模块都编译进来之后,默认使用prefork

启动服务:

apache自带了一个服务启动脚本apachectl

apachectl start     #编译安装的httpd不可能有服务脚本的,所以也只能通过这种方式启动

1.1.3    在6上编译安装2.4之后的善后

apachectl用于控制httpd的开启和关闭

[root@www ~]# ls /usr/local/apache/bin/apachectl          #两个命令是不一样的

/usr/local/apache/bin/apachectl

[root@www ~]# which apachectl

/usr/sbin/apachectl

我们首先要明白一点,apachectl这个命令无论是rpm包安装还是使用编译安装都会生成此命令,不过此命令所在的路径是不同的。以上一小节的编译安装路径的来讲,编译安装之后的apache的路径在/usr/local/apache/bin/目录下,而使用rpm安装的apachectl在/usr/sbin/apachectl目录下,所以我们在使用的时候要当心,在使用此命令的时候最好使用全路径。

在同一时刻,我们只能启动一个http服务,假设我只想启动编译安装的,但是写绝对路径又太麻烦了,我们可以把绝对路径写入到PATH里面,怎样写入呢?我们之前学过的,每启动一个新的shell或者使用su-切换到某一个用户都会读取/etc/profile文件和/etc/profile.d/*.conf文件,我们在/etc/profile.d/里面新建一个脚本文件,然后将/usr/local/apache/bin/优先于/usr/sbin,这样的话我们直接在命令行当中定apachectl的时候,优先调用的就是编译安装好的那个apachectl,下面我们就来做一下:

[root@www ~]# echo $PATH

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@www ~]# cd /etc/profile.d     #进入到/etc/profile.d目录下

[root@www profile.d]# vim httpd.sh   #写一个全局变量赋值命令,一定要是.sh结尾

export PATH=/usr/local/apache/bin/:$PATH

[root@www profile.d]# . ./httpd.sh   #重读

 [root@www profile.d]# echo $PATH   #检查

/usr/local/apache/bin/:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

好,这样我们再使用apachectl时再调用时就是编译好的apachectl而不是使用rpm安装的那个了。

比如我们想要开机立马就启动编译安装好httpd,而不是rpm安装好的,怎么做呢?

     两种方法:

     第一种非常的简单,就是把apachectl start这种命令直接写入到/etc/rc.d/rc.local这个文件里面,开机自动就会执行了。

第二种就是把自己写一个脚本加入到/etc/init目录下,使之能够被service命令和chkconfig命令进行调用,其实这个脚本并不难写,我们只要仿照rpm包安装的httpd修改一下就好,过程如下:

apachectl=/usr/local/apache/bin/apachectl    #apachectl命令的路径修改一下

httpd=/usr/local/apache/bin/httpd   #httpd二进制的文件

 prog=httpd                       #不动

 pidfile=${PIDFILE-/var/run/httpd/httpd24.pid}   #把httpdPID更改成httpd24

 lockfile=${LOCKFILE-/var/lock/subsys/httpd24}   #这个也更改成http24

[root@www init.d]# chkconfig --add httpd24

[root@www init.d]# chkconfig --list httpd24

httpd24           0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭

[root@www init.d]# chkconfig httpd24 on

[root@www init.d]# chkconfig --list httpd24

httpd24           0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭

[root@www init.d]# service httpd24 start

1.1.4    centos7上httpd

apache2.4_第1张图片

里面提供了有各种modules,如果想改过模块装载与否的话只需要更改配置文件 。

而配置文件前面的序号是在glob匹配的时候有次序匹配的含义

查看模块装载到了什么地方:

[root@localhost ~]# rpm -ql httpd

/usr/lib64/httpd/modules/mod_mpm_event.so

/usr/lib64/httpd/modules/mod_mpm_prefork.so

/usr/lib64/httpd/modules/mod_mpm_worker.so   ……………  #都装载到了/usr/lib64/httpd/modules/下了

/etc/httpd/conf.modules.d    

[root@localhost conf.modules.d]# less 00-mpm.conf    #从此文件当中就可以看到用的使用mpm模块

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so  #我们可以看到默认使用的还是prefork,我们可以在里面更改……,如果我们要使用别的模型把对应行前面的注释然后重启即可。

systemctl restart httpd.service   #重启httpd

[root@localhost ~]# httpd -l

Compiled in modules:

  core.c

  mod_so.c

  http_core.c

[root@localhost ~]# httpd –M

 

[root@localhost ~]# httpd -M | grep mpm    #验证当前使用的使用mpm模块

mpm_prefork_module (shared)  

centos7:

配置文件:

l  主配置文件:/etc/httpd/conf/httpd.conf

l  模块配置文件:/etc/httpd/conf/conf.modules.d/*.conf

l  辅助配置文件:/etc/httpd/conf.d/*.conf

l  Mpm:以DSO机制提供,配置文件00-mpm.conf

服务控制:

Systemctl {start|stop|restartstatus|reload}  httpd.service

如果直接使用apachectl是rpm生成的命令,如果想使用编译安装的话就得使用全路径,/usr/local/apache/bin/apachectl,如果你想方便一些,不想写这么长的名字,您可以将共写入到PATH变量里面,只要在/etc/profile.d/httpd.sh:

export PATH =/usr/local/apache/bin:PATH    #把sysctl写入到前面

./etc/profile.d/httpd.sh

echo $PATH

[root@localhost ~]# setenforce 0

[root@localhost ~]# iptables -F

[root@localhost ~]# systemctl start httpd

/etc/profile.d文件

1.1      配置

1.1.1    切换使用MPM

 [root@www ~]# httpd -M | grep mpm    #查看当前使用的MPM模块,在2.4当中httpd –l不会显示使用的mpm模块。

mpm_prefork_module (shared)

还可以像下面这样,直接去配置文件里面查看:

[root@localhost conf.modules.d]# cat 00-mpm.conf | egrep -v "^$|#"

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

怎样切换MPM模块呢?如下

[root@localhost ~]# cd /etc/httpd/conf.modules.d/     #这个目录是专门放置模块用的,而2.2是没有这个目录的

[root@localhost conf.modules.d]# vim 00-mpm.conf  #把想要开启的mpm模块前的#去掉检查语法后然后重启服务即可,假设我们在这里把prefork更改成了event。

[root@localhost conf.modules.d]# httpd –t

Syntax OK

[root@localhost conf.modules.d]# systemctl restart httpd.service

[root@localhost ~]# httpd -M | grep mpm    #event模块生效

mpm_event_module (shared)  

1.1.2    虚拟主机

虚拟主机的配置内容与6是一样的,不过centos7我们可以把虚拟主机的配置内容专门拿出来生成一个配置文件以.conf结尾的文件放置到/etc/httpd/conf.d目录下,注意,要把中心主机给注释掉。

编译安装的2.4版本也是被拆分成一个又一个小片段放置在/etc/httpd24/extra/这个辅助配置文件里面了。

1.1.3    访问控制

2.4的根目录与2.2的根目录配置虽然差不多,但是其运行机制变了,比如我们在2.2当中使用DocumentRoot定义了主目录之后,下文当中的Directory所对应的目录如果与DocumentRoot对应的目录不同,那么Directory里面的限制只会限定在Directory对应的目录当中,而DocumentRoot所有人是照常可以访问的。

   我们先用2.2来举例子:

DocumentRoot "/www/html"    #由原来的/var/www/html更改成了/www/html/,当然前是得有这个目录

                  #此标签下面的内容都没动

    Options FollowSymLinks

    AllowOverride None

             #这里也更改成了与DocumentRoot对应的目录一致,并做了限制

    Options Indexes FollowSymLinks

    AllowOverride None

    Order allow,deny

    Deny from 192.168.80.100/32     #拒绝了物理机

    Allow from all

在物理机的结果是这样的,如下:

apache2.4_第2张图片

这个结果说明我们的上面的实验是成功的。我们再进一步,还是用2.2版本,如果Directory与DocumentRoot所对应的目录不一样,测试语法时会不会报错?如果不报错的话,假如DocumentRoot是/www/html/,与Directory写的是/www/html/htdocs,然后在/www/html/htdocs限制了物理机的访问,物理机肯定不能访问/www/html/htdocs下的index.html,但是它可不可以访问/www/html/下的index.html呢?下面我们就来试一试

DocumentRoot "/www/html"    #由原来的/var/www/html更改成了/www/html/,当然前是得有这个目录

                  #此标签下面的内容都没动

    Options FollowSymLinks

    AllowOverride None

www/html/htdocs">           #这里也更改成了与DocumentRoot对应的目录不一致,并做了限制

    Options Indexes FollowSymLinks

    AllowOverride None

    Order allow,deny

    Deny from 192.168.80.100/32     #拒绝了物理机

    Allow from all

实验结果是,当物理机访问/www/html/htdocs被拒绝,但是访问/www/html没有被拒绝,实验结果截图如下:

image.png

apache2.4_第3张图片

那么通过这个实验学习了什么呢?

DocumentRoot对应的目录可以与Directory对应的目录不一致,在请求检测时不会出错,不过前提是要有这些目录。

如果Directory标签里面做了限制,那么此限制就仅仅对此标签对应的目录起作用,如果此标签Directory与DocumentRoot对应的目录一致,那么限制自然就一致,如果不一致,就仅对Directory做限制,而DocumentRoot那里对应的目录因为没有限制,默认谁都可以进行访问,那么以上就是apache2.2版本DocumentRoot和Directory的关系。

下面我们再看一下2.4版本关于DocumentRoot和Directory的关系,在centos7上做,当然了还是用实验说话:

DocumentRoot "/www/html"      #由原来的/var/www/html更改成了/www/html/,当然前是得有这个目录

          #没做更改

    AllowOverride None

    Require all granted

   #与DocumentRoot不一致

    Options Indexes FollowSymLinks

    AllowOverride None

                      #与2.2不同的是,这时要专门制定一个标签

    Require not ip 192.168.80.100/32

    Require all granted

   

实验结果:

apache2.4_第4张图片

apache2.4_第5张图片

当我们把 标签当中的拒绝项给删除之后,如下,实验结果又是这样的, 

                  

    Require all granted

image.png

image.png

那么我们通过2.2与2.4的配置文件的对比,我们最应该明白的一点就是:

2.2版本的DocumentRoot对应的目录,在没做Directory限制时,默认允许所有人访问

2.4版本的DocumentRoot对应的目录,在没做Directory限制时,默认拒绝所有人访问

 

2.4的版本的配置文件有所变量,虚拟主机可自定义到目录当中,删除和更改都非常的方便,由其是自动化运维的时候。


编译后的centos6服务脚本

在cetos6当中编译安装2.4之后默认是没有服务脚本,没有服务就没有办法使用service命令进行程序的控制,我们可以利用rpm默认安装的服务脚本,把脚本里面的程序的路径改成使用编译安装的程序的路径就可以了,非常的简单。

[root@www init.d]# cp httpd httpd24

apachectl=/usr/local/apache/bin/apachectl    #改

httpd=/usr/local/apache/bin/apachectl     #改         

prog=httpd        #没有更改

pidfile=${PIDFILE-/var/run/httpd/httpd24.pid}   #改

lockfile=${LOCKFILE-/var/lock/subsys/httpd24}   #改

[root@www init.d]# chkconfig --add httpd24

[root@www init.d]# chkconfig --list httpd24

httpd24           0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭

[root@www init.d]# chkconfig httpd24 on