Apache22 no FreeBSD - Inicia, não responde a pedidos

1

Estou executando o Apache 2.2.17 com o MPM do peruser no FreeBSD 8.2-RC1 no EC2 da Amazon (assim é o XEN). Foi instalado a partir de portas.

Meu problema é que, embora o Apache esteja em execução, escutando e aceitando conexões, ele não responde a nenhum deles ou os exibe no log.

Se eu fizer telnet para a porta que ele está ouvindo e digite uma solicitação HTTP:

GET / HTTP/1.1
Host: asdfasdf

E aperte enter algumas vezes, apenas fica lá ... Nada. Nenhuma resposta solicitando com um navegador também. Parece não haver nada de útil no log de erros:

[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 

O registro de acesso fica vazio:

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

Eu tentei com accf_http e accf_data ativados e desativados e com a configuração de estoque e minha configuração personalizada. Eu também tentei desinstalar apache22-peruser-mpm e apenas instalar o apache22 direto ... Ainda sem sorte. Eu tentei remover todas as linhas LoadModule do httpd.conf e apenas reativei as que eram necessárias para analisar a configuração. Terminou com apenas o seguinte carregado:

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#

Mesmos resultados.

Apache é definitivamente o que está ouvindo na porta 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#

E sei que não é um problema de firewall, pois não há nada sendo executado localmente e a conexão da caixa local para 127.0.0.1:80 resulta no mesmo problema.

Alguém tem alguma ideia do que está acontecendo? Por que isso seria feito? Eu exausto toda a minha experiência em depuração. : /

Obrigado por qualquer sugestão!

EDITAR : De acordo com a sugestão de Phil Hollenback, executei um rastreamento nas chamadas do sistema. Isso é o que eu encontrei através do ktrace e da treliça.

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)

Mesma coisa repetida várias vezes. (Essas são as últimas linhas.) O que parece estar acontecendo é que ele está correndo para o select, trava um momento, retorna 0 e tenta novamente. Eu não sei se isso é um comportamento normal, mas parece que tudo bem para mim, já que parece que está apenas pesquisando o socket?

O que mais me preocupa é a espera que retorna um erro de que o processo não existe. A saída da treliça (com a qual iniciei o processo, obtendo a configuração inicial) mostra uma chamada para fork () que parece retornar bem (retorna um PID, sem erro).

Caso isso ajude, a saída da treliça: link (atualizada para httpd -X .)

Eu realmente me conectei durante essa execução - select nunca parece retornar uma nova conexão? Além disso, eu transformei o LogLevel em Debug na configuração do Apache e tentei executá-lo novamente - ele nunca registra qualquer conexão.

Eu acho que isso é talvez mais um problema do FreeBSD do que o Apache, então, parece que o Apache nunca recebe o pedido. : /

Quaisquer (mais) ideias?

EDIT 2 : Este parece ser um problema com algo no FreeBSD, dado que o Apache nunca parece receber o pedido de conexão. Eu fiz um post nos fóruns do FreeBSD (forums.freebsd.org/showthread.php?p=118612) para ver se consigo encontrar alguma ajuda lá. Obrigado pessoal pelo seu tempo!

    
por NuclearDog 10.01.2011 / 00:23

1 resposta

1

Tente o seguinte:

  1. pstree | less para encontrar o pid do processo mestre do apache
  2. strace -p <pid> -f para assistir às chamadas do sistema da etapa 1 do formulário de processo.
  3. conecte-se ao apache com o telnet ou com um navegador da web.

Você pode precisar instalar o pstree e o strace nas portas do freebsd. Você deve ver a saída de rolagem do strace enquanto ele registra as chamadas do sistema (arquivo aberto, etc.) geradas pelo processo em execução do apache. Isso deve lhe dar alguma pista sobre se o apache está realmente em execução e não está produzindo a saída por algum motivo.

Esta página sobre depuração do apache contém as informações acima, bem como outras dicas de solução de problemas que você pode usar.

Além disso, você menciona o seu log de acesso, mas não o seu log de erros, você já viu isso? Pode haver alguma informação adicional de diagnóstico.

EDIT: Duh, você disse que olhou no log de erros, desculpe. Além disso, sim, treliça é a ferramenta padrão de rastreamento de chamadas freebsd, e não strace. Usar treliça é uma resposta melhor, já que você não precisa compilá-la de portas como strace.

    
por 10.01.2011 / 00:52