mar*_*ark 8 debian socket linux-vserver apache-2.2
在广泛的研究和测试中,写了一个值得 stackexchange 的正确问题,我找到了一个解决方案:libapr1
在来宾内部重建包。
我想我还是会发布这些信息,因为它可能对其他人有用。
当我libapache2-mod-php5
在 Wheezy 来宾中安装并尝试启动时,我得到以下信息:
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
Run Code Online (Sandbox Code Playgroud)
这是未更改的原始软件包安装,默认情况下无法启动。
根据官方文档,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.
Run Code Online (Sandbox Code Playgroud)
那么为什么 Apache 无法获得套接字呢?我有其他守护进程运行(即 nginx 在其他 Wheezy 安装上;exim4 在同一安装上监听端口 25)没有问题。
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.
Run Code Online (Sandbox Code Playgroud)
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 旧。
我想不惜一切代价避免升级主机内核。
为什么?
我愿意修补 Apache
如果有可能找出问题所在,我愿意为我的 Wheezy 任务构建一个自定义的 deb 包。
mar*_*ark 16
正如我在第一句话中所说,我已经找到了解决方案:我libapr1
在 guest 中重建了包。
我通过搜索 "Invalid argument: alloc_listener: failed to get a socket for (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
包,因为配置脚本会自动找出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
dpkg -i libapr1_1.4.6-3_amd64.deb
/etc/init.d/apache2 start
在磁盘不足的系统上,您可能希望在编译后删除 doxygen:在我的系统上,它需要超过 600MB 及其依赖项。