一、前言
为了更好地理解学习Linux系统程序包的编译安装,因此自己尝试编译安装了apache,本文记录了编译安装的过程和相应出现的报错及解决办法,以供之后再次翻阅。
二、环境准备
系统版本:CentOS Linux release 7.2.1511 (Core)
内核版本:3.10.0-327.el7.x86_64
在进行编译安装前,我也在网上翻阅了不少资料,基本上都在进行编译安装前均需要安装相关的依赖软件包,如:
yum install -y gcc gcc++ zlib zlib-devel expat-devel pcre-devel
上述部分是一些常见的依赖包,expat-devel和pcre-devel是我在安装过程中报错后补充的。
随后使用wget命令下载相应的源码包到指定的目录:
httpd:http://mirrors.shu.edu.cn/apache//httpd/httpd-2.4.29.tar.gz
apr:http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.6.3.tar.gz
apr-util:http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
在做完相应的准备工作后,我们就可以开始编译安装的过程了。
三、编译安装
在编译安装httpd的源码包之前,我们得下编译安装apr和apr-until这两个对应源码包。
1、安装apr
[root@localhost tmp]# tar xf apr-1.6.3.tar.gz
[root@localhost tmp]# cd apr-1.6.3
[root@localhost apr-1.6.3]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.6.3]# make && make install
上述为正常完成编译安装的输出结果,如果编译安装过程中出现报错,可按照该编译报错的提示查找相应的解决办法,此前我安装就出现了xml/apr_xml.c:35:19: 致命错误:expat.h:没有那个文件或目录 #include <expat.h>
的报错,需要安装expat-devel才能解决。(已补充到环境准备中。)
2、安装apr-util
[root@localhost tmp]# tar xf apr-util-1.6.1.tar.gz
[root@localhost tmp]# cd apr-util-1.6.1
[root@localhost apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@localhost apr-util-1.6.1]# make && make install
3、安装httpd
[root@localhost tmp]# tar xf httpd-2.4.29.tar.gz
[root@localhost tmp]# cd httpd-2.4.29
[root@localhost httpd-2.4.29]# ./configure --prefix=/usr/local/apache --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
[root@localhost httpd-2.4.29]# make && make install
在此处我,我之前安装的时候,出现了下述的报错:configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
,需要安装pcre-devel才能解决这个问题。(已补充到环境准备中。)
(另外./configure --help,可以查看对应的源码包支持的选项,这些选项对于编译来说挺重要的,这里暂且不作太多介绍,后续研究透了再另起一篇文章作总结。)
四、编译安装完成后的工作
1、启动Apache
[root@localhost ~]# cd /usr/local/apache/bin/
[root@localhost bin]# ./apachectl start
此处可能会出现报错:AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message
需要编辑/usr/local/apache/conf/httpd.conf文件中找到#ServerName www.example.com:80
并在其下方添加:ServerName localhost:80
。
2、修改iptables允许访问80端口
通过情况下,Linux系统的iptables 会拒绝任何访问到80端口的流量,此时可以通过使用iptables添加对应的访问规则来允许对应的流量。
[root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 确定 ]
如果系统无法找到service iptables save命令,需先yum安装iptables-service。
另外也可以停用iptables:
[root@localhost ~]# systemctl stop firewalld #临时停用firewalld
[root@localhost ~]# systemctl disable firewalld #关闭开机自动开启firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
3、设置开机自动开启apache
首先将/usr/local/apache/bin/apachectl 复制到/etc/init.d/目录下。
[root@localhost ~]# cp /usr/local/apache/bin/apachectl /etc/rc.d/init.d/
随后编辑/etc/rc.d/init.d/apachectl,在首行#!/bin/sh下添加下面两句命令:
#chkconfig: 234 20 80
#description: apache
随后用chkconfig命令将apachectl添加到系统服务并设置开机启动:
[root@localhost ~]# chkconfig --add apachectl
root@localhost ~]# chkconfig apachectl on
此时使用systemctl命令就能正常管理到apachectl服务了:
[root@localhost ~]# systemctl status apachectl
● apachectl.service - SYSV: apache
Loaded: loaded (/etc/rc.d/init.d/apachectl)
Active: active (exited) since 五 2018-01-05 05:14:59 CST; 5s ago
Docs: man:systemd-sysv-generator(8)
Process: 66466 ExecStart=/etc/rc.d/init.d/apachectl start (code=exited, status=0/SUCCESS)
1月 05 05:14:59 localhost.localdomain systemd[1]: Starting SYSV: apache...
1月 05 05:14:59 localhost.localdomain apachectl[66466]: httpd (pid 64222) already running
1月 05 05:14:59 localhost.localdomain systemd[1]: Started SYSV: apache.
[root@localhost ~]#
此处的/etc/init.d/apachectl,在复制时可以重命名为httpd,这样调用起来会更方便些。(我这里纯粹因为懒了=_=)