Во время обширного исследования и тестирования, чтобы написать правильный вопрос, достойный 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
Это неизменная первоначальная установка пакета, которая по умолчанию не запускается.
Согласно официальной документации, Слушай 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 не смог получить сокет? У меня другие демоны работают (например, 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.
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
Если можно понять, в чем проблема, я хочу создать собственный пакет deb для моих квестов Wheezy.
Как я сказал в первом предложении, я уже нашел решение: Я восстановил libapr1
пакет внутри гостя.
Я нашел решение поиск в Google по запросу «Недействительный аргумент: alloc_listener: не удалось получить сокет для (null)», пятый хит был Неверный аргумент хрень который упоминает обновление ядра и относится к другому блоггер говорит о Fedora 11 httpd проблемы:
Проблема связана с тремя вызовами ядра, которые используются в apr-1.3.8-1: accept4 (), dup3 () и epoll_create1 (). Без этих вызовов apache не может запуститься.
Он упоминает исправление команды Fedora, поэтому я проверил отчет об ошибке: https://bugzilla.redhat.com/show_bug.cgi?id=516331в частности второй комментарий:
.. если вы создадите свой собственный APR на этом экземпляре Xen, он правильно подберет старые функции и будет работать ..
Это позвонило в колокол. Все, что мне нужно было сделать, это перестроить 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 после компиляции: в моей системе ему требовалось более 600 МБ вместе с его зависимостями.