linux-vserver中的Apache不会启动,无法创build套接字

在广泛的研究和testing中写出一个值得libapr1的适当的问题时,我发现了一个解决scheme:在guest libapr1重buildlibapr1包。
我以为我会发布这些信息,因为这对其他人可能有用。

问题

当我在Wheezy guest中安装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 

这是不变的原始软件包安装,默认情况下不能启动。

我的testing

根据官方文件, Listen 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不能得到一个套接字呢? 我有其他的deamons运行(即在其他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=xyz$CONTEXT/zz -- -d wheezy -m http://apt-proxy:9999/debian/

迄今为止的研究

到目前为止,互联网向我提供了以下几点:

  • 通过升级APR修复fedorra问题
  • 通过升级包修复的问题
  • 内核不兼容
  • 另一个解决scheme需要内核升级

我最大的恐惧,这是我目前的结论,是虚拟服务器内的apache取决于我的主机不提供的一些新的内核function。 毕竟,Wheezy默认的内核肯定不会像我的2.6.26那么老。

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

为什么?

  • 缺乏时间和知识(硬件是惠普服务器,不知道要注意什么)
  • Wheezy不再支持vserver(开箱即用,自我安装见1)…)
  • 已经运行了需要24/7可用的虚拟服务器(整个系统是公司内部的,而不是暴露在互联网上)
  • 没有第二个相同的硬件来执行testing

我愿意修补Apache

如果有可能弄清楚问题是什么,我很想为我的Wheezy任务构build一个定制的deb包。

正如我在第一句中所说的,我已经find了解决scheme: 我在guest libapr1重build了libapr1

我发现这个解决scheme的search结果是“Invalid argument:alloc_listener:failed to get a socket for(null)” ,第五个是Invalid argument crap ,它提到了内核升级,并提到另外一个博客讨论Fedora 11的httpd问题:

这个问题涉及到apr-1.3.8-1中使用的三个内核调用:accept4(),dup3()和epoll_create1()。 没有这些调用,Apache无法启动。

他提到Fedora团队已经修复,所以我查看了这个bug报告: https : //bugzilla.redhat.com/show_bug.cgi?id=516331 ,特别是第二条评论 :

..如果你在这个Xen实例上build立你自己的APR,它会正确地拿起旧的function并工作。

那钟声响了起来。 我所要做的只是重buildlibapr1包,因为configuration脚本会自动发现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
    这个失败起初是因为缺less依赖: 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以上的依赖。