http-2.4版本编译安装

本文详细介绍了Apache httpd-2.4版本的编译安装过程,包括新特性和模块,如mpm支持、event mpm、mod_proxy_fcgi等。在CentOS 6.5环境下,由于依赖问题,需要单独编译apr、apr-util。此外,文章还提及了配置修改,如启用event mpm,调整DocumentRoot,以及基于IP的访问控制和虚拟主机配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

httpd-2.4版本新特性:

    1.mpm支持运行dos机制

    2.支持event mpm

    3.支持异步读写

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

    5.每请求配置;

    6.增强版的表达式分析

    7.支持毫秒级别的keeplivetimeout

    8.基于fqdn的虚拟主机不再需要namevirtualhost指令;

    9.支持用户自定义变量

新模块:

    1.mod_proxy_fcgi

    2.Mod_ratelimt

    3.Mod_remoteip

    修改了一些配置机制:不再支持使用order,deny,allow对ip进行访问控制

    

httpd依赖于apr、apr-util、apr-icon(apr:apache portable runtime可移植运行库)


本次安装使用http最新版本(http-2.4.33版本),系统环境centon6.5,

※http2.4依赖apr、apr-util1.4版本以上,而centos6.5的提供的rpm版本为1.39,需要单独编译安装这两个包

安装过程:

1、先安装开发环境:

1
yum  install   -y pcre-devel zlib-devel openssl openssl-devel

后续编译时指定了--enable-ssl,所以需要安装openssl openssl-devel,如果缺少这两个包编译httpd的时候会提示:

configure: WARNING: OpenSSL version is too old no

checking whether to enable mod_ssl… configure: error: mod_ssl has been requested but can not be built due to prerequisite failures

2、下载安装apr-1.5.2

apr和apr-util为Apache的软件,可以到官网上进行下载,但是截至目前(2018-3-30)apr-util版本为apr-util-1.6.1版本,编译安装后在make编译安装httpd时提示如下错误:

/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_ParserCreate'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_GetErrorCode'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetUserData'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_ErrorString'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetEntityDeclHandler'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_ParserFree'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetElementHandler'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_StopParser'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_Parse'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetCharacterDataHandler'
collect2: error: ld returned 1 exit status
make[2]: *** [htpasswd] Error 1
make[2]: Leaving directory `/usr/local/httpd-2.4.33/support'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/local/httpd-2.4.33/support'
make: *** [all-recursive] Error 1

查询原因为apr-util版本太高了导致的,这点真是恶心,建议安装apr-util版本(大于1.4版本且小于1.6版本)

1
2
3
4
5
6
tar   -zxvf apr-1.5.2. tar .gz
cd apr-1.5.2
./configure --prefix=/usr/local/apr
make 
make install

3、下载安装apr-until-1.5.2

1
2
3
4
5
6
tar   -zxvf apr-util-1.5.2. tar .gz 
cd apr-util-1.5.2
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make
make install

编译安装apr、apr-util时如果提示如下错误:

xml/apr_xml.c:35:19: fatal error: expat.h: No such file or directory
缺少expat-devel安装包:  yum -y install expat-devel


4、下载http-2.4.33

※Apache的性能主要依靠的是服务器的内存和CPU,对于使用GCC编译参数对其优化提升性能并不明显。

Apache官方站点:http://www.apache.org/dist/httpd/


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~] # groupadd -r apache 
[root@localhost ~]useradd -r -g apache apache
tar -zxvf httpd-2.4.33.tar.gz
cd httpd-2.4.33
. /configure   --prefix= /usr/local/httpd2.4  \
--sysconfdir= /etc/httpd/conf  \
-- 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    #可以不指定,默认event

make
make install
※如果是使用普通用户安装、建议先使用root创建必要的目录并改变属主属组权限。使用root用户容易忽略此问题           
httpd常用编译参数属性解释
--prefix指定httpd2.4的安装路径
--sysconfdir指定配置文件路径
--enable-so启动sharedobject共享对象
--enable-ssl启用ssl,借助于此可以实现HTTPS访问
--enable-cgi启用CGI,可以实现CGI脚本执行
--enable-rewrite启用Rewrite重写,能够实现诸如301重定向的功能,以来PCRE包
--with-zlib启用zlib压缩
--with-pcre启用PCRE
--with-apr指定apr的路径,httpd2.4依赖apr1.4版本以上,所以要指明
--with-apr-util指定apr-util的路径,同上
--enable-modules启用哪些模块加载,most尽可能多的
--enable-mpms-shared=allhttp2.4上prefork、worker、event是模块化的,可以动态加载
--with-mpm=prefork指明默认的httpd2.4 MPM,即运行在prefork模型下

※http2.4默认的多道处理模块为event。httpd2.4:event,http2.0:prefork、httpd2.2:worker

修改系统用户:

1
2
3
4
5
[root@localhost apache]# vim /etc/httpd/conf/httpd.conf
#User daemon
#Group daemon
User apache
Group apache

 编译安装网页存放目录:/usr/local/apache/htdocs

rpm安装的默认路径为/var/www/html,可以在配置文件中进行修改

2:修改“main”server的DocumentRoot

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

1
2
3
4
5
6
7
8
9
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
# DocumentRoot "/usr/local/httpd2.4/htdocs"
<Directory "/usr/local/httpd2.4/htdocs">

DocumentRoot "/var/www/html" #修改两个主页目录
<Directory "/var/www/html">  #同上,并且一致

 启动服务:添加环境变量,找到apachectl 命令路径:

1
2
3
4
vim /etc/profile.d/httpd.sh
export PATH=/usr/local/httpd2.4/bin:$PATH

apachectl start

在apache中绑定非http标准端口时,一直出现如下的错误提示:

[root@localhost ~]# /etc/init.d/httpd start
Starting httpd: (13)Permission denied: make_sock: could not bind to address 0.0.0.0:8888
no listening sockets available, shutting down
Unable to open logs
[FAILED]

解决方案:1、增加SElinux中http的端口 2、关闭SELinux

semanage port -l|grep http #查看SELinux下http相关端口

semanage port -a -t http_port_t -p tcp 8888 #增加这个非标准端口即可

或者用hash -r命令清除搜索记录:httpd -M 查看全部模块

查看系统进程:http已经启动完毕。



清除调试符号:

在GCC的默认情况下,大多数程序和库都是带调试符号(默认使用GCC的-g选项)编译的,这些调试符号通常只有在调试程序时使用,它不但能给出内存地址,还能给出变量和函数名称,但是这对作用于生产系统服务器来说是不必要的,没有人在服务器调试Apache,而且因为调试符号的存在,Apache在运行时会占用更多内存,虽然数量不是很大,但是如果大量的Apache进程运行,内存累加起来,也是一个不小的数目,因此可以将这些调试符号清除掉。


大小2M多,使用strip命令清除调试符号


未清除调试符号前大小2M多,清除后为592K,体积减少了约75%。

1、切换使用mpm(多道处理模块):

个人觉得这是http2.4版本最得人心的地方,以前版本都需要编译安装多个模块,而httpd2.4版本只要通过修改配置文件方式既可以切换mpm.

编译安装httpd2.4时不指定模块编译的话,默认为evevt,可以通过httpd -V 查看配置的模块


vim /etc/httpd/conf/httpd.conf(编辑配置文件可以修改mpm)

1
2
3
#LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.s
#LoadModule mpm_worker_module modules/mod_mpm_worker.so



=========================================================

下边内容后续整理


3:基于ip的访问控制法则

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

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

        控制特定ip访问:

        require ip IPADDR:授权指定来源的主机访问

        Require not ip IPADDR:拒绝指定来源地址的主机访问

        ipADDR:

        ip:192.168.1.1

        network/mask 192.168.1.0/24

        Network/Lenth

        HostName:

        FqDN

        DOMAIN:


4:虚拟主机配置:

基于IP,port和FQDN

基于FQDN不再需要NameVirtualHost指令

(1)需要注释掉中心主机:

1
2
3
4
5
6
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
#DocumentRoot "/usr/local/apache/htdocs" 
#<Directory "/usr/local/apache/htdocs">

(2)找到配置文件里的以下参数:

1
2
# Virtual hosts
Include /etc/httpd/extra/httpd-vhosts.conf  这项开启

(3)进入到extra目录下:找到httpd-vhosts.conf

1
2
3
4
5
[root@localhost ~]# cd /etc/httpd/extra/
[root@localhost extra]# ls
httpd-autoindex.conf  httpd-default.conf  httpd-languages.conf  httpd-mpm.conf                 httpd-ssl.conf      httpd-vhosts.conf
httpd-dav.conf        httpd-info.conf     httpd-manual.conf     httpd-multilang-errordoc.conf  httpd-userdir.conf  proxy-html.conf
[root@localhost extra]#

 

打开httpd-vhosts.conf配置文件:

修改参数,以下实例参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
<VirtualHost *:80>
    ServerAdmin webadmin@a.com
    DocumentRoot "/vhost/www.a.com/htdoc/"
    ServerName www.a.com
    ServerAlias a.com
    ErrorLog "logs/www.a.com-error_log"
    CustomLog "logs/www.a.com-access_log" combined
    <Directory "/vhost/www.a.com/htdoc/">
        Options None
        AllowOverride none
        Require all granted
    </Directory>
</VirtualHost>


修改启动脚本参数为以下内容:        

1
2
3
4
5
6
7
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/usr/local/apache/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}


参考:http://blog.51cto.com/houzhimeng/1703921进行整理



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值