Назад | Перейти на главную страницу

Apache22 на FreeBSD - запускается, не отвечает на запросы

Я запускаю Apache 2.2.17 с Peruser MPM на FreeBSD 8.2-RC1 на Amazon EC2 (так что это XEN). Устанавливался из портов.

Моя проблема в том, что, хотя Apache работает, прослушивает и принимает соединения, он на самом деле не отвечает ни на какие и не показывает их в журнале.

Если я подключусь к порту, который он прослушивает, и наберу HTTP-запрос:

GET / HTTP/1.1
Host: asdfasdf

И пару раз нажмите Enter, он просто сидит ... Ничего. От браузера тоже нет запроса ответа. В журнале ошибок нет ничего полезного:

[Sun Jan 09 16:56:24 2011] [warn] Init: Session Cache is not configured [hint: SSLSessionCache]
[Sun Jan 09 16:56:25 2011] [notice] Digest: generating secret for digest authentication ...
[Sun Jan 09 16:56:25 2011] [notice] Digest: done
[Sun Jan 09 16:56:25 2011] [notice] Apache/2.2.17 (FreeBSD) mod_ssl/2.2.17 

Журнал доступа остается пустым:

root:/var/log# wc httpd-access.log 
       0       0       0 httpd-access.log
root:/var/log#

Я пробовал включать и отключать accf_http и accf_data, а также использовать как стандартную конфигурацию, так и мою индивидуальную конфигурацию. Я также попытался удалить apache22-peruser-mpm и просто установить apache22 ... Все равно не повезло. Я попытался удалить все строки LoadModule из httpd.conf и просто снова включил те, которые были необходимы для анализа конфигурации. В итоге загружено только следующее:

root:/usr/local/etc/apache22# /usr/local/sbin/apachectl -M
Loaded Modules:
 core_module (static)
 mpm_peruser_module (static)
 http_module (static)
 so_module (static)
 authz_host_module (shared)
 log_config_module (shared)
 alias_module (shared)
Syntax OK
root:/usr/local/etc/apache22#

Те же результаты.

Apache является определенно, что слушает порт 80:

root:/usr/local/etc/apache22# sockstat -4 | grep httpd
root     httpd      43789 3  tcp4 6 *:80                  *:*
root     httpd      43789 4  tcp4   *:*                   *:*
root:/usr/local/etc/apache22#

И я знаю, что это не проблема брандмауэра, поскольку ничего не работает локально, и подключение из локального компьютера к 127.0.0.1:80 приводит к той же проблеме.

Кто-нибудь знает, что происходит? Зачем это нужно делать? Я исчерпал весь свой опыт отладки. : /

Спасибо за любые предложения!

РЕДАКТИРОВАТЬ: В соответствии с предложением Фила Холленбека я провел трассировку системных вызовов. Это то, что я нашел через ktrace и truss.

48443 httpd    CALL  select(0,0,0,0,0xbf7feab4)
48443 httpd    RET   select 0
48443 httpd    CALL  gettimeofday(0xbf7feae4,0)
48443 httpd    RET   gettimeofday 0
48443 httpd    CALL  wait4(0xffffffff,0xbf7fea98,WNOHANG|WUNTRACED,0)
48443 httpd    RET   wait4 -1 errno 10 No child processes
48443 httpd    CALL  select(0,0,0,0,0xbf7feab4)
48443 httpd    RET   select 0
48443 httpd    CALL  gettimeofday(0xbf7feae4,0)
48443 httpd    RET   gettimeofday 0
48443 httpd    CALL  wait4(0xffffffff,0xbf7fea98,WNOHANG|WUNTRACED,0)
48443 httpd    RET   wait4 -1 errno 10 No child processes
48443 httpd    CALL  select(0,0,0,0,0xbf7feab4)

Одно и то же повторяется снова и снова. (Это последние несколько строк.) Похоже, что происходит переход к select, зависает на мгновение, возвращает 0, а затем пытается снова. Я не знаю, нормальное ли это поведение, но мне это кажется нормальным, поскольку звучит так, будто это просто опрос сокета?

Что меня беспокоит, так это то, что ожидание возвращает ошибку, что процесс не существует. Вывод truss (с которого я начал процесс, получив начальную настройку) показывает вызов fork (), который, кажется, возвращает нормально (возвращает PID, без ошибок).

В случае, если это поможет, выход фермы: http://nucleardog.com/apache-truss.txt (Обновлено для httpd -X.)

Я действительно подключился во время этого запуска - кажется, что select никогда не возвращает новое соединение? Кроме того, я включил LogLevel до Debug в конфигурации Apache и попытался запустить снова - он никогда не регистрирует никаких подключений.

Я думаю, что это, возможно, больше проблема FreeBSD, чем Apache, поскольку кажется, что Apache никогда не получает запрос. : /

Есть (еще) идеи?

РЕДАКТИРОВАТЬ 2: Похоже, это проблема с чем-то во FreeBSD, учитывая, что Apache никогда не получает запрос на соединение. Я написал сообщение на форумах FreeBSD (forum.freebsd.org/showthread.php?p=118612), чтобы узнать, смогу ли я там найти какую-нибудь помощь. Спасибо за уделенное время!

Попробуйте следующее:

  1. pstree | less найти главный pid процесса apache
  2. strace -p <pid> -f для просмотра системных вызовов из шага 1 формы процесса.
  3. подключитесь к apache с помощью telnet или веб-браузера.

Возможно, вам потребуется установить pstree и strace из портов freebsd. Вы должны увидеть прокручиваемый вывод strace, когда он регистрирует системные вызовы (открытие файла и т. Д.), Генерируемые запущенным процессом apache. Это должно дать вам некоторое представление о том, действительно ли apache работает и по какой-то причине просто не производит вывод.

Эта страница о отладка apache содержит вышеуказанную информацию, а также другие советы по устранению неполадок, которые вы можете использовать.

Также вы упоминаете свой журнал доступа, но не журнал ошибок, вы смотрели на него? Там может быть дополнительная диагностическая информация.

EDIT: Да, вы сказали, что просмотрели журнал ошибок, извините. Также да, truss - это инструмент отслеживания вызовов freebsd по умолчанию, а не strace. Использование truss - лучший ответ, поскольку вам не нужно компилировать его из таких портов, как strace.