赞
踩
目前最新的 httpd 包是 2.4.51,官网没有提供Linux下的安装包,因此只有手动编译安装了。但因常年混迹于Java圈,所以对C语言下的编译安装很陌生,以此记录编译安装的全过程,作为笔记备忘。
根据 httpd 的官网(https://httpd.apache.org/docs/2.4/install.html)描述,编译源码需要以下条件:
按照上图提供的链接地址,依次将 httpd,APR 和 APR-Util 的源码下载下来,然后将 APR 和 APR-Util 的源码放至 httpd 源码的 srclib 下,如下图:
注意:APR 和 APR-Util 是不包含版本号的
安装 PCRE 资源库(PCRE 是一个与 Perl 5 语法相同的正则表达式库),首先搜索系统是否已安装该资源库,可通过 whereis pcre-config
命令来查找。如果未安装,则执行 ./configure
命令时会报错:
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
最后一行已经提示,需要 PCRE 资源库,根据上述错误信息中提供的 PCRE 的官网URL,里面有两个版本 PCRE 和 PCRE2 。
注意:我们这里只能下载 PCRE 的版本,因为 pcre-config 存在于 PCRE 中。如果安装 PCRE2,则对应的文件叫 pcre2-config。执行./configure同样会报上面的错误。
PCRE 的安装过程也很简单,官网下载源码,然后解压,进入其源码所在目录,依次执行:
./configure
make
make install
注:后面涉及到的资源库的安装方式也是同样的步骤和命令。
确保系统中存在C语言的编译器,比如 GCC,命令行中输入 gcc -v
,可得知是否安装。未安装,则先安装 GCC。可通过 yum 命令安装:
yum install gcc
硬盘空间至少有50M剩余。
Accurate time keeping 和 Perl 5 [OPTIONAL] 用不到,则可以忽略。
进入 httpd-2.4.51 根目录,执行命令:
./configure
如果没有错误,则执行 make 命令:
make
可能会报如下错误:
fatal error: expat.h: No such file or directory
通过在网上搜索该文件名,发现 libexpat 中有该源码。为了确认是否是缺少该资源库,我们打开源码文件:
/httpd-2.4.51/srclib/apr-util/xml/apr_xml.c
注意看文件开头的 if/elif 部分,通过这段代码可以确定,这里引用的 expat.h 是用来解析xml文件的,和 libexpat 资源库的作用一致。
因此这里缺少 expat 资源库,参考安装 PCRE 资源库的方式,下载源码,编译,安装。
然后回到 httpd 根目录,执行 make install 命令:
make install
可能会出现如下错误:
error: ld returned 1exit status
通过网上一番搜索,问题就在于打印的那些
undefined reference to 'XML_GetErrorCode'
搜索一下 apr-util 的源码里面是否有上面打印的字段,搜索结果如下图:
从上图可知 xml/apr_xml.c 调用了未定义的方法。按照我的理解,这些未定义的方法是在 expat 中定义的,由于 expat 刚装上,而此时 httpd 已经 make 过了,因此需要重新编译 httpd。
进入 httpd 根目录,先执行
make
然后再执行
make install
命令执行完,如果无错误则表示安装成功。
如果重新 make 依然报错,则可通过以下命令查询一下,libexpat资源库是否已被加载:
ldconfig -v | grep libexpat
以上命令被执行之后,会刷新共享资源库的缓存,然后进入 httpd 源码的根目录,再重新执行 make ,make install 命令。
为了验证我的猜测,特意去 expat 目录下搜了未定义的那几个关键字,比如 XML_ErrorString,发现该关键字出现在 expat-2.4.1/lib/libexpat.def 文件中,如下所示:
而搜索文件名 libexpat.def,发现它出现在 Makefile 文件中,如下图所示:
因此我们现在可以确定这几个参数和编译是有关系的。
执行./configure
命令时,未加参数,httpd 默认会被安装到 /usr/local/apache2 下。接下来启动 httpd,启动之前,先确保系统是否已安装过旧版本,
ps -ef | grep httpd
如果已安装,则先停掉旧版本的进程,然后执行以下命令启动通过源码编译安装的 httpd:
/usr/local/apache2/bin/apachectl -k start
查看日志 ***/usr/local/apache2/logs/***,如果发现如下错误:
Function not implemented: AH00141: Could not initialize random number generator
网上搜索错误信息,有人提到回退 apr 版本(前面安装的是 apr-1.7.0 )可以解决,于是尝试回退到 apr-1.6.5 版本。重新编译安装 httpd 源码,上面的错误没有了,但是又报了如下的错误信息:
[Thu Dec 09 14:45:36.767347 2021] [mpm_event:notice] [pid 2109:tid 140613506238272] AH00489: Apache/2.4.51 (Unix) configured -- resuming normal operations
[Thu Dec 09 14:45:36.767448 2021] [core:notice] [pid 2109:tid 140613506238272] AH00094: Command line: '/usr/local/apache2/bin/httpd'
[Thu Dec 09 14:45:36.767445 2021] [mpm_event:alert] [pid 2111:tid 140613506238272] (11)Resource temporarily unavailable: AH00480: apr_thread_create: unable to create worker thread
[Thu Dec 09 14:45:36.767607 2021] [mpm_event:alert] [pid 2113:tid 140613506238272] (11)Resource temporarily unavailable: AH00480: apr_thread_create: unable to create worker thread
[Thu Dec 09 14:45:36.768449 2021] [mpm_event:alert] [pid 2116:tid 140613506238272] (11)Resource temporarily unavailable: AH00480: apr_thread_create: unable to create worker thread
[Thu Dec 09 14:45:38.769650 2021] [mpm_event:alert] [pid 2109:tid 140613506238272] AH02324: A resource shortage or other unrecoverable failure was encountered before any child process initialized successfully... httpd is exiting!
又是网上一番搜索,然后用 ulimit 查看系统的配置,结果发现了如下的亮点:
通过命令 ulimit -u 500
修改之后:
重新启动 httpd,然后查看日志,问题解决。同时,通过浏览器上,输入URL,查看是否访问成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。