第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
里面提供了有各种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
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Deny from 192.168.80.100/32 #拒绝了物理机
Allow from all
在物理机的结果是这样的,如下:
这个结果说明我们的上面的实验是成功的。我们再进一步,还是用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
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Deny from 192.168.80.100/32 #拒绝了物理机
Allow from all
实验结果是,当物理机访问/www/html/htdocs被拒绝,但是访问/www/html没有被拒绝,实验结果截图如下:
那么通过这个实验学习了什么呢?
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
Options Indexes FollowSymLinks
AllowOverride None
Require not ip 192.168.80.100/32
Require all granted
实验结果:
当我们把
Require all granted
那么我们通过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