Я запускаю 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), чтобы узнать, смогу ли я там найти какую-нибудь помощь. Спасибо за уделенное время!
Попробуйте следующее:
pstree | less
найти главный pid процесса apachestrace -p <pid> -f
для просмотра системных вызовов из шага 1 формы процесса.Возможно, вам потребуется установить pstree и strace из портов freebsd. Вы должны увидеть прокручиваемый вывод strace, когда он регистрирует системные вызовы (открытие файла и т. Д.), Генерируемые запущенным процессом apache. Это должно дать вам некоторое представление о том, действительно ли apache работает и по какой-то причине просто не производит вывод.
Эта страница о отладка apache содержит вышеуказанную информацию, а также другие советы по устранению неполадок, которые вы можете использовать.
Также вы упоминаете свой журнал доступа, но не журнал ошибок, вы смотрели на него? Там может быть дополнительная диагностическая информация.
EDIT: Да, вы сказали, что просмотрели журнал ошибок, извините. Также да, truss - это инструмент отслеживания вызовов freebsd по умолчанию, а не strace. Использование truss - лучший ответ, поскольку вам не нужно компилировать его из таких портов, как strace.