Apache源码包在LINUX(CENTOS6.8)中的安装(出现问题及解决)
任务:在cent6.8系统中安装apache(版本为:httpd-2.4.41)
前提:由于源码包必须先编译后安装,所以必须先安装编译器:gcc
理论步骤:
1.检测gcc软件包,如果不存在则进行安装。
2.下载aache的源码包(压缩包形式)并上传到centos服务器中
3.解压源码包后进入解压后的目录,执行配置,编译,安装。
3.1 配置:使用 ./configure 进行安装目录的设置
3.2 编译:使用 make 命令直接执行
3.3 安装:使用 make install 命令直接执行。
4.如果无意外,按照“理论步骤',完成后即可在centos服务器启用httpd服务(运行apache)中,使用浏览器访问:
http://localhost/ 或 http://127.0.0.1 或 http://192.168.253.129
实际过程:
检测gcc服务包:
[root@cent001 ~]# rpm -q gcc
gcc-4.4.7-23.el6.x86_64
说明gcc服务包已经安装。进入”理论步骤“2
下载aache的源码包(压缩包形式)并上传到centos服务器中:
访问:
找到: 然后下载到本地。
然后通过ftp上传到centos的个人源码包专用目录/usr/local/src 下边。进入”理论步骤“3
解压源码包
进入源码包压缩包的存储目录:
[root@cent001 ~]# cd /usr/local/src
解压httpd-2.4.41.tar.gz源码压缩包(会生成httpd-2.4.41目录):
[root@cent001 src]# tar -zxvf httpd-2.4.41.tar.gz
查看解压后的源码包大小:(此操作不是必须)
[root@cent001 src]# du -sh httpd-2.4.41
46m httpd-2.4.41
进入源码包解压后目录:
[root@cent001 src]# cd httpd-2.4.41
开始进行”理论步骤“3.1
配置:使用 ./configure 进行安装目录的设置
执行命令进行配置:(注意:官方手册推荐使用 /usr/local/apache2 作为httpd的源码安装路径)
[root@cent001 httpd-2.4.41]# ./configure --prefix=/usr/local/apache2
checking for chosen layout... apache
checking for working mkdir -p... yes
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -e
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
configure:
configure: configuring apache portable runtime library...
configure:
checking for apr... no
configure: error: apr not found. please read the documentation.
出现问题,大概意思是说apr软件包不存在,导致配置不成功,它还说让我们去读安装说明文档(目录中的install、readme文档)
首先确认一下,是否apr软件包真不存在:
[root@cent001 httpd-2.4.41]# rpm -q apr
apr-1.3.9-5.el6_9.1.x86_64
很明显,apr软件包已经存在了,这跟配置出错提示的”apr not found“根本两相矛盾了。
所以,这时你就猜测地想到:依赖的apr版本冲突了,是完成操作,必须依赖于其它版本的apr。那重新指定依赖的版本行了吧,不使用默认的,于是:
[root@cent001 httpd-2.4.41]# ./configure -help | grep apr
--with-included-apr use bundled copies of apr/apr-util
--with-apr=path prefix for installed apr or the full path to
apr-config
--with-apr-util=path prefix for installed apu or the full path to
可以知道,利用--width-apr=path 可以通过配置apr安装目录来指定特定版本的apr,于是 ./configure 操作可以重新执行为如下形式:
[root@cent001 httpd-2.4.41]# ./configure --prefix=/usr/local/apache2 --with-apr=能被正确依赖的apr版本的安装目录
这时要解决的问题是:
哪个(哪些)版本的apr能够被正确依赖(由于兼容性原因,猜测的话,一般最新版本最好,当然不排除最新版本的apr不兼容老旧版本的httpd的情况)
由于不是十分肯定是否最新版本apr(或其它软件包)能被正确依赖,我们在解决办法有两个:
办法-1。按照“please read the documentation”的提示,去读install、readme文档,以便确定肯定我们上边的猜测。
办法-2。尝试安装某些版本的apr(或其它软件包)直到可行,比如尝试:apr-1.4.2等等。
*****先按照办法-1来进行,如果不行的话则进入办法-2。******
先按办法-1去做:
[root@cent001 httpd-2.4.41]# vim install
然后/apr 搜索一下,可以以下相关内容:
* consider if you want to use a previously installed apr and
apr-util (such as those provided with many oses) or if you
need to use the apr and apr-util from the apr.apache.org
project. if the latter, download the latest versions and
unpack them to ./srclib/apr and ./srclib/apr-util (no
version numbers in the directory names) and use
./configure's --with-included-apr option. this is required
if you don't have the compiler which the system apr was
built with. it can also be advantageous if you are a
developer who will be linking your code with apache or using
a debugger to step through server code, as it removes the
possibility of version or compile-option mismatches with apr
and apr-util code. as a convenience, prepackaged source-code
bundles of apr and apr-util are occasionally also provided
as a httpd-2.x.x-deps.tar.gz download.
这段内容的大概意思是:
。。。。。。(不说了,看下边)==>
官方在线的安装说明文档()中还有一个比较简要的说明:
apr and apr-util
make sure you have apr and apr-util already installed on your system. if you don't, or prefer to not use the system-provided versions, download the latest versions of both apr and apr-util from apache apr, unpack them into /httpd_source_tree_root/srclib/apr
and /httpd_source_tree_root/srclib/apr-util
(be sure the directory names do not have version numbers; for example, the apr distribution must be under /httpd_source_tree_root/srclib/apr/) and use ./configure
's --with-included-apr
option. on some platforms, you may have to install the corresponding -dev
packages to allow httpd to build against your installed copy of apr and apr-util.
apr 和 apr-util
确保你系统中已经安装了apr和apr-util。如果没有安装过,或者安装了却不想用它,那就下载最新版本的apr和apr-util的源码压缩包并解压后放到:httpd源码目录/srclib/apr与 和 httpd源码目录/srclib/apr-util (命名中不要带版本号)。例如:
apr源码必须放在:httpd源码目录/srclib/apr 中,并且执行./configure时使用: --with-included-apr
上边的内容就我们当前的情况来举例,其操作原由和过程就是:
不想用内置的rpm版本的apr(因为默认使用时发生版本冲突),那就从网址:http://apr.apache.org/ 中下载最新的apr与apr-util(其推荐版本为: 与 )
然后解压为:
apr-1.7.0 目录,重命名为 apr(即去掉版本号信息)
apr-util-1.6.1 目录,重命名为 apr-util(即去掉版本号信息)
将apr目录与apr-util目录复制(或剪贴)到 httpd源码目录(即:/usr/local/src/httpd-2.4.41/)
此时httpd源码目录为:
/usr/local/src/httpd-2.4.41/
/usr/local/src/httpd-2.4.41/apr
/usr/local/src/httpd-2.4.41/apr-util
。。。
最后,使用:./configure 时,用 --with-included-apr,这是因为:
[root@cent001 httpd-2.4.41]# ./configure -help | grep with-included-apr
--with-included-apr use bundled copies of apr/apr-util
可知:配置时使用--with-included-apr,会使用httpd源码目录/srclib/下的apr与apr-util
注意:不要被--with-included-apr 名称迷惑,它同时作用于apr与apr-util。也就是说,没有:--with-included-apr-util参数项。
以上便是官方中提到的说明,它提到的最重要的3条是:
1。最新版本(或当前推荐版本)的apr及apr-util是可用于当前各版本的httpd的,不会出现版本冲突。(我们之前遇到的问题“哪个(哪些)版本的apr能够被正确依赖” ,这1条就是答案---使用最新版本或推荐版本)
2。可以使用系统内置的apr和apr-util(我们之前使用的就是这种方式,然后遇到了问题,一步步解决后,剩下的版本问题,并最终到达了上边第1条)
3。一种用于配置依赖的源码放置方式及命令参数--with-included-apr进行./configure操作。
因为我想以源码包的形式手动安装apr与apr-util,所以暂时不按上边的第3条操作,而是根据第1条,回到我们先前的问题处,即:
[root@cent001 httpd-2.4.41]# ./configure --prefix=/usr/local/apache2 --with-apr=最新版本或推荐版本的apr安装目录
由于指定的是“安装目录”,所以必须已进行了相应安装,才存在”安装目录“,我们还没有对最新版本或推荐版本的apr进行安装,于是,先进行安装推荐版本的apr:(假设已经下载并解压)
[root@cent001 apr-1.7.0]# ls
apr-1-config apr.spec config.layout emacs-mode libapr.rc misc readme time
apr-config.in atomic config.log encoding libtool mmap readme.cmake tools
apr.dep build config.nice file_io license network_io shmem user
apr.dsp buildconf config.status helpers locks notice strings
apr.dsw build.conf configure include makefile nwgnumakefile support
apr.mak build-outputs.mk configure.in libapr.dep makefile.in passwd tables
apr.pc changes docs libapr.dsp makefile.win poll test
apr.pc.in cmakelists.txt dso libapr.mak memory random threadproc
[root@cent001 apr-1.7.0]# vim readme
....
configuring and building apr on unix
====================================
simply;
./configure --prefix=/desired/path/of/apr
make
make test
make install
....
[root@cent001 apr-1.7.0]# ./configure --prefix=/usr/local/apr
[root@cent001 apr-1.7.0]# make
[root@cent001 apr-1.7.0]# make install
至此,最新版本(推荐版本)的apr源码安装成功。有了安装目录:/usr/local/apr,于是,开始执行以下操作:
[root@cent001 apr-1.7.0] cd /usr/local/src/httpd-2.4.41
[root@cent001 httpd-2.4.41]# ./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr
checking for chosen layout... apache
checking for working mkdir -p... yes
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -e
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
configure:
configure: configuring apache portable runtime library...
configure:
checking for apr... yes
setting cc to "gcc"
setting cpp to "gcc -e"
setting cflags to " -g -o2 -pthread"
setting cppflags to " -dlinux -d_reentrant -d_gnu_source"
setting ldflags to " "
configure:
configure: configuring apache portable runtime utility library...
configure:
checking for apr-util... no
configure: error: apr-util not found. please read the documentation.
出现的问题是apr-util找不到,根据之前的官方文档,发现与apr问题相似,于是,先安装推荐版本的apr-util(假设已经进行了下载和解压)
[root@cent001 apr-util-1.6.1]# ls
aprutil.dep build configure.in include makefile.win redis
aprutil.dsp buildconf crypto ldap memcache renames_pending
aprutil.dsw build.conf dbd libaprutil.dep misc strmatch
aprutil.mak build-outputs.mk dbm libaprutil.dsp notice test
apr-util.pc.in changes docs libaprutil.mak nwgnumakefile uri
apr-util.spec cmakelists.txt encoding libaprutil.rc readme xlate
apu-config.in config.layout export_vars.sh.in license readme.cmake xml
buckets configure hooks makefile.in readme.freetds
[root@cent001 apr-util-1.6.1]# vim readme
[root@cent001 apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
checking for a bsd-compatible install... /usr/bin/install -c
checking for working mkdir -p... yes
apr-util version: 1.6.1
checking for chosen layout... apr-util
checking for gcc... gcc
checking whether the c compiler works... yes
checking for c compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the gnu c compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept iso c89... none needed
applying apr-util hints file rules for x86_64-pc-linux-gnu
checking for apr... no
configure: error: apr could not be located. please use the --with-apr option.
出现错误,要求用--with-apr 参数指明apr的安装路径,于是:
[root@cent001 apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@cent001 apr-util-1.6.1]# make
此时出现错误信息有:
xml/apr_xml.c:35:19: 错误:expat.h:没有那个文件或目录
xml/apr_xml.c:66: 错误:expected specifier-qualifier-list before ‘xml_parser’
xml/apr_xml.c: 在函数‘cleanup_parser’中:
xml/apr_xml.c:364: 错误:‘apr_xml_parser’没有名为‘xp’的成员
xml/apr_xml.c:365: 错误:‘apr_xml_parser’没有名为‘xp’的成员
xml/apr_xml.c: 在文件层:
xml/apr_xml.c:384: 错误:expected ‘;’, ‘,’ or ‘)’ before ‘*’ token
xml/apr_xml.c: 在函数‘apr_xml_parser_create’中:
xml/apr_xml.c:401: 错误:‘apr_xml_parser’没有名为‘xp’的成员
xml/apr_xml.c:402: 错误:‘apr_xml_parser’没有名为‘xp’的成员
xml/apr_xml.c:410: 错误:‘apr_xml_parser’没有名为‘xp’的成员
xml/apr_xml.c:411: 错误:‘apr_xml_parser’没有名为‘xp’的成员
xml/apr_xml.c:412: 错误:‘apr_xml_parser’没有名为‘xp’的成员
xml/apr_xml.c:424: 错误:‘apr_xml_parser’没有名为‘xp’的成员
xml/apr_xml.c:424: 错误:‘default_handler’未声明(在此函数内第一次使用)
xml/apr_xml.c:424: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
xml/apr_xml.c:424: 错误:所在的函数内也只报告一次。)
xml/apr_xml.c: 在函数‘do_parse’中:
xml/apr_xml.c:434: 错误:‘apr_xml_parser’没有名为‘xp’的成员
xml/apr_xml.c:438: 错误:‘apr_xml_parser’没有名为‘xp’的成员
xml/apr_xml.c:442: 错误:‘apr_xml_parser’没有名为‘xp_err’的成员
xml/apr_xml.c:442: 错误:‘apr_xml_parser’没有名为‘xp’的成员
xml/apr_xml.c: 在函数‘apr_xml_parser_geterror’中:
xml/apr_xml.c:500: 错误:‘apr_xml_parser’没有名为‘xp_err’的成员
xml/apr_xml.c:500: 错误:‘apr_xml_parser’没有名为‘xp_err’的成员
make[1]: *** [xml/apr_xml.lo] 错误 1
make[1]: leaving directory `/usr/local/src/apr-util-1.6.1'
make: *** [all-recursive] 错误 1
百度了一下,根据:https://blog.csdn.net/dn1115680109/article/details/80847924
于是对缺少的expat库进行安装:
[root@cent001 apr-util-1.6.1]# yum install -y expat-devel
执行后就安装了:expat-devel.x86_64 0:2.0.1-11.el6_2,然后清理后再次编译:
[root@cent001 apr-util-1.6.1]# make clean
[root@cent001 apr-util-1.6.1]# make
[root@cent001 apr-util-1.6.1]# make install
至此,最新版本(推荐版本)的apr-util 源码安装成功。有了安装目录:/usr/local/apr-util,于是,开始执行以下操作:
[root@cent001 apr-util-1.6.1] cd /usr/local/src/httpd-2.4.41
[root@cent001 httpd-2.4.41]# ./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
...
checking whether gcc accepts -g... yes
checking for gcc option to accept iso c89... none needed
checking how to run the c preprocessor... gcc -e
checking for gcc option to accept iso c99... -std=gnu99
checking for pcre-config... false
configure: error: pcre-config for libpcre not found. pcre is required and available from http://pcre.org/
出错原因:pcre模块没有配置。于是我们查看一下pcre:
[root@cent001 httpd-2.4.41]# rpm -q pcre
pcre-7.8-7.el6.x86_64
说明默认是有的,可能还是版本冲突原因,依据下载个最新版(如果该网上不去,可以换成https协议访问: ,或者访问:
下载最新版本的pcre(暂时不用:pcre2):pcre-8.43.tar.gz
[root@cent001 pcre-8.43]# ls
查看到有install安装说明文档
[root@cent001 pcre-8.43]# vim install
一些安装说明:
configure、make、make check、make install、make installcheck、
make maintainer-clean、make uninstall、make distcheck、./configure --help
[root@cent001 pcre-8.43]# ./configure --prefix=/usr/local/pcre
[root@cent001 pcre-8.43]# make
[root@cent001 pcre-8.43]# make install
至此,最新版本的pcre 源码安装成功。有了安装目录:/usr/local/pcre,于是,开始执行以下操作:
[root@cent001 apr-util-1.6.1] cd /usr/local/src/httpd-2.4.41
[root@cent001 httpd-2.4.41]# ./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util -with-pcre=/usr/local/pcre
...
configure: summary of build options:
server version: 2.4.41
install prefix: /usr/local/apache2
c compiler: gcc -std=gnu99
cflags: -g -o2 -pthread
cppflags: -dlinux -d_reentrant -d_gnu_source
ldflags:
libs:
c preprocessor: gcc -e
至此,httpd服务安装过程中的配置正确地完成,进入”理论步骤“3.2
编译:使用 make 命令直接执行
[root@cent001 httpd-2.4.41]# make clean
[root@cent001 httpd-2.4.41]# make
...
/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: ld returned 1 exit status
make[2]: *** [htpasswd] 错误 1
make[2]: leaving directory `/usr/local/src/httpd-2.4.41/support'
make[1]: *** [all-recursive] 错误 1
make[1]: leaving directory `/usr/local/src/httpd-2.4.41/support'
make: *** [all-recursive] 错误 1
出错原因:猜测是由于apr-util引起的。
如果是这样的话,那么:之前猜想着“官方都极力推荐了那么应该没问题”是有问题的,apr-util推荐版本可以针对任何版本都可行这种想法就是错误的。
现在是真的是apr-util的问题吗?推荐版本的apr-util究竟是真的可靠吗?
明眼看上去,确实apr-util很有问题!官方办法行不通了,于是采用土法:
按办法-2去做
于是更换一下低版本的apr-util 来试试:
重新下载低版本的apr-util:
网址:http://archive.apache.org/dist/apr/ (此网址包含各版本的apr与apr-util,但速度较慢,建议使用百度搜索:archive.apache.org/dist/apr/ 然后以百度快照 形式进入下载)
下载 (下载速度太慢,有时真的下不动。推荐从其它地方下载)
然后进行解压。移除之前版本(直接重命名),进行当前版本安装:
[root@cent001 httpd-2.4.41]# cd /usr/local/
[root@cent001 local]# mv apr-util apr-util.bak2
[root@cent001 local]# cd /usr/local/src/apr-util-1.3.11
[root@cent001 apr-util-1.3.11]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@cent001 apr-util-1.3.11]# make clean
[root@cent001 apr-util-1.3.11]# make
[root@cent001 apr-util-1.3.11]# make install
至此,apr-util已经替换为低版本,重新执行:
[root@cent001 apr-util-1.6.1] cd /usr/local/src/httpd-2.4.41
[root@cent001 httpd-2.4.41]# ./configure --prefix=/usr/local/apache2 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util -with-pcre=/usr/local/pcre
[root@cent001 httpd-2.4.41]# make clean
[root@cent001 httpd-2.4.41]# make
至此,编译任务成功,进入”理论步骤“3.3
安装:使用 make install 命令直接执行
[root@cent001 httpd-2.4.41]# make install
至此,安装任务成功,进入”理论步骤“4
这里直接说明了:”官方极力推荐的版本并不一定适用“,比如apr适用,而apr-util就不适用。
启用httpd服务(运行apache)中,使用浏览器访问
启动服务,使用:安装目录/bin/apachectl start (要停止服务则使用:安装目录/bin/apachectl stop)
[root@cent001 httpd-2.4.41]# /usr/local/apache2/bin/apachectl start
ah00557: httpd: apr_sockaddr_info_get() failed for cent001
ah00558: httpd: could not reliably determine the server's fully qualified domain name, using 127.0.0.1. set the 'servername' directive globally to suppress this message
这种情况,可以参照 https://www.cnblogs.com/xiaoqian1993/p/6027907.html ,进行2步修改:
1。修改hosts文件:
[root@cent001 httpd-2.4.41]# vim /etc/hosts
添加一行(注意其中的cent001为主机名): 127.0.0.1 localhost.localdomain localhost cent001
2。修改httpd配置文件:
[root@cent001 httpd-2.4.41]# vim /usr/local/apache2/conf/httpd.conf
查找#servername,添加一行:servername localhost:80
再次启动(或停止后再次启动):
[root@cent001 httpd-2.4.41]# /usr/local/apache2/bin/apachectl start
浏览:http://localhost/ 或 http://127.0.0.1 或 http://192.168.253.129
正常的话显示:it works!
httpd (pid 119873) already running
至此,整个httpd-2.4.41安装过程算是暂时可行。另外还有一些其它的问题:系统有时也默认安装了httpd服务(rpm形式):
如果是rmp包的apache可以直接进行如下操作:
查看rpm的apache版本:
[root@cent001 httpd-2.4.41]# rpm -q httpd
httpd-2.2.15-53.el6.centos.x86_64
或者:
[root@cent001 httpd-2.4.41]# httpd -v
server version: apache/2.2.15 (unix)
server built: may 11 2016 19:28:33
查看rpm的apache状态:
[root@cent001 httpd-2.4.41]# service httpd status
httpd 已停
rpm的apache启动方式:
[root@cent001 httpd-2.4.41]# service httpd start
正在启动 httpd: [确定]
[root@cent001 httpd-2.4.41]# service httpd status
httpd (pid 120138) 正在运行...
使用启动命令后没有出错信息的情况下,通过查询状态为“正在运行”就可以表明已经成功启动服务。
如果启动失败,信息如下显示时,则代表已经有服务占用了80端口(可能是源码包的apache已经启动了,要使用rpm的apache的话就可以先停止源码版的)
正在启动 httpd:(98)address already in use: make_sock: could not bind to address [::]:80
(98)address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
unable to open logs
[失败]
另外,如果像源码版的apache服务,启动时显示:
ah00557: httpd: apr_sockaddr_info_get() failed for cent001
ah00558: httpd: could not reliably determine the server's fully qualified domain name, using 127.0.0.1. set the 'servername' directive globally to suppress this message
则可以按照源码版,同时修改hosts文件及配置文件:
其中hosts文件是同一个(即说到hosts文件的时候,就是指:/etc/hosts)
而rpm版的apache的配置文件,是在:/etc/httpd/conf/httpd.conf (可以通过:# rpm -ql httpd | more 看到)
[root@cent001 httpd-2.4.41]# vim /etc/httpd/conf/httpd.conf
按照上边源码版的修改同样修改就可以!
==================================================================
end of 《apache源码包在linux(centos6.8)中的安装(出现问题及解决)》
==================================================================