httpd-2.4的编译安装

 

httpd-2.4与2.2版比新特性

1、MPM支持运行为DSO机制,以模块西施按需加载

2、event模块生产环境中使用

3、异步读写机制

4、支持每日志每模块的单独日志级别定义

5、每请求相关的专用配置

6、增强版的表达式分析

7、毫秒级持久连接时长定义

8、基于FQDN的虚拟主机配置不需要NameVirtualHost指令

9、新指令AllowOverrideList

10、用户可以自定义变量

11、更低的内存消耗

 

新模块

1、mod_proxy_fcgi

2、mod_proxy_scgi

3、mod_remoteip

 

安装http-2.4

依赖于apr-1.4以上的版本和apr-util-1.4及以上的版本。也依赖apr-icon不过不是必须的。

apr:apache portable runtime

apache是一个跨平台的web服务器程序,在linux,Unix,windows,mac等操作系统都有其版本。由于操作系统的不同,需要在各个操作系统各写一个版本非常麻烦,于是就有了apr;开发者只需写一个httpd的源码,通过apr编译成在各个操作系统能运行的版本。可见apache对apr的依赖性。通常习惯把httpd成为apache。

 

 

在CentOS 6上编译安装

由于在centos6上默认apr,和apr-util都是1.3.9版本,依赖程序不够,很悲剧,我们只能手动编译安装httpd-2.4.

任何时候编译安装都要有开发环境:

开发环境包组:Development Tools, Server Platform Development

开发程序包:pcre-devel

先配置好yum源,然后安装:

[root@yph6 yum.repos.d]# yum groupinstall Development Tools Server Platform Development

用网上的yum源安装的非常慢,用教室yum源第一次查找成功但安装失败,又试一次居然成功了,不知道什么原因。

[root@yph6 ~]# yum install -y pcre-devel

 

编译安装步骤:

 事先下载好源码包:apr-1.5.0.tar.bz2 ,apr-util-1.5.2.tar.bz2 ,httpd-2.4.10.tar.bz2

 

(1)安装apr-1.5.0

[root@yph6 ~]# tar xf apr-1.5.0.tar.bz2 

[root@yph6 ~]# cd apr-1.5.0

[root@yph6 apr-1.5.0]# ./configure --help | less  ----可以用less查看帮助,而且支持/parrten查找

[root@yph6 apr-1.5.0]# ./configure --prefix=/usr/local/apr  

rpm命令默认安装目录为/usr,为了便于以后卸载,我们安装到另一个目录/usr/local/apr

[root@yph6 apr-1.5.0]# make && make install

[root@yph6 apr-1.5.0]# ls /usr/local/apr

bin  build-1  include  lib  -----------------看到这些说明已经安装成功了

 

(2)安装apr-util-1.5.2

[root@yph6 ~]# tar -xf apr-util-1.5.2.tar.bz2 

[root@yph6 ~]# cd apr-util-1.5.2

[root@yph6 apr-util-1.5.2]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

apr-util安装时会默认去/,/usr,/usr/local下找依赖包apr,找不到会报错,所以要告诉它依赖包安装载哪

[root@yph6 apr-util-1.5.2]# make -j 2 && make install ----make -j 2表示用两个进程安装,如果你cpu够的话

[root@yph6 apr-util-1.5.2]# ls /usr/local/apr-util

bin  include  lib

 

(3)安装httpd-2.4.10

[root@yph6 ~]# tar xf httpd-2.4.10.tar.bz2 

[root@yph6 ~]# cd httpd-2.4.10

[root@yph6 httpd-2.4.10]# ./configure --help | less  -----有非常多的命令,可见功能的强大

[root@yph6 httpd-2.4.10]# ./configure --prefix=/usr/local/httpd24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-arp=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork

[root@yph6 httpd-2.4.10]# make -j 2 && make install

 

enable表示启用哪些

with表示依赖的程序,或者依赖包的安装路径

--sysconfdir=/etc/httpd24:指明conf配置文件放到哪----但好像不起作用,因为前面少写了“--”

enable-so:动态so机制,dso

enable-rewrite:支持URL重写

--with-zlib:提供压缩库,能压缩文件

--with-pcre:支持更强大的扩展正则表达式

--enable-modules=most:启用哪些模块,most表示大多数,all表示所有,也可以把模块列在后面

--enable-mpms-shared=all:所有共享模块

 

[root@yph6 httpd24]# /usr/local/httpd24/bin/apachectl start

自带的服务控制脚本:apachectl,默认不在PATH路径中,所以启动时要用绝对路径

刚才保存说找不到域名,在/usr/local/httpd24/conf/httpd.conf查找到/ServerName,在下面复制出来一行,取消注释,随便给个名字,如localhost,www.a.com等都行,不让它反解析。

 

[root@yph6 httpd24]# netstat -tunl  ---会看到80端口被监听

[root@yph6 ~]# ss -tnl

浏览器访问172.16.59.10会看到“It works”,说明启动成功

 

[root@yph6 httpd24]# ls /usr/local/httpd24

bin  :二进制程序路径

build  :编译安装的相关文件,

[root@yph6 httpd24]# less build/config.nice 可以看到咱们编译安装时执行了哪些命令

cgi-bin  :CGI格式的页面程序存放的位置

conf  :配置文件,由于编译安装时指定配置文件时把路径写错了,所以默认安装到这里了。

--sysconfdir=/etc/httpd24 编译安装时指定配置文件安装位置

error  :错误页面,比如404页面就在这里存放

htdocs  :网页文件存放位置

icons  :各种图标

include  :头文件,

logs  :日志

man  :帮助手册

manual  :官方文档

modules:模块

 

PATH黄金变量的修改

PATH黄金变量定义的是去哪些地方找程序,不同位置用冒号隔开。默认先找左边的位置,找不到再去第一个冒号后的位置去找,一次类推。因为我们安装了两个版本的httpd,所以我们要把路径写在最左边,否则第一次找到了可能是我们上一次安装版本的apachectl,而不是,这一次安装的。

[root@yph6 httpd24]# echo $PATH

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

[root@yph6 httpd24]# export PATH=/usr/local/httpd24/bin:$PATH ---在原有位置前面加一个位置。

[root@yph6 httpd24]# echo $PATH

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

 

但是这种定义不能永久生效,修改配置文件永久生效。

[root@yph6 httpd24]# vim /etc/profile.d/httpd.sh ----改配置文件仅对新登录的用户有效

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


[root@yph6 ~]# httpd -t-----测语法

Syntax OK

[root@yph6 ~]# hash-------查看你最近执行过的命令的绝对路径

hits  command

1/usr/local/httpd24/bin/httpd ------发现httpd命令的路径也连带着被改了。

2/usr/local/httpd24/bin/apachectl

5/usr/sbin/ss

 

导出头文件

[root@yph6 ~]# ln -sv /usr/local/httpd24/include /usr/include/httpd

`/usr/include/httpd' -> `/usr/local/httpd24/include'

 

导出库文件

正常情况下

[root@yph6 ~]# ldconfig -p ---------查看系统加载了哪些库文件,这些库文件的路径

但我们的httpd库文件路径不对,告诉系统我们的库文件在哪

[root@yph6 ~]# vim /etc/ld.so.conf.d/httpd.conf

/usr/local/apr/lib

/usr/local/apr-util/lib

/usr/local/httpd24/lib  ----------不过httpd-2.4.10库文件好像不在这,这个可暂时不写

[root@yph6 ~]# ldconfig -v | grep httpd ----重新加载一次库文件,并查看加载哪些httpd的库

 

卸载的话,执行如下操作,配置文件安装在别处时也要手动删除。

[root@yph6 httpd-2.4.10]# make clean  -----在源码包里执行,没包的话跳过这步

rm -rf /usr/local/httpd24/

 

导出man手册

[root@yph6 ~]# vim /etc/man.config  ----添加下面一行

MANPATH /usr/local/httpd24/man

 

利用服务脚本启动apache:

 

[root@yph6 ~]# cd /etc/rc.d/init.d

[root@yph6 init.d]# cp httpd httpd24  -----复制2.2版本的文件

[root@yph6 init.d]# vim httpd24

注释掉下面三行

if [ -f /etc/sysconfig/httpd ]; then

        . /etc/sysconfig/httpd

fi

 

仍需修改的如下:

apachectl=/usr/local/httpd24/bin/apachectl

httpd=${HTTPD-/usr/local/httpd24/bin/httpd}

pidfile=${PIDFILE-/usr/local/httpd24/logs/httpd.pid}

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

 

[root@yph6 init.d]# chkconfig --add httpd24 -----把文件加进来

[root@yph6 init.d]# chkconfig --list httpd24 --------查看httpd24服务在哪个启动级别下是开启的

httpd24        0:off1:off2:off3:off4:off5:off6:off

 

测试下下面的执行是否有问题,结果是没问题的。

[root@yph6 init.d]# service httpd24 status -----这个httpd24可能指脚本,反正不在这个目录下也可以执行。不太懂。

[root@yph6 init.d]# service httpd24 stop

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

 

MPM模块更换

[root@yph6 init.d]# httpd -l  ---这是刚才安装的httpd-2.4,没有prefork.c或另外两个,因为在2.4版本上变成了共享模块了,不在是静态模块了。

Compiled in modules:

  core.c

  mod_so.c

  http_core.c

[root@yph6 init.d]# /usr/sbin/httpd -l  ------这是之前安装的httpd-2.2,有prefork.c

Compiled in modules:

  core.c

  prefork.c

  http_core.c

  mod_so.c

 

切换MPM:

由于编译安装时没配置好配置文件路径,本来要把配置文件安装到/etc/httpd24下,结果在/usr/local/httpd24/conf/目录下

httpd.conf为主配置文件,额外配置文件在extra目录下。

 

[root@yph6 conf]# vim /usr/local/httpd24/conf/httpd.conf

#Include conf/extra/httpd-mpm.conf -----去掉注释,这样才能启用extra目录下的相关配置文件

把LoadModule mpm_prefork_module modules/mod_mpm_prefork.so改为

LoadModule mpm_event_module modules/mod_mpm_event.so

或者这是掉写到..../extra/httpd-mpm.conf里去

 

[root@yph6 conf]# service httpd24 restart ----重启服务,或用apachectl 

[root@yph6 extra]# httpd -M | grep mpm

 mpm_event_module (shared)    ----------------模块切换成功

 

 

在CentOS 7上安装

# yum install  httpd


 [root@yph7s ~]# apachectl start

[root@yph7s ~]# ss -tnl

LISTEN      0              128         :::80        :::*   80端口被监听

开启服务时,之前用systemctl start httpd.service试了好多遍都报错,不知道为何。

 

 无法启动服务的一种情况解决办法:

[root@yph7s conf.d]# systemctl reload httpd.service 

Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.

[root@yph7s conf.d]# vim /etc/httpd/conf.modules.d/00-mpm.conf 

注释掉event模块,启用prefork模块

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


配置文件

/etc/httpd/conf/httpd.conf

/etc/httpd/conf.modules.d/*.conf

/etc/httpd/conf.d/*.conf

 

配置应用

(1) 切换使用的MPM

 

[root@yph7s ~]# ls /etc/httpd/modules/

mod_mpm_prefork.so

mod_mpm_worker.so

mod_mpm_event.so

 

[root@yph7s ~]# httpd -M | grep mpm 

 mpm_prefork_module (shared) --------也变成了共享模块,动态模块了,不在是静态模块,用httpd -l查不出来

 

[root@yph7s ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

#LoadModule mpm_worker_module modules/mod_mpm_worker.so

#LoadModule mpm_event_module modules/mod_mpm_event.so

这三行哪行没被注释就启用哪个

 

[root@yph7s ~]# systemctl restart httpd.service ----重启服务

 

(2) 基于IP的访问控制

 

[root@yph7s ~]# mkdir -pv /web/htdocs

[root@yph7s ~]# vim /web/htdocs/index.html

 

[root@yph7s ~]# cp /etc/httpd/conf/httpd.conf{,.bak} ---备份配置文件

[root@yph7s ~]# vim /etc/httpd/conf/httpd.conf 

DocumentRoot "/web/htdocs" ---------更改web服务器的根

把<Directory "/var/www/html">改成

<Directory "/web/htdocs">

Require  all  granted  ----------允许所有主机访问,默认是禁止所有主机访问的,不加这句就不能访问。

Options -Indexes FollowSymLinks,如果父目录定义了Indexes,此目录只想留FollowSymLinks,最好在写上-Indexes,否则不写Indexes时可能会从上面继承这个属性。用减号减去就一定能去掉了。不过测试好像有点问题。

[root@yph7s conf.d]# mv /etc/httpd/conf.d/welcome.conf{,.bak} -----关掉欢迎页面

 

[root@yph7s ~]# httpd -t

Syntax OK

[root@yph7s ~]# systemctl start httpd.service

 

然后用浏览器访问,第一次不能访问,把SElinux关闭重启后居然可以了,不知道是因为重启还是因为关掉SElinux。

 

只有一句限制时写一句就行了如上,如果多于一句的话就要封装起来,如下:

<RequireAll>

Require all granted

Require not ip 172.16.59.10

</RequireAll>

 

Require的格式:

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

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

 

控制特定的IP访问:

Require  ip  IPADDR:允许指定来源的IP访问;

Require  not  ip  IPADDR:拒绝定来源的IP访问

 

控制特定的主机访问: 不常用,还要反解析

Require  host  HOSTNAME:授权指定来源的主机访问;

Require  not  host  HOSTNAME:拒绝指定来源的主机访问

 

HOSTNAME的类型:

FQDN:特定主机

domin.tld:指定域名下的所有主机

 

(3) 虚拟主机

基于FQDN的虚拟主机也不再需要NameVirutalHost指令;

 

在/etc/httpd/conf/httpd.conf中注释掉web服务器的根

#DocumentRoot "/web/htdocs"

 

[root@yph7s conf.d]# vim /etc/httpd/conf.d/virhtdocs.conf 

<VirtualHost *:80>  ------------表示监听本机所有可用ip的80端口        

 ServerName www.a.com

        DocumentRoot /web/a.com

        <Directory "/web/a.com">

                Options None

                AllowOverride None

                Require all granted

        </Directory>

</VirtualHost>

<VirtualHost *:80>

        ServerName www.b.com

        DocumentRoot /web/b.com

        <Directory "/web/b.com">

                Options None

                AllowOverride None

                Require all granted

         </Directory>

</VirtualHost>

 

创建web服务器主页:

mkdir /web/{a,b}.com

vim /web/a.com/index.html

vim /web/b.com/index.html

 

语法检测和重载

httpd -t

systemctl reload httpd.service

 

修改hosts文件并测试

172.16.59.3 www.a.com  www.b.com www.c.com

[root@yph6 conf]# curl http://www.a.com

a.com

[root@yph6 conf]# curl http://www.b.com

b.com

 

注意:任意目录下的页面只有在<Directory>显式授权才能被访问;

 

(4) 持久连接时长定义

KeepAliveTimeout  可以毫秒级,ms,一般只能用到2s

[root@yph7s conf.d]# vim /etc/httpd/conf/httpd.conf

有系统默认未定义KeepAlive,所有需手动添加:

KeepAlive on

KeepAliveTimeout 30ms

MaxKeepAliveRequests 20

 

语法检测和重载:

httpd -t

systemctl reload httpd.service