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
これは変更されていない初期のパッケージインストールで、デフォルトでは起動できません。
公式ドキュメントによると、 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はソケットを取得できないのでしょうか?私は他のデーモン(つまり、他のWheezyインストールのnginx、同じインストールのポート25でリッスンしているexim4)を問題なく実行しています。
2.6.26-2-vserver-AMD64上のDebian Lenny
# 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.
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/
で構築されたDebian Wheezy
これまでのところ、インターネットによって次のことが実現されました。
私の最大の恐れは、これが私の現在の結論です。仮想サーバー内のApacheは、ホストが提供していない新しいカーネル機能に依存しているということです。結局のところ、Wheezyのデフォルトカーネルは、私の2.6.26ほど古いものではありません。
ホストカーネルのアップグレードは絶対に避けたいです
どうして?
Apacheにパッチを適用します
問題が何であるかを理解できる場合は、Wheezyクエスト用のカスタムdebパッケージをビルドしようとしています。
最初の文で述べたように、私はすでに解決策を見つけました:ゲスト内のlibapr1
パッケージを再構築しました。
私は 「無効な引数:alloc_listener:(null)のソケットを取得できませんでした」のグーグル によって解決策を見つけました、5番目のヒットは 無効な引数のがらくた カーネルのアップグレードについて言及していますそして別の Fedora 11 httpdについて話しているブロガー 問題を参照します:
この問題は、apr-1.3.8-1で使用されている3つのカーネルコール、accept4()、dup3()、epoll_create1()に関連しています。これらの呼び出しがないと、Apacheは起動できません。
彼はFedoraチームが修正されたと言っているので、バグレポートをチェックアウトしました: https://bugzilla.redhat.com/show_bug.cgi?id=516331 、具体的には 2番目のコメント :
..その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
dpkg -i libapr1_1.4.6-3_AMD64.deb
/etc/init.d/Apache2 start
ディスク不足のシステムでは、コンパイル後にdoxygenを削除することができます。私のシステムでは、依存関係とともに600MB以上が必要でした。