LAMP 架构——Apache(httpd)-2.4.29 源码安装

pache 是一个基金会的名字,httpd 才是我们要安装的软件包,早期它的名字就叫 apache,Apache 官网www.apache.org

由于 httpd2.2 和 httpd2.4 所所使用的 Apr 库不同,而且 centos7 系统自带的 Apr 与之不匹配,所以需要使用 yum 安装 Apr 库文件。

[root@dl-001 src]#  wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.4.29.tar.gz	//2.4源码包

[root@dl-001 src]#  wget  http://mirrors.cnnic.cn/apache/apr/apr-1.6.3.tar.gz		//apr-1.6.3r包

[root@dl-001 src]#  wget  http://mirrors.cnnic.cn/apache/apr/apr-util-1.6.1.tar.gz	//apr-util-1.6.1包

说明: 下载并解压,以下操作需要进入。


1, 安装 apr 包

[root@dl-001 src]# cd apr-1.6.3
配置:
[root@dl-001 apr-1.6.3]# ./configure --prefix=/usr/local/apr

报错:
configure: error: in `/usr/local/src/apr-1.6.3':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
//说明:缺少C语言相关的编译器。  

解决办法:
[root@dl-001 apr-1.6.3]# yum install -y gcc*	//安装gcc编译器。  

[root@dl-001 apr-1.6.3]# ./configure --prefix=/usr/local/apr
// 配置成功!

编译和安装:
[root@dl-001 apr-1.6.3]# make 

报错:  
xml/apr_xml.c:35:19: 致命错误:expat.h:没有那个文件或目录
 #include <expat.h>
                   ^
编译中断。
make[1]: *** [xml/apr_xml.lo] 错误 1
make[1]: 离开目录“/usr/local/src/apr-util-1.6.0”
make: *** [all-recursive] 错误 1

解决办法:
[root@dl-001 apr-1.6.3]# yum -y install expat-devel

[root@dl-001 apr-1.6.3]# make && make install
[root@dl-001 apr-1.6.3]# echo $?
0

注意: APR 1.6.2 版本有变更,进行了加密设置,进行编译时需要使用如下命令 (否则在安装 Apache 是无法调用该库文件):

[root@dl-001 httpd-2.4.29]# CC="gcc -m64" ./configure --prefix=/usr/local/apr

2, 安装 Apr-util 包

[root@dl-001 src]# cd apr-util-1.6.1
[root@dl-001 apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@dl-001 apr-util-1.6.1]# echo $?
0

编译和安装:
[root@dl-001 apr-util-1.6.1]# make && make install

3, 安装 httpd

[root@dl-001 src]# cd httpd-2.4.29 
[root@dl-001 httpd-2.4.29]# ./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-so --enable-mods-shared=most

报错:
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/  
说明:需要安装库文件pcre

解决办法:

[root@dl-001 httpd-2.4.29]# yum list |grep pcre 	//查看相关的包

请根据搜索的结果安装下面的包:
[root@dl-001 httpd-2.4.29]# yum install -y pcre-devel

[root@dl-001 httpd--2.4.29]# ./configure --prefix=/usr/local/apache2.4 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-so --enable-mods-shared=most
[root@dl-001 httpd-2.4.29]# echo $?
0

//编译和安装

[root@dl-001 httpd-2.4.29]# make


[root@dl-001 httpd-2.4.29]# make install
[root@dl-001 httpd-2.4.29]# echo $?
0

排查错误

在源码编译安装 httpd 时,./configure 执行无错误,到 make 时就报错

错误如下:

...
/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_ErrorString'
/usr/local/apr-util/lib/libaprutil-1.so: undefined reference to `XML_SetElementHandler'
collect2: error: ld returned 1 exit status
make[2]: *** [htpasswd] 错误 1
make[2]: 离开目录“/usr/local/src/httpd-2.4.28/support”
make[1]: *** [all-recursive] 错误 1
make[1]: 离开目录“/usr/local/src/httpd-2.4.28/support”
make: *** [all-recursive] 错误 1

说明:缺少了 xml 相关的库,需要安装 libxml2-devel 包。直接安装并不能解决问题,因为 httpd 调用的 apr-util 已经安装好了,但是 apr-util 并没有 libxml2-devel 包支持

1. 安装 libxml2-devel 包
[root@dl-001 ~]# yum install -y libxml2-devel

2. 删除 apr-util 安装目录,并重新编译安装

[root@dl-001 ~]# rm -rf /usr/local/apr-util
[root@dl-001 ~]# cd /usr/local/src/apr-util-1.6.1

# 这一步很重要,必须清除之前配置时的缓存
[root@dl-001 apr-util-1.6.1]# make clean

# 源码安装三步走
[root@dl-001 apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@dl-001 apr-util-1.6.1]# make
[root@dl-001 apr-util-1.6.1]# make install

3. 重新编译安装 httpd

# 同样要清理之前的缓存十分重要
[root@dl-001 src]# cd /usr/local/src/httpd-2.4.28
[root@dl-001 httpd-2.4.29]# make clean
[root@dl-001 httpd-2.4.29]# ./configure --prefix=/usr/local/apache2.4  --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-so --enable-mods-shared=most
[root@dl-001 httpd-2.4.29]# make
# 这时make没报错了

[root@dl-001 httpd-2.4.29]# make install

4. 启动服务

[root@dl-001 httpd-2.4.29]# cd /usr/local/apache2.4		//切换至Apache2.4目录
[root@dl-001 apache2.4]# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs  man  manual  modules
注:较常用目录bin(可执行文件存放目录)、conf(配置文件所在目录)、htdocs(存放一个访问页)、logs(日志文件存放目录)、modules(存放扩展模块)。 

查看Apache所加载的模块:
[root@dl-001 apache2.4]# /usr/local/apache2.4/bin/httpd -M 
或者
[root@dl-001 apache2.4]# /usr/local/apache2.4/bin/apachectl -M 

启动:

[root@dl-001 apache2.4]# /usr/local/apache2.4/bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::65d2:adc:20d3:8c74. Set the 'ServerName' directive globally to suppress this message
# 此处错误提示没影响。

检测状态:
[root@dl-001 apache2.4]# ps aux |grep httpd
root      8090  0.0  0.2 144572  2720 ?        Ss   23:36   0:00 /usr/local/apache2.4/bin/httpd -k start
daemon    8091  0.0  0.1 144572  1996 ?        S    23:36   0:00 /usr/local/apache2.4/bin/httpd -k start
daemon    8092  0.0  0.1 144572  1996 ?        S    23:36   0:00 /usr/local/apache2.4/bin/httpd -k start
daemon    8093  0.0  0.1 144572  1996 ?        S    23:36   0:00 /usr/local/apache2.4/bin/httpd -k start
daemon    8094  0.0  0.1 144572  1996 ?        S    23:36   0:00 /usr/local/apache2.4/bin/httpd -k start
daemon    8095  0.0  0.1 144572  1996 ?        S    23:36   0:00 /usr/local/apache2.4/bin/httpd -k start
root      8116  0.0  0.0 112680   972 pts/4    S+   23:38   0:00 grep --color=auto httpd
[root@dl-001 apache2.4]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1181/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1790/master         
tcp6       0      0 :::80                   :::*                    LISTEN      8090/httpd          
tcp6       0      0 :::22                   :::*                    LISTEN      1181/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1790/master