当前位置:   article > 正文

手动编译安装httpd_a resource shortage or other unrecoverable failure

a resource shortage or other unrecoverable failure was encountered before an

手动编译安装httpd

目前最新的 httpd 包是 2.4.51,官网没有提供Linux下的安装包,因此只有手动编译安装了。但因常年混迹于Java圈,所以对C语言下的编译安装很陌生,以此记录编译安装的全过程,作为笔记备忘。

1. 准备工作

根据 httpd 的官网(https://httpd.apache.org/docs/2.4/install.html)描述,编译源码需要以下条件:

通过源码编译安装httpd的必备条件

  • 按照上图提供的链接地址,依次将 httpdAPRAPR-Util 的源码下载下来,然后将 APRAPR-Util 的源码放至 httpd 源码的 srclib 下,如下图:
    apr和apr-util在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/

    执行configure时报错
    最后一行已经提示,需要 PCRE 资源库,根据上述错误信息中提供的 PCRE 的官网URL,里面有两个版本 PCREPCRE2

    注意:我们这里只能下载 PCRE 的版本,因为 pcre-config 存在于 PCRE 中。如果安装 PCRE2,则对应的文件叫 pcre2-config。执行./configure同样会报上面的错误。

    PCRE 的安装过程也很简单,官网下载源码,然后解压,进入其源码所在目录,依次执行:

    ./configure
    make
    make install
    
    • 1
    • 2
    • 3

    注:后面涉及到的资源库的安装方式也是同样的步骤和命令。

  • 确保系统中存在C语言的编译器,比如 GCC,命令行中输入 gcc -v,可得知是否安装。未安装,则先安装 GCC。可通过 yum 命令安装:

    yum install gcc
    
    • 1
  • 硬盘空间至少有50M剩余。

  • Accurate time keepingPerl 5 [OPTIONAL] 用不到,则可以忽略。

2. 编译和安装 httpd

进入 httpd-2.4.51 根目录,执行命令:

./configure
  • 1

如果没有错误,则执行 make 命令:

make
  • 1

可能会报如下错误:

fatal error: expat.h: No such file or directory

找不到expat.h文件

通过在网上搜索该文件名,发现 libexpat 中有该源码。为了确认是否是缺少该资源库,我们打开源码文件:

/httpd-2.4.51/srclib/apr-util/xml/apr_xml.c

apr_xml.c 源码

注意看文件开头的 if/elif 部分,通过这段代码可以确定,这里引用的 expat.h 是用来解析xml文件的,和 libexpat 资源库的作用一致。

因此这里缺少 expat 资源库,参考安装 PCRE 资源库的方式,下载源码,编译,安装。

然后回到 httpd 根目录,执行 make install 命令:

make install
  • 1

可能会出现如下错误:

error: ld returned 1exit status

输出提示多个未定义参数

通过网上一番搜索,问题就在于打印的那些

undefined reference to 'XML_GetErrorCode'

搜索一下 apr-util 的源码里面是否有上面打印的字段,搜索结果如下图:

搜索XML_GetErrorCode源码

从上图可知 xml/apr_xml.c 调用了未定义的方法。按照我的理解,这些未定义的方法是在 expat 中定义的,由于 expat 刚装上,而此时 httpd 已经 make 过了,因此需要重新编译 httpd
进入 httpd 根目录,先执行

make
  • 1

然后再执行

 make install
  • 1

命令执行完,如果无错误则表示安装成功。

如果重新 make 依然报错,则可通过以下命令查询一下,libexpat资源库是否已被加载:

ldconfig -v | grep libexpat
  • 1

以上命令被执行之后,会刷新共享资源库的缓存,然后进入 httpd 源码的根目录,再重新执行 makemake install 命令。

为了验证我的猜测,特意去 expat 目录下搜了未定义的那几个关键字,比如 XML_ErrorString,发现该关键字出现在 expat-2.4.1/lib/libexpat.def 文件中,如下所示:

libexpat.def源码片段

而搜索文件名 libexpat.def,发现它出现在 Makefile 文件中,如下图所示:

Makefile源码片段
因此我们现在可以确定这几个参数和编译是有关系的。

3. 验证安装是否成功

执行./configure命令时,未加参数,httpd 默认会被安装到 /usr/local/apache2 下。接下来启动 httpd,启动之前,先确保系统是否已安装过旧版本,

ps -ef | grep httpd
  • 1

如果已安装,则先停掉旧版本的进程,然后执行以下命令启动通过源码编译安装的 httpd:

/usr/local/apache2/bin/apachectl -k start
  • 1

查看日志 ***/usr/local/apache2/logs/***,如果发现如下错误:

Function not implemented: AH00141: Could not initialize random number generator

启动httpd失败

网上搜索错误信息,有人提到回退 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!

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

又是网上一番搜索,然后用 ulimit 查看系统的配置,结果发现了如下的亮点:

ulimit -a 查看结果

通过命令 ulimit -u 500 修改之后:

更新max user processes=500

重新启动 httpd,然后查看日志,问题解决。同时,通过浏览器上,输入URL,查看是否访问成功。

4. 总结

  • 编译过程中,老是会遇到各种各样的问题。但通过一番分析和搜索,其实那些错误信息都是由于各种依赖库不存在导致的。
  • 下载源码编译的时候,尽量先阅读官网的相关说明,通常官网都会明确告知需要依赖哪些资源库等信息,这样可以减少错误的发生。
  • 遇到问题时,搜索的关键字很重要,关键字不准确,那么显示的结果也就鱼龙混杂,此时需要带着疑问去尝试,可以排除很多不正确的方案。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/936485
推荐阅读
相关标签
  

闽ICP备14008679号