Apache в linux-vserver не запускается, не может создать сокет

8

Во время обширных исследований и тестирования, чтобы написать правильный вопрос, достойный 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

Это неизменная установка пакета, которая по умолчанию не запускается.

Мое тестирование

Согласно официальной документации, 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 не получить сокет? У меня работают другие демоны (например, 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.

Я хочу избежать обновления ядра хоста любой ценой.

Почему?

  • Недостаток времени и знаний (аппаратное обеспечение - это сервер HP, не знаю, на что обратить внимание)
  • Wheezy больше не поддерживает vserver (из коробки; для самостоятельной установки см. 1) ...)
  • Уже запущенные серверы, которые должны быть доступны 24/7 (вся система находится внутри компании и не доступна в Интернете)
  • Нет второго такого же оборудования для тестирования

Я готов патчить Apache

Если возможно выяснить, в чем проблема, я собираюсь создать собственный пакет deb для моих квестов Wheezy.

отметка
источник

Ответы:

16

Решение

Как я сказал в первом предложении, я уже нашел решение: я перестроил libapr1пакет внутри гостя .

Я нашел решение путем поиска в Google для «Неверный аргумент: alloc_listener: не удалось получить сокет для (null)» , 5-й хит был « Неверный аргумент дерьмо», который упоминает обновление ядра и ссылается на другого блоггера, говорящего о проблемах с httpd в Fedora 11 :

Проблема связана с тремя вызовами ядра, которые используются в apr-1.3.8-1: accept4 (), dup3 () и epoll_create1 (). Без этих вызовов apache не может запуститься.

Он упоминает исправленную команду Fedora, поэтому я проверил отчет об ошибке: https://bugzilla.redhat.com/show_bug.cgi?id=516331 , в частности, второй комментарий :

... если вы создадите свой собственный APR на этом экземпляре Xen, он правильно подберет старые функции и будет работать ..

Это звенело в колокол. Все, что мне нужно было сделать, это перестроить 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 после компиляции: в моей системе требовалось более 600 МБ вместе с зависимостями.

отметка
источник
+1 Спасибо, очень полезно, и это также решило мою проблему на serverfault.com/questions/506238/… Вы должны пометить свой ответ как принятый.
Aseq
нет такого пакета
Flash Thunder