问题

问题

在进行大量研究和测试以编写一个值得在 stackexchange 上发表的正确问题时,我发现了一个解决方案:libapr1在客户端内重建包。
我仍然认为我应该发布此信息,因为它可能对其他人有用。

问题

当我在 Wheezy 客户机内安装libapache2-mod-php5并且它尝试启动时,我收到以下信息:

root@test01:~# /usr/sbin/apache2ctl start
[crit] (22)Invalid argument: alloc_listener: failed to get a socket for (null)
Syntax error on line 9 of /etc/apache2/ports.conf:
Listen setup failed
Action 'start' failed.
The Apache error log may have more information.
root@test01:~# tail /var/log/apache2/error.log
root@test01:~#
root@test01:~# head -n 9 /etc/apache2/ports.conf|tail -n 1
Listen 80

这是未更改的原始包安装,默认情况下无法启动。

我的测试

根据官方文件,听 80 其实就好了将其变成Listen 127.0.0.1:80

[crit] (22)Invalid argument: alloc_listener: failed to get a socket for 127.0.0.1
Syntax error on line 9 of /etc/apache2/ports.conf:
Listen setup failed
Action 'start' failed.

那么为什么 Apache 无法获取套接字?我运行了其他守护进程(即其他 Wheezy 安装上的 nginx;同一安装上监听端口 25 的 exim4),没有问题。

环境

主持人

Debian Lenny 2.6.26-2-vserver-amd64

# vserver-info
Versions:
                   Kernel: 2.6.26-2-vserver-amd64
                   VS-API: 0x00020303
             util-vserver: 0.30.216-pre2772; Dec 13 2008, 04:56:19

Features:
                       CC: gcc, gcc (Debian 4.3.2-1) 4.3.2
                      CXX: g++, g++ (Debian 4.3.2-1) 4.3.2
                 CPPFLAGS: ''
                   CFLAGS: '-Wall -g  -O2 -std=c99 -Wall -pedantic -W -funit-at-a-time'
                 CXXFLAGS: '-g -O2 -ansi -Wall -pedantic -W -fmessage-length=0 -funit-at-a-time'
               build/host: x86_64-pc-linux-gnu/x86_64-pc-linux-gnu
             Use dietlibc: yes
       Build C++ programs: yes
       Build C99 programs: yes
           Available APIs: v13,net,v21,v22,v23,netv2
            ext2fs Source: e2fsprogs
    syscall(2) invocation: alternative
      vserver(2) syscall#: 236/glibc
               crypto api: beecrypt
   use library versioning: yes

Paths:
                   prefix: /usr
        sysconf-Directory: /etc
            cfg-Directory: /etc/vservers
         initrd-Directory: $(sysconfdir)/init.d
       pkgstate-Directory: /var/run/vservers
          vserver-Rootdir: /var/lib/vservers


Assumed 'SYSINFO' as no other option given; try '--help' for more information.

客人

Debian Wheezy,采用vserver $VSERVER build -m debootstrap --hostname $VSERVER --netdev eth0 --context $CONTEXT --interface v$CONTEXT=x.y.z.$CONTEXT/zz -- -d wheezy -m http://apt-proxy:9999/debian/

迄今为止的研究

到目前为止,互联网为我提供了以下内容:

我最担心的是,这也是我目前的结论,虚拟服务器中的 apache 依赖于我的主机不提供的某些较新的内核功能。毕竟,Wheezy 默认内核肯定不如我的 2.6.26 那么旧。

我想不惜一切代价避免升级主机内核。

为什么?

  • 缺乏时间和知识(硬件是 HP 服务器,不知道要注意什么)
  • Wheezy 不再支持 vserver(开箱即用;有关自行安装,请参阅 1)...)
  • 已运行需要全天候可用的虚拟服务器(整个系统是公司内部的,不暴露在互联网上)
  • 无需第二个相同的硬件来执行测试

我愿意修补 Apache

如果可以找出问题所在,我愿意为我的 Wheezy 任务构建一个自定义 deb 包。

答案1

解决方案

正如我在第一句话中所说,我已经找到了解决方案:libapr1在客人里面重建了包裹

我找到了解决方案谷歌搜索“无效参数:alloc_listener:无法获取(null)的套接字”,第 5 次命中是无效的参数废话其中提到了内核升级,并提到了另一个博主谈论 Fedora 11 httpd问题:

该问题与 apr-1.3.8-1 中使用的三个内核调用有关:accept4()、dup3() 和 epoll_create1()。如果没有这些调用,apache 就无法启动。

他提到 Fedora 团队已修复该问题,因此我查看了错误报告:https://bugzilla.redhat.com/show_bug.cgi?id=516331, 具体来说第二条评论

..如果您在该 Xen 实例上构建自己的 APR,它将正确拾取较旧的功能并运行..

这提醒了我。我所要做的就是重建包,libapr1因为 configure 脚本会自动找出accept4不可用的包,并将恢复为accept。我就是这样做的:

  • apt-get source libapr1
  • tar -xf apr_1.4.6.orig.tar.gz
  • cd apr-1.4.6
  • tar -xf ../apr_1.4.6-3.debian.tar.gz
  • dpkg-buildpackage
    由于缺少依赖项,此操作最初失败:apt-get install debhelper autoconf autotools-dev uuid-dev doxygen libtool
  • 过了一段时间后,在我安装的目录之外产生了一个 debian 包:
    dpkg -i libapr1_1.4.6-3_amd64.deb
  • 然后我启动了 apache,它就工作了!
    /etc/init.d/apache2 start

在磁盘空间不足的系统上,您可能希望在编译后删除 doxygen:在我的系统上,它及其依赖项需要超过 600MB 的空间。

相关内容